hermex 2.0.0-beta.8 ā 2.0.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.
- package/dist/cli.mjs +169 -68
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +20 -2
- package/dist/index.mjs +13 -1
- package/package.json +1 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["printHeader","printHeader","printHeader","printHeader","fs","path","path","fs","path","fs","path","fs","path","fs"],"sources":["../src/utils/format-utils.ts","../src/utils/print-summary.ts","../src/utils/print-details.ts","../src/utils/chart-renderer.ts","../src/utils/print-components.ts","../src/utils/print-patterns.ts","../src/utils/print-packages.ts","../src/utils/print-versus.ts","../src/utils/print-rules.ts","../src/utils/version.ts","../src/utils/print-json.ts","../src/config/schema.ts","../src/config/loader.ts","../src/swc-parser/core/state.ts","../src/swc-parser/patterns/imports.ts","../src/swc-parser/utils/jsx-helpers.ts","../src/swc-parser/patterns/props.ts","../src/swc-parser/patterns/jsx.ts","../src/swc-parser/utils/matchers.ts","../src/swc-parser/patterns/variables.ts","../src/swc-parser/patterns/conditionals.ts","../src/swc-parser/patterns/collections.ts","../src/swc-parser/patterns/lazy-dynamic.ts","../src/swc-parser/patterns/advanced.ts","../src/swc-parser/core/visitor.ts","../src/swc-parser/core/report.ts","../src/swc-parser/index.ts","../src/utils/package-distribution.ts","../src/rules/shared.ts","../src/rules/file-rules.ts","../src/rules/script-rules.ts","../src/rules/package-field-rules.ts","../src/rules/engine-version.ts","../src/rules/codeowners.ts","../src/rules/evaluator.ts","../src/utils/package-rules.ts","../src/utils/pattern-counter.ts","../src/utils/versus.ts","../src/utils/aggregator-core.ts","../src/utils/print-errors.ts","../src/utils/file-utils.ts","../src/lock-parser/patterns/npm.ts","../src/lock-parser/patterns/pnpm.ts","../src/lock-parser/patterns/yarn.ts","../src/lock-parser/index.ts","../src/npm-registry/client.ts","../src/npm-registry/cache.ts","../src/npm-registry/enricher.ts","../src/commands/pipeline.ts","../src/commands/command-context.ts","../src/commands/scan.ts","../src/utils/print-compliance.ts","../src/utils/compliance.ts","../src/commands/comply.ts","../src/cli.ts"],"sourcesContent":["/**\n * Format a number with thousand separators\n * @param num - Number to format\n * @returns Formatted string (e.g., 1,234,567)\n */\nexport function formatCount(num: number): string {\n return num.toLocaleString();\n}\n\n/**\n * Format duration in seconds to a readable string\n * @param seconds - Duration in seconds\n * @returns Formatted string (e.g., 10.21s, 1.57s, 0.12s)\n */\nexport function formatDuration(seconds: number): string {\n return `${seconds.toFixed(2)}s`;\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport } from './aggregator';\nimport { formatCount } from './format-utils';\n\nfunction printHeader() {\n console.log(chalk.green.bold('\\nš Summary\\n'));\n}\n\nexport function printSummary(aggregated: AggregatedReport) {\n printHeader();\n\n const table = new Table({\n head: ['Metric', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n // Calculate external components only (filter out unknown and local)\n const externalComponents = aggregated.topComponents.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n ).length;\n\n // Calculate total external package usage\n const totalExternalUsage = aggregated.packageDistribution.reduce(\n (sum, pkg) => sum + pkg.usageCount,\n 0,\n );\n\n table.push(\n ['Files Analyzed', formatCount(aggregated.filesAnalyzed)],\n ['External Packages', formatCount(aggregated.packageDistribution.length)],\n ['External Components', formatCount(externalComponents)],\n ['Total Usages', formatCount(totalExternalUsage)],\n );\n\n console.log(table.toString());\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport } from './aggregator';\nimport { formatCount } from './format-utils';\n\nfunction printHeader() {\n console.log(chalk.cyan.bold('\\nš Details\\n'));\n}\n\nexport function printDetails(aggregated: AggregatedReport) {\n printHeader();\n\n console.log(\n chalk.cyan(\n ` Total usage patterns: ${formatCount(aggregated.totalUsagePatterns)}`,\n ),\n );\n\n // Print each pattern type count\n for (const pattern of aggregated.patternCounts) {\n if (pattern.count > 0) {\n console.log(\n chalk.cyan(` ${pattern.displayName}: ${formatCount(pattern.count)}`),\n );\n }\n }\n}\n","import chalk from 'chalk';\nimport { formatCount } from './format-utils';\n\nexport interface ChartData {\n label: string;\n value: number;\n}\n\nexport interface ChartOptions {\n maxWidth?: number;\n showValues?: boolean;\n barChar?: string;\n emptyChar?: string;\n}\n\nexport function renderBarChart(data: ChartData[], options: ChartOptions = {}) {\n const {\n maxWidth = 50,\n showValues = true,\n barChar = 'ā',\n emptyChar = 'ā',\n } = options;\n\n if (data.length === 0) {\n console.log(chalk.gray(' No data to display'));\n return;\n }\n\n // Find max value for scaling\n const maxValue = Math.max(...data.map((d) => d.value));\n if (maxValue === 0) {\n console.log(chalk.gray(' All values are zero'));\n return;\n }\n\n // Find longest label for alignment\n const maxLabelLength = Math.max(...data.map((d) => d.label.length));\n\n // Render each bar\n for (const item of data) {\n const percentage = item.value / maxValue;\n const barLength = Math.round(percentage * maxWidth);\n const emptyLength = maxWidth - barLength;\n\n // Pad label\n const paddedLabel = item.label.padEnd(maxLabelLength, ' ');\n\n // Build bar\n const bar =\n chalk.green(barChar.repeat(barLength)) +\n chalk.gray(emptyChar.repeat(emptyLength));\n\n // Build value string\n const valueStr = showValues ? ` ${formatCount(item.value)}` : '';\n\n console.log(`${paddedLabel} ${bar}${valueStr}\\n`);\n }\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport, ComponentUsage } from './aggregator';\nimport { renderBarChart } from './chart-renderer';\n\nfunction printHeader() {\n console.log(chalk.magenta.bold('\\nāļø Components\\n'));\n}\n\nexport function printComponents(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const components = aggregated.topComponents;\n\n if (mode === 'table') {\n printComponentsTable(components);\n } else if (mode === 'chart') {\n printComponentsChart(components);\n }\n}\n\nfunction printComponentsTable(components: ComponentUsage[]) {\n printHeader();\n\n // Filter out unknown and local components - only show external packages\n const externalComponents = components.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n );\n\n if (externalComponents.length === 0) {\n console.log(chalk.gray(' No external components found'));\n return;\n }\n\n const table = new Table({\n head: ['Component', 'Package', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n externalComponents.forEach((comp) => {\n table.push([comp.name, comp.source, comp.count.toString()]);\n });\n\n console.log(table.toString());\n}\n\nfunction printComponentsChart(components: ComponentUsage[]) {\n printHeader();\n\n // Filter out unknown and local components - only show external packages\n const externalComponents = components.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n );\n\n if (externalComponents.length === 0) {\n console.log(chalk.gray(' No external components found'));\n return;\n }\n\n const data = externalComponents.map((comp) => ({\n label: comp.name,\n value: comp.count,\n }));\n\n renderBarChart(data, { maxWidth: 50 });\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport, PatternCount } from './aggregator';\nimport { renderBarChart } from './chart-renderer';\n\nfunction printHeader() {\n console.log(chalk.blue.bold('\\nš Code Patterns\\n'));\n}\n\nexport function printPatterns(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const patterns = aggregated.patternCounts.filter((p) => p.count > 0);\n\n if (mode === 'table') {\n printPatternsTable(patterns);\n } else if (mode === 'chart') {\n printPatternsChart(patterns);\n }\n}\n\nfunction printPatternsTable(patterns: PatternCount[]) {\n printHeader();\n\n if (patterns.length === 0) {\n console.log(chalk.gray(' No patterns found'));\n return;\n }\n\n const table = new Table({\n head: ['Pattern', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n patterns.forEach((pattern) => {\n table.push([pattern.displayName, pattern.count.toString()]);\n });\n\n console.log(table.toString());\n\n // Show total patterns count\n const totalPatterns = patterns.reduce((sum, p) => sum + p.count, 0);\n console.log(chalk.gray(`\\nTotal: ${totalPatterns} patterns detected`));\n}\n\nfunction printPatternsChart(patterns: PatternCount[]) {\n printHeader();\n\n if (patterns.length === 0) {\n console.log(chalk.gray(' No patterns found'));\n return;\n }\n\n const data = patterns.map((pattern) => ({\n label: pattern.displayName,\n value: pattern.count,\n }));\n\n renderBarChart(data, { maxWidth: 50 });\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type {\n AggregatedReport,\n BannedPackageViolation,\n PackageDistribution,\n} from './aggregator';\nimport type { ReleaseAgeEntry } from '../npm-registry/types';\nimport { formatCount } from './format-utils';\n\nfunction printHeader() {\n console.log(chalk.blueBright.bold('\\nš¦ Packages\\n'));\n}\n\nfunction formatPackageName(\n pkg: PackageDistribution,\n banned?: BannedPackageViolation,\n): string {\n let prefix = '';\n if (pkg.releaseAge?.deprecated) {\n prefix += chalk.red('[DEPRECATED] ');\n }\n if (banned) {\n prefix +=\n banned.severity === 'error'\n ? chalk.red('[BANNED] ')\n : chalk.yellow('[RESTRICTED] ');\n } else if (pkg.internal) {\n prefix += chalk.yellow('[int] ');\n }\n return prefix + pkg.packageName;\n}\n\nfunction formatUpgradeCell(releaseAge?: ReleaseAgeEntry): string {\n if (!releaseAge) return '';\n const { worstLevel, upgrades, severity } = releaseAge;\n if (!worstLevel) return chalk.green('ā');\n\n const top = upgrades[0];\n if (!top) return chalk.green('ā');\n\n const suffix = severity === 'warn' ? chalk.gray(' [not enforced]') : '';\n\n if (worstLevel === 'mandatory_upgrade') {\n const color = severity === 'warn' ? chalk.yellow : chalk.red;\n return (\n color(`ā ${top.semverBump} ${top.version} (${top.releasedDaysAgo}d)`) +\n suffix\n );\n }\n return (\n chalk.yellow(\n `ā ${top.semverBump} ${top.version} (${top.releasedDaysAgo}d)`,\n ) + suffix\n );\n}\n\nfunction getBannedViolation(\n pkg: PackageDistribution,\n violations: BannedPackageViolation[],\n): BannedPackageViolation | undefined {\n return violations.find((v) => v.packageName === pkg.packageName);\n}\n\nexport function printPackages(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const packages = aggregated.packageDistribution;\n const violations = aggregated.bannedPackageViolations;\n\n if (mode === 'table') {\n printPackagesTable(packages, violations);\n } else if (mode === 'chart') {\n printPackagesChart(packages, violations);\n }\n}\n\nfunction printPackagesTable(\n packages: PackageDistribution[],\n violations: BannedPackageViolation[],\n) {\n printHeader();\n\n if (packages.length === 0) {\n console.log(chalk.gray(' No packages found'));\n return;\n }\n\n const hasReleaseAge = packages.some((p) => p.releaseAge !== undefined);\n const head = ['Package', 'Version', 'Components', 'Usage', 'Percentage'];\n if (hasReleaseAge) head.push('Upgrades');\n\n const table = new Table({\n head,\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n packages.forEach((pkg) => {\n const versionCell = pkg.hasVersionConflict\n ? chalk.yellow(\n `ā ${pkg.allVersions.join(', ')} (${pkg.allVersions.length} versions ā bundle impact)`,\n )\n : pkg.version || 'N/A';\n\n const row = [\n formatPackageName(pkg, getBannedViolation(pkg, violations)),\n versionCell,\n formatCount(pkg.componentCount),\n formatCount(pkg.usageCount),\n `${pkg.percentage.toFixed(1)}%`,\n ];\n if (hasReleaseAge) row.push(formatUpgradeCell(pkg.releaseAge));\n table.push(row);\n });\n\n console.log(table.toString());\n\n const totalComponents = packages.reduce(\n (sum, p) => sum + p.componentCount,\n 0,\n );\n const totalExternalUsage = packages.reduce((sum, p) => sum + p.usageCount, 0);\n console.log(\n chalk.gray(\n `\\nTotal: ${formatCount(packages.length)} packages | ${formatCount(totalComponents)} unique components | ${formatCount(totalExternalUsage)} total usages`,\n ),\n );\n}\n\nfunction printPackagesChart(\n packages: PackageDistribution[],\n violations: BannedPackageViolation[],\n) {\n printHeader();\n\n if (packages.length === 0) {\n console.log(chalk.gray(' No packages found'));\n return;\n }\n\n const maxBarWidth = 40;\n const maxPercentage = Math.max(...packages.map((p) => p.percentage));\n const maxLabelLength = Math.max(\n ...packages.map((p) => p.packageName.length + (p.internal ? 6 : 0)),\n );\n\n packages.forEach((pkg) => {\n const barLength = Math.round(\n (pkg.percentage / maxPercentage) * maxBarWidth,\n );\n const emptyLength = maxBarWidth - barLength;\n const label = formatPackageName(\n pkg,\n getBannedViolation(pkg, violations),\n ).padEnd(maxLabelLength, ' ');\n\n const bar =\n chalk.green('ā'.repeat(barLength)) + chalk.gray('ā'.repeat(emptyLength));\n\n console.log(\n `${label} ${bar} ${chalk.bold(pkg.percentage.toFixed(1) + '%')} (${pkg.usageCount})`,\n );\n });\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport, VersusResult } from './aggregator';\n\nconst BAR_WIDTH = 30;\n\nfunction renderBar(percentage: number): string {\n const filled = Math.round((percentage / 100) * BAR_WIDTH);\n const empty = BAR_WIDTH - filled;\n return chalk.cyan('ā'.repeat(filled)) + chalk.gray('ā'.repeat(empty));\n}\n\nfunction formatComponents(components: string[], max = 3): string {\n if (components.length === 0) return '';\n const shown = components.slice(0, max);\n const rest = components.length - max;\n const list = shown.join(', ');\n return rest > 0 ? `${list} (+${rest} more)` : list;\n}\n\nfunction printVersusResult(result: VersusResult) {\n console.log(chalk.bold(` ${result.name}`));\n console.log(chalk.gray(` ${'ā'.repeat(50)}`));\n\n const maxNameLen = Math.max(\n ...result.entries.map((e) => e.packageName.length),\n );\n\n for (const entry of result.entries) {\n const name = entry.packageName.padEnd(maxNameLen);\n const bar = renderBar(entry.percentage);\n const pct = chalk.bold(`${entry.percentage.toFixed(1)}%`);\n const usage = chalk.gray(`(${entry.count} usages)`);\n const components =\n entry.components.length > 0\n ? chalk.gray(` ${formatComponents(entry.components)}`)\n : '';\n\n console.log(` ${name} ${bar} ${pct} ${usage}${components}`);\n }\n\n if (result.totalCount === 0) {\n console.log(\n chalk.gray(' No usage detected for any package in this group.'),\n );\n }\n\n console.log();\n}\n\nexport function printVersus(aggregated: AggregatedReport) {\n if (aggregated.versusResults.length === 0) return;\n\n console.log(chalk.magentaBright.bold('\\nāļø Versus\\n'));\n\n for (const result of aggregated.versusResults) {\n printVersusResult(result);\n }\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport } from './aggregator';\nimport type { RuleViolation } from '../rules/evaluator';\n\nfunction formatRuleType(type: RuleViolation['type']): string {\n switch (type) {\n case 'detect_files':\n return 'detect_files';\n case 'require_files':\n return 'require_files';\n case 'forbid_packages':\n return 'forbid_packages';\n case 'require_packages':\n return 'require_packages';\n case 'require_scripts':\n return 'require_scripts';\n case 'require_package_fields':\n return 'pkg_fields';\n case 'forbid_package_fields':\n return 'pkg_fields';\n case 'engine_version':\n return 'engine_version';\n case 'codeowners':\n return 'codeowners';\n }\n}\n\nfunction ruleIcon(violation: RuleViolation): string {\n if (violation.severity === 'error') return chalk.red('ā');\n if (violation.severity === 'info') return chalk.blue('ā¹');\n return chalk.yellow('ā ');\n}\n\nfunction describeViolation(v: RuleViolation): string {\n const patterns = v.patterns.join(', ');\n const suffix = v.message ? chalk.gray(` ā ${v.message}`) : '';\n\n if (v.type === 'detect_files') {\n const files = v.matchedFiles.map((f) => {\n const parts = f.replace(/\\\\/g, '/').split('/');\n return parts[parts.length - 1];\n });\n return `${patterns} detected (${files.join(', ')})${suffix}`;\n }\n\n if (v.type === 'require_files') return `${patterns} not found${suffix}`;\n if (v.type === 'require_packages')\n return `${patterns} not installed${suffix}`;\n if (v.type === 'forbid_packages') return `${patterns} is forbidden${suffix}`;\n if (v.type === 'require_scripts')\n return `script ${patterns} missing in package.json${suffix}`;\n if (v.type === 'require_package_fields') {\n if (v.fieldPath && v.actualValue !== undefined)\n return `field ${v.fieldPath} is ${chalk.yellow(v.actualValue)}, does not match required value${suffix}`;\n return `field ${patterns} missing in package.json${suffix}`;\n }\n if (v.type === 'forbid_package_fields')\n return `field ${v.fieldPath ?? patterns} is forbidden in package.json${suffix}`;\n\n if (v.type === 'engine_version') {\n if (!v.installedRange)\n return `engines.node not specified (required ${v.requiredRange})${suffix}`;\n return `engines.node is ${chalk.yellow(v.installedRange)}, required ${chalk.cyan(v.requiredRange)}${suffix}`;\n }\n\n if (v.type === 'codeowners') {\n if (v.matchedFiles.length === 0)\n return `CODEOWNERS not found (looked in ${patterns})${suffix}`;\n const shown = v.matchedFiles.slice(0, 3).join(', ');\n const more =\n v.matchedFiles.length > 3 ? ` and ${v.matchedFiles.length - 3} more` : '';\n return `${v.matchedFiles.length} scanned file(s) have no owner: ${shown}${more}${suffix}`;\n }\n\n return `${patterns} not present${suffix}`;\n}\n\nexport function printRules(aggregated: AggregatedReport): void {\n const { ruleViolations, bannedPackageViolations } = aggregated;\n const hasRuleViolations = ruleViolations.length > 0;\n const hasBannedViolations = bannedPackageViolations.length > 0;\n\n if (!hasRuleViolations && !hasBannedViolations) {\n console.log(chalk.greenBright.bold('\\nā Compliance\\n'));\n console.log(chalk.gray(' All compliance checks passed'));\n return;\n }\n\n console.log(chalk.blueBright.bold('\\nš Compliance\\n'));\n\n if (hasRuleViolations) {\n for (const v of ruleViolations) {\n const icon = ruleIcon(v);\n const type = chalk.gray(formatRuleType(v.type).padEnd(14));\n const severityTag =\n v.severity === 'error'\n ? chalk.red('[ERROR]')\n : v.severity === 'info'\n ? chalk.blue('[INFO]')\n : chalk.yellow('[WARN]');\n console.log(` ${icon} ${type} ${describeViolation(v)} ${severityTag}`);\n }\n }\n\n if (hasBannedViolations) {\n if (hasRuleViolations) console.log();\n for (const v of bannedPackageViolations) {\n const icon = v.severity === 'error' ? chalk.red('ā') : chalk.yellow('ā ');\n const tag =\n v.severity === 'error'\n ? chalk.red('[BANNED]')\n : chalk.yellow('[RESTRICTED]');\n const msg = v.message ? chalk.gray(` ā ${v.message}`) : '';\n console.log(` ${icon} ${tag} ${v.packageName}${msg}`);\n }\n }\n\n const errorCount = [\n ...ruleViolations.filter((v) => v.severity === 'error'),\n ...bannedPackageViolations.filter((v) => v.severity === 'error'),\n ].length;\n const warnCount = [\n ...ruleViolations.filter((v) => v.severity === 'warn'),\n ...bannedPackageViolations.filter((v) => v.severity === 'warn'),\n ].length;\n\n const parts: string[] = [];\n if (errorCount > 0)\n parts.push(chalk.red(`${errorCount} error${errorCount > 1 ? 's' : ''}`));\n if (warnCount > 0)\n parts.push(chalk.yellow(`${warnCount} warning${warnCount > 1 ? 's' : ''}`));\n console.log(chalk.gray(`\\n ${parts.join(', ')}`));\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\n\nlet cachedVersion: string | undefined;\n\n/**\n * Walks up from `dir` to find the nearest package.json.\n * Needed because this module's own path differs between the tsdown-bundled\n * single-file `dist/cli.mjs` and the unbundled source used by tests.\n */\nfunction findPackageJson(dir: string): string {\n let current = dir;\n while (true) {\n const candidate = path.join(current, 'package.json');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(`Could not locate package.json above ${dir}`);\n }\n current = parent;\n }\n}\n\nexport function getVersion(): string {\n if (cachedVersion) return cachedVersion;\n\n const dir = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = findPackageJson(dir);\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version: string };\n\n cachedVersion = pkg.version;\n return cachedVersion;\n}\n","import type { AggregatedReport } from './aggregator';\nimport { getVersion } from './version';\n\nexport function printJson(aggregated: AggregatedReport): void {\n const result = {\n version: getVersion(),\n summary: {\n filesAnalyzed: aggregated.filesAnalyzed,\n totalImports: aggregated.totalImports,\n totalComponents: aggregated.totalComponents,\n totalUsagePatterns: aggregated.totalUsagePatterns,\n },\n packages: aggregated.packageDistribution,\n components: aggregated.topComponents.map((c) => ({\n ...c,\n files: [...c.files],\n })),\n patterns: aggregated.patternCounts,\n versus: aggregated.versusResults,\n ruleViolations: aggregated.ruleViolations,\n bannedPackageViolations: aggregated.bannedPackageViolations,\n };\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n}\n","import { z } from 'zod';\n\n// āā Sub-schemas āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nconst RuleSeveritySchema = z.enum(['error', 'warn', 'info']);\n\nconst RuleConfigSchema = z.object({\n severity: RuleSeveritySchema,\n patterns: z.array(z.string()),\n message: z.string().optional(),\n});\n\nconst RuleConfigOrArraySchema = z.union([\n RuleConfigSchema,\n z.array(RuleConfigSchema),\n]);\n\nconst PackageFieldRuleSchema = RuleConfigSchema.extend({\n /** Optional micromatch patterns the field's stringified value must match */\n values: z.array(z.string()).optional(),\n});\n\nconst PackageFieldRuleOrArraySchema = z.union([\n PackageFieldRuleSchema,\n z.array(PackageFieldRuleSchema),\n]);\n\nconst EngineVersionRuleSchema = z.object({\n severity: RuleSeveritySchema,\n range: z.string(),\n message: z.string().optional(),\n});\n\nconst CodeownersRuleSchema = z.object({\n severity: RuleSeveritySchema,\n message: z.string().optional(),\n});\n\nconst ThresholdSchema = z.union([z.number(), z.literal(false)]);\n\n// āā Main schema with defaults āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport const HermexConfigSchema = z.object({\n includes: z.array(z.string()).default(['**/*.{tsx,jsx,ts,js}']),\n excludes: z\n .array(z.string())\n .default(['**/node_modules/**', '**/dist/**', '**/build/**']),\n\n packages: z\n .object({\n internal: z.array(z.string()).default([]),\n ignore: z.array(z.string()).default([]),\n })\n .default(() => ({ internal: [], ignore: [] })),\n\n versus: z\n .array(z.object({ name: z.string(), packages: z.array(z.string()).min(2) }))\n .default([]),\n\n rules: z\n .object({\n detect_files: RuleConfigOrArraySchema.default([]),\n require_files: RuleConfigOrArraySchema.default([]),\n forbid_packages: RuleConfigOrArraySchema.default([]),\n require_packages: RuleConfigOrArraySchema.default([]),\n require_scripts: RuleConfigOrArraySchema.default([]),\n require_package_fields: PackageFieldRuleOrArraySchema.default([]),\n forbid_package_fields: PackageFieldRuleOrArraySchema.default([]),\n engine_version: z\n .union([EngineVersionRuleSchema, z.array(EngineVersionRuleSchema)])\n .optional(),\n codeowners: CodeownersRuleSchema.optional(),\n })\n .default(() => ({\n detect_files: [] as RuleConfig[],\n require_files: [] as RuleConfig[],\n forbid_packages: [] as RuleConfig[],\n require_packages: [] as RuleConfig[],\n require_scripts: [] as RuleConfig[],\n require_package_fields: [] as PackageFieldRule[],\n forbid_package_fields: [] as PackageFieldRule[],\n })),\n\n output: z\n .object({\n summary: z.union([z.literal('log'), z.literal(false)]).default('log'),\n components: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n packages: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n patterns: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n details: z.boolean().default(false),\n versus: z.boolean().default(true),\n rules: z.boolean().default(true),\n format: z.enum(['human', 'json']).default('human'),\n })\n .default(() => ({\n summary: 'log' as const,\n components: 'table' as const,\n packages: 'table' as const,\n patterns: 'table' as const,\n details: false,\n versus: true,\n rules: true,\n format: 'human' as const,\n })),\n\n releaseAge: z\n .object({\n enabled: z.boolean().default(false),\n registry: z.string().default('https://registry.npmjs.org'),\n authToken: z.string().optional(),\n thresholds: z\n .object({\n patch: ThresholdSchema.default(30),\n minor: ThresholdSchema.default(45),\n major: ThresholdSchema.default(60),\n })\n .default(() => ({ patch: 30, minor: 45, major: 60 })),\n enforceOn: z.array(z.string()).default([]),\n cacheTtlMs: z.number().int().positive().optional(),\n cacheDisabled: z.boolean().default(false),\n })\n .default(() => ({\n enabled: false,\n registry: 'https://registry.npmjs.org',\n thresholds: { patch: 30, minor: 45, major: 60 },\n enforceOn: [],\n cacheDisabled: false,\n })),\n});\n\n// āā Derived types āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/** Config as returned after parsing ā all defaults applied, all fields required */\nexport type HermexConfig = z.infer<typeof HermexConfigSchema>;\n\n/** Config as accepted by the user ā everything optional */\nexport type HermexConfigInput = z.input<typeof HermexConfigSchema>;\n\n// Sub-types derived from the output shape so they can never drift from the schema\nexport type RuleSeverity = z.infer<typeof RuleSeveritySchema>;\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\nexport type PackageFieldRule = z.infer<typeof PackageFieldRuleSchema>;\nexport type EngineVersionRule = z.infer<typeof EngineVersionRuleSchema>;\nexport type CodeownersRule = z.infer<typeof CodeownersRuleSchema>;\nexport type PackagesConfig = HermexConfig['packages'];\nexport type VersusConfig = HermexConfig['versus'][number];\nexport type RulesConfig = HermexConfig['rules'];\nexport type OutputConfig = HermexConfig['output'];\nexport type ReleaseAgeConfig = HermexConfig['releaseAge'];\nexport type ReleaseAgeThresholds = HermexConfig['releaseAge']['thresholds'];\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { HermexConfigSchema } from './schema';\nimport type { HermexConfig } from './schema';\n\nexport async function loadConfig(\n cwd: string,\n explicitPath?: string,\n): Promise<HermexConfig> {\n const configPath = explicitPath\n ? resolve(explicitPath)\n : join(cwd, 'hermex.config.ts');\n\n if (explicitPath && !existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n if (existsSync(configPath)) {\n const mod = await import(pathToFileURL(configPath).href);\n return HermexConfigSchema.parse(mod.default ?? mod);\n }\n\n return HermexConfigSchema.parse({});\n}\n","import type { ParserState, UsagePatterns } from '../types';\n\nexport function createState(): ParserState {\n const usagePatterns: UsagePatterns = {\n namedImports: new Set(),\n namespaceImports: new Set(),\n defaultImports: new Set(),\n aliasedImports: new Map(),\n variableAssignments: new Map(),\n lazyImports: new Set(),\n dynamicImports: new Set(),\n conditionalUsage: new Set(),\n arrayMappings: new Set(),\n objectMappings: new Set(),\n hocUsage: new Set(),\n forwardedRefs: new Set(),\n memoizedComponents: new Set(),\n portalUsage: new Set(),\n jsxUsage: new Map(),\n destructuredUsage: new Set(),\n propsAnalysis: new Map(),\n };\n\n return {\n usagePatterns,\n componentNames: new Set(),\n allIdentifiers: new Set(),\n };\n}\n","import type { ImportDeclaration } from '@swc/core';\nimport type { ParserState } from '../types';\n\n/**\n * Analyzes import declarations and tracks all types:\n * - Default imports\n * - Named imports\n * - Namespace imports\n * - Aliased imports\n */\nexport function analyzeImportDeclaration(\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const source = node.source.value;\n\n for (const spec of node.specifiers) {\n switch (spec.type) {\n case 'ImportDefaultSpecifier':\n analyzeDefaultImport(spec, source, node, state);\n break;\n\n case 'ImportNamespaceSpecifier':\n analyzeNamespaceImport(spec, source, node, state);\n break;\n\n case 'ImportSpecifier':\n analyzeNamedImport(spec, source, node, state);\n break;\n }\n }\n}\n\nfunction analyzeDefaultImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const name = spec.local.value;\n\n state.usagePatterns.defaultImports.add({\n name,\n source,\n line: node.span?.start || 0,\n });\n\n state.componentNames.add(name);\n}\n\nfunction analyzeNamespaceImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const name = spec.local.value;\n\n state.usagePatterns.namespaceImports.add({\n name,\n source,\n line: node.span?.start || 0,\n });\n\n state.allIdentifiers.add(name);\n}\n\nfunction analyzeNamedImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const importedName = spec.imported ? spec.imported.value : spec.local.value;\n const localName = spec.local.value;\n\n state.usagePatterns.namedImports.add({\n name: importedName,\n source,\n line: node.span?.start || 0,\n });\n\n // Track aliases\n if (importedName !== localName) {\n state.usagePatterns.aliasedImports.set(localName, {\n imported: importedName,\n local: localName,\n source,\n line: node.span?.start || 0,\n });\n }\n\n state.componentNames.add(localName);\n}\n","import type { ParserState } from '../types';\n\n/**\n * Extracts the name from a JSX element (handles identifiers and member expressions)\n */\nexport function getJSXElementName(nameNode: any): string {\n if (!nameNode) return '';\n\n switch (nameNode.type) {\n case 'Identifier':\n return nameNode.value;\n case 'JSXMemberExpression':\n return `${getJSXElementName(nameNode.object)}.${nameNode.property.value}`;\n default:\n return '';\n }\n}\n\n/**\n * Checks if a JSX member expression is a known component\n */\nexport function isMemberExpressionComponent(\n nameNode: any,\n state: ParserState,\n): boolean {\n if (nameNode?.type === 'JSXMemberExpression') {\n const objectName = getJSXElementName(nameNode.object);\n return state.allIdentifiers.has(objectName);\n }\n return false;\n}\n\n/**\n * Extracts props from JSX attributes\n */\nexport function extractJSXProps(attributes: any[]): Array<{\n name: string;\n value: any;\n isSpread?: boolean;\n}> {\n if (!attributes) return [];\n\n return attributes\n .map((attr) => {\n if (attr.type === 'JSXAttribute') {\n return {\n name: attr.name?.value || attr.name?.name?.value,\n value: extractJSXAttributeValue(attr.value),\n };\n }\n if (attr.type === 'SpreadElement') {\n return {\n name: '...',\n value: '[spread]',\n isSpread: true,\n };\n }\n return null;\n })\n .filter(Boolean) as Array<{\n name: string;\n value: any;\n isSpread?: boolean;\n }>;\n}\n\n/**\n * Extracts value from JSX attribute\n */\nexport function extractJSXAttributeValue(value: any): any {\n if (!value) return true; // boolean attribute\n\n switch (value.type) {\n case 'StringLiteral':\n return value.value;\n case 'JSXExpressionContainer':\n return extractExpressionValue(value.expression);\n default:\n return '[complex]';\n }\n}\n\n/**\n * Extracts a readable value from an expression\n */\nexport function extractExpressionValue(expr: any): any {\n if (!expr) return '[unknown]';\n\n switch (expr.type) {\n case 'StringLiteral':\n case 'NumericLiteral':\n case 'BooleanLiteral':\n return expr.value;\n case 'Identifier':\n return `{${expr.value}}`;\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n return '[function]';\n case 'ObjectExpression':\n return '[object]';\n case 'ArrayExpression':\n return '[array]';\n default:\n return '[expression]';\n }\n}\n\n/**\n * Determines the context where a component is being used\n */\nexport function getUsageContext(parent: any): string {\n if (!parent) return 'direct';\n\n switch (parent.type) {\n case 'ConditionalExpression':\n return 'conditional';\n case 'ArrayExpression':\n return 'array';\n case 'ObjectExpression':\n return 'object';\n case 'CallExpression':\n return 'hoc';\n case 'VariableDeclarator':\n return 'variable';\n default:\n return 'jsx';\n }\n}\n","import type { PropsAnalysis, PropDetail, ParserState } from '../types';\n\n/**\n * Analyzes props in detail for a component\n */\nexport function analyzePropsInDetail(\n attributes: any[],\n componentName: string,\n state: ParserState,\n): PropsAnalysis {\n const analysis: PropsAnalysis = {\n namedProps: [],\n hasSpread: false,\n hasComplexProps: false,\n hasEventHandlers: false,\n propDetails: [],\n };\n\n if (!attributes) return analysis;\n\n for (const attr of attributes) {\n if (attr.type === 'JSXAttribute') {\n const propName = attr.name?.value || attr.name?.name?.value;\n if (propName) {\n analysis.namedProps.push(propName);\n\n const propDetail: PropDetail = {\n name: propName,\n type: getPropType(attr.value),\n isEventHandler: propName.startsWith('on'),\n isComplex: isComplexProp(attr.value),\n };\n\n if (propDetail.isEventHandler) {\n analysis.hasEventHandlers = true;\n }\n if (propDetail.isComplex) {\n analysis.hasComplexProps = true;\n }\n\n analysis.propDetails.push(propDetail);\n }\n } else if (attr.type === 'SpreadElement') {\n analysis.hasSpread = true;\n analysis.propDetails.push({\n name: '...',\n type: 'spread',\n isSpread: true,\n isComplex: true,\n isEventHandler: false,\n warning: 'Spread props cannot be statically analyzed',\n });\n analysis.hasComplexProps = true;\n }\n }\n\n // Store in state\n state.usagePatterns.propsAnalysis.set(componentName, analysis);\n\n return analysis;\n}\n\n/**\n * Determines the type of a prop value\n */\nfunction getPropType(value: any): string {\n if (!value) return 'boolean';\n\n switch (value.type) {\n case 'StringLiteral':\n return 'string';\n case 'JSXExpressionContainer': {\n const expr = value.expression;\n if (!expr) return 'unknown';\n switch (expr.type) {\n case 'NumericLiteral':\n return 'number';\n case 'BooleanLiteral':\n return 'boolean';\n case 'StringLiteral':\n return 'string';\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n return 'function';\n case 'ObjectExpression':\n return 'object';\n case 'ArrayExpression':\n return 'array';\n case 'Identifier':\n return 'variable';\n default:\n return 'expression';\n }\n }\n default:\n return 'unknown';\n }\n}\n\n/**\n * Checks if a prop value is complex (object, array, call, conditional)\n */\nfunction isComplexProp(value: any): boolean {\n if (!value) return false;\n if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression;\n if (!expr) return false;\n return (\n expr.type === 'ObjectExpression' ||\n expr.type === 'ArrayExpression' ||\n expr.type === 'CallExpression' ||\n expr.type === 'ConditionalExpression'\n );\n }\n return false;\n}\n","import type { ParserState, JSXUsage } from '../types';\nimport {\n getJSXElementName,\n isMemberExpressionComponent,\n extractJSXProps,\n getUsageContext,\n} from '../utils/jsx-helpers';\nimport { analyzePropsInDetail } from './props';\n\n/**\n * Analyzes JSX element usage\n */\nexport function analyzeJSXElement(node: any, state: ParserState): void {\n if (node.opening) {\n analyzeJSXOpeningElement(node.opening, state, node);\n }\n}\n\n/**\n * Analyzes JSX opening element and tracks component usage\n */\nexport function analyzeJSXOpeningElement(\n node: any,\n state: ParserState,\n parent?: any,\n): void {\n const elementName = getJSXElementName(node.name);\n\n // Check if this is a known component\n if (\n !state.componentNames.has(elementName) &&\n !isMemberExpressionComponent(node.name, state)\n ) {\n return;\n }\n\n const propsAnalysis = analyzePropsInDetail(\n node.attributes,\n elementName,\n state,\n );\n const usage: JSXUsage = {\n component: elementName,\n props: extractJSXProps(node.attributes).map((p) => p.name),\n propsAnalysis,\n line: node.span?.start || 0,\n context: getUsageContext(parent),\n };\n\n // Track JSX usage\n if (!state.usagePatterns.jsxUsage.has(elementName)) {\n state.usagePatterns.jsxUsage.set(elementName, usage);\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Checks if a name is a known component from imports\n */\nexport function isKnownComponent(name: string, state: ParserState): boolean {\n return state.componentNames.has(name) || state.allIdentifiers.has(name);\n}\n\n/**\n * Checks if a function name matches HOC patterns\n */\nexport function isHOCPattern(name: string): boolean {\n const hocPatterns = ['with', 'enhance', 'wrap', 'connect', 'create'];\n return hocPatterns.some((pattern) => name.startsWith(pattern));\n}\n\n/**\n * Checks if a node represents a HOC function call\n */\nexport function isHOCFunction(callee: any): boolean {\n if (!callee) return false;\n\n if (callee.type === 'Identifier') {\n return isHOCPattern(callee.value);\n }\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property;\n return prop?.value && isHOCPattern(prop.value);\n }\n\n return false;\n}\n\n/**\n * Checks if an expression looks like a React component\n * (starts with capital letter)\n */\nexport function looksLikeComponent(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\n/**\n * Checks if source is from a specific library (for filtering)\n */\nexport function isFromLibrary(source: string, libraryName: string): boolean {\n return source.startsWith(libraryName) || source.includes(libraryName);\n}\n","import type { ParserState } from '../types';\nimport { isKnownComponent } from '../utils/matchers';\n\n/**\n * Analyzes variable declarations for component assignments\n */\nexport function analyzeVariableDeclaration(\n node: any,\n state: ParserState,\n): void {\n if (!node.declarations) return;\n\n for (const decl of node.declarations) {\n if (decl.id?.type === 'Identifier') {\n const varName = decl.id.value;\n\n // Check if it's assigning a component\n if (decl.init) {\n const assignment = extractAssignmentInfo(decl.init);\n if (assignment && isKnownComponent(assignment, state)) {\n state.usagePatterns.variableAssignments.set(varName, {\n assignment,\n line: node.span?.start || 0,\n });\n state.componentNames.add(varName);\n }\n }\n }\n\n // Handle destructuring assignments\n if (decl.id?.type === 'ObjectPattern') {\n analyzeDestructuringPattern(decl.id, decl.init, state);\n }\n }\n}\n\n/**\n * Analyzes destructuring patterns\n */\nexport function analyzeDestructuringPattern(\n pattern: any,\n init: any,\n state: ParserState,\n): void {\n if (!pattern.properties) return;\n\n for (const prop of pattern.properties) {\n if (\n prop.type === 'AssignmentPatternProperty' &&\n prop.key?.type === 'Identifier'\n ) {\n const propName = prop.key.value;\n\n if (init?.type === 'Identifier' && state.allIdentifiers.has(init.value)) {\n state.usagePatterns.destructuredUsage.add({\n property: propName,\n source: init.value,\n line: pattern.span?.start || 0,\n });\n state.componentNames.add(propName);\n }\n }\n }\n}\n\n/**\n * Extracts assignment information from various node types\n */\nfunction extractAssignmentInfo(node: any): string | null {\n switch (node.type) {\n case 'Identifier':\n return node.value;\n case 'MemberExpression':\n return `${extractAssignmentInfo(node.object)}.${node.property.value}`;\n case 'ConditionalExpression':\n return `${extractAssignmentInfo(node.consequent)} | ${extractAssignmentInfo(node.alternate)}`;\n default:\n return null;\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes conditional expressions (ternary operators) with components\n */\nexport function analyzeConditionalExpression(\n node: any,\n state: ParserState,\n): void {\n const consequent =\n node.consequent?.type === 'Identifier' ? node.consequent.value : null;\n const alternate =\n node.alternate?.type === 'Identifier' ? node.alternate.value : null;\n\n if (\n (consequent && state.componentNames.has(consequent)) ||\n (alternate && state.componentNames.has(alternate))\n ) {\n state.usagePatterns.conditionalUsage.add({\n consequent: consequent || '',\n alternate: alternate || '',\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes array expressions containing components\n */\nexport function analyzeArrayExpression(node: any, state: ParserState): void {\n // Check if array contains components\n const hasComponents = node.elements?.some((elem: any) => {\n if (elem?.expression?.type === 'Identifier') {\n return state.componentNames.has(elem.expression.value);\n }\n return false;\n });\n\n if (hasComponents) {\n state.usagePatterns.arrayMappings.add({\n components: node.elements\n ?.map((elem: any) => elem?.expression?.value)\n .filter(Boolean),\n line: node.span?.start || 0,\n });\n }\n}\n\n/**\n * Analyzes object expressions with component mappings\n */\nexport function analyzeObjectExpression(node: any, state: ParserState): void {\n // Check if object contains component mappings\n const componentProps = node.properties?.filter((prop: any) => {\n if (prop.type === 'KeyValueProperty' && prop.value?.type === 'Identifier') {\n return state.componentNames.has(prop.value.value);\n }\n return false;\n });\n\n if (componentProps?.length > 0) {\n state.usagePatterns.objectMappings.add({\n mappings: componentProps.map((prop: any) => ({\n key: prop.key?.value || '[computed]',\n component: prop.value?.value,\n })),\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes React.lazy() imports\n */\nexport function analyzeLazyImport(node: any, state: ParserState): void {\n const arg = node.arguments?.[0]?.expression;\n if (\n arg?.type === 'ArrowFunctionExpression' &&\n arg.body?.type === 'CallExpression'\n ) {\n const importCall = arg.body;\n if (importCall.callee?.type === 'Import') {\n const source = importCall.arguments?.[0]?.expression?.value;\n if (source) {\n state.usagePatterns.lazyImports.add({\n source,\n line: node.span?.start || 0,\n });\n }\n }\n }\n}\n\n/**\n * Analyzes dynamic import() calls\n */\nexport function analyzeDynamicImport(node: any, state: ParserState): void {\n const source = node.arguments?.[0]?.expression?.value;\n if (source) {\n state.usagePatterns.dynamicImports.add({\n source,\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes Higher-Order Component (HOC) usage\n */\nexport function analyzeHOCUsage(node: any, state: ParserState): void {\n state.usagePatterns.hocUsage.add({\n function: node.callee?.value || '[unknown]',\n component: node.arguments?.[0]?.expression?.value || '[unknown]',\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes React.memo() usage\n */\nexport function analyzeMemoUsage(node: any, state: ParserState): void {\n const component = node.arguments?.[0]?.expression;\n if (\n component?.type === 'Identifier' &&\n state.componentNames.has(component.value)\n ) {\n state.usagePatterns.memoizedComponents.add({\n component: component.value,\n line: node.span?.start || 0,\n });\n }\n}\n\n/**\n * Analyzes React.forwardRef() usage\n */\nexport function analyzeForwardRefUsage(node: any, state: ParserState): void {\n state.usagePatterns.forwardedRefs.add({\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes ReactDOM.createPortal() usage\n */\nexport function analyzePortalUsage(node: any, state: ParserState): void {\n state.usagePatterns.portalUsage.add({\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes member expression access (e.g., Foundation.Button)\n */\nexport function analyzeMemberExpression(node: any, state: ParserState): void {\n // Check if this is a namespace access like Foundation.Button\n if (\n node.object?.type === 'Identifier' &&\n state.allIdentifiers.has(node.object.value)\n ) {\n // const namespaceName = node.object.value;\n const propertyName = node.property?.value;\n\n if (propertyName) {\n // Track namespace property access\n state.componentNames.add(propertyName);\n }\n }\n}\n\n/**\n * Checks if a node represents HOC pattern\n */\nexport function isHOCPattern(node: any, state: ParserState): boolean {\n // Simple heuristic: function that returns a component-like structure\n return (\n node.callee?.type === 'Identifier' &&\n node.arguments?.some(\n (arg: any) =>\n arg.expression?.type === 'Identifier' &&\n state.componentNames.has(arg.expression.value),\n )\n );\n}\n","import type { ParserState, VisitorContext } from '../types';\nimport { analyzeImportDeclaration } from '../patterns/imports';\nimport { analyzeJSXElement, analyzeJSXOpeningElement } from '../patterns/jsx';\nimport { analyzeVariableDeclaration } from '../patterns/variables';\nimport { analyzeConditionalExpression } from '../patterns/conditionals';\nimport {\n analyzeArrayExpression,\n analyzeObjectExpression,\n} from '../patterns/collections';\nimport {\n analyzeLazyImport,\n analyzeDynamicImport,\n} from '../patterns/lazy-dynamic';\nimport {\n analyzeHOCUsage,\n analyzeMemoUsage,\n analyzeForwardRefUsage,\n analyzePortalUsage,\n analyzeMemberExpression,\n isHOCPattern,\n} from '../patterns/advanced';\n\n/**\n * Main AST visitor that routes nodes to appropriate pattern analyzers\n */\nexport function visitNode(\n node: any,\n state: ParserState,\n context: VisitorContext = {},\n): void {\n if (!node) return;\n\n switch (node.type) {\n case 'Module':\n // Process imports first (they populate componentNames)\n if (node.body) {\n for (const item of node.body) {\n if (item.type === 'ImportDeclaration') {\n visitNode(item, state, context);\n }\n }\n // Then process everything else\n for (const item of node.body) {\n if (item.type !== 'ImportDeclaration') {\n visitNode(item, state, { ...context, parent: node });\n }\n }\n }\n break;\n\n case 'ImportDeclaration':\n analyzeImportDeclaration(node, state);\n break;\n\n case 'CallExpression':\n analyzeCallExpression(node, state, context);\n break;\n\n case 'VariableDeclaration':\n analyzeVariableDeclaration(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'JSXElement':\n case 'JSXFragment':\n analyzeJSXElement(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'JSXOpeningElement':\n analyzeJSXOpeningElement(node, state, context.parent);\n break;\n\n case 'ArrayExpression':\n analyzeArrayExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'ObjectExpression':\n analyzeObjectExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'MemberExpression':\n analyzeMemberExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'ConditionalExpression':\n analyzeConditionalExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n case 'ExpressionStatement':\n case 'ReturnStatement':\n case 'VariableDeclarator':\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n visitChildren(node, state, { ...context, parent: node });\n break;\n\n default:\n visitChildren(node, state, context);\n break;\n }\n}\n\n/**\n * Analyzes call expressions and routes to specific analyzers\n */\nfunction analyzeCallExpression(\n node: any,\n state: ParserState,\n context: VisitorContext,\n): void {\n // Analyze lazy imports\n if (\n node.callee?.value === 'lazy' ||\n (node.callee?.object?.value === 'React' &&\n node.callee?.property?.value === 'lazy')\n ) {\n analyzeLazyImport(node, state);\n }\n\n // Analyze dynamic imports\n if (node.callee?.type === 'Import') {\n analyzeDynamicImport(node, state);\n }\n\n // Analyze HOC patterns\n if (isHOCPattern(node, state)) {\n analyzeHOCUsage(node, state);\n }\n\n // Analyze React.memo, React.forwardRef\n if (node.callee?.object?.value === 'React') {\n if (node.callee?.property?.value === 'memo') {\n analyzeMemoUsage(node, state);\n } else if (node.callee?.property?.value === 'forwardRef') {\n analyzeForwardRefUsage(node, state);\n }\n }\n\n // Analyze createPortal\n if (\n node.callee?.property?.value === 'createPortal' ||\n node.callee?.value === 'createPortal'\n ) {\n analyzePortalUsage(node, state);\n }\n\n visitChildren(node, state, context);\n}\n\n/**\n * Visits all children of a node\n */\nfunction visitChildren(\n node: any,\n state: ParserState,\n context: VisitorContext,\n): void {\n if (!node) return;\n\n for (const key in node) {\n const value = node[key];\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item && typeof item === 'object') {\n visitNode(item, state, { ...context, parent: node });\n }\n }\n } else if (value && typeof value === 'object' && value.type) {\n visitNode(value, state, { ...context, parent: node });\n }\n }\n}\n","import type { ParserState, UsageReport } from '../types';\n\n/**\n * Generates a comprehensive usage report from parser state\n */\nexport function generateReport(\n state: ParserState,\n filePath: string,\n): UsageReport {\n const report: UsageReport = {\n filePath,\n summary: {\n totalImports:\n state.usagePatterns.defaultImports.size +\n state.usagePatterns.namedImports.size +\n state.usagePatterns.namespaceImports.size,\n totalComponents: state.componentNames.size,\n totalUsagePatterns: calculateTotalPatterns(state),\n },\n patterns: {\n imports: {\n default: Array.from(state.usagePatterns.defaultImports),\n named: Array.from(state.usagePatterns.namedImports),\n namespace: Array.from(state.usagePatterns.namespaceImports),\n aliased: Array.from(state.usagePatterns.aliasedImports.values()),\n },\n usage: {\n jsx: Array.from(state.usagePatterns.jsxUsage.values()),\n variables: Array.from(\n state.usagePatterns.variableAssignments.entries(),\n ).map(([key, value]) => ({\n variable: key,\n assignment: value.assignment,\n })),\n destructuring: Array.from(state.usagePatterns.destructuredUsage),\n conditional: Array.from(state.usagePatterns.conditionalUsage),\n arrays: Array.from(state.usagePatterns.arrayMappings),\n objects: Array.from(state.usagePatterns.objectMappings),\n },\n advanced: {\n lazy: Array.from(state.usagePatterns.lazyImports),\n dynamic: Array.from(state.usagePatterns.dynamicImports),\n hoc: Array.from(state.usagePatterns.hocUsage),\n memo: Array.from(state.usagePatterns.memoizedComponents),\n forwardRef: Array.from(state.usagePatterns.forwardedRefs),\n portal: Array.from(state.usagePatterns.portalUsage),\n },\n props: Array.from(state.usagePatterns.propsAnalysis.entries()).map(\n ([component, analysis]) => ({\n component,\n analysis,\n }),\n ),\n },\n components: Array.from(state.componentNames).sort(),\n };\n\n return report;\n}\n\n/**\n * Calculates total number of usage patterns found\n */\nfunction calculateTotalPatterns(state: ParserState): number {\n return Object.values(state.usagePatterns).reduce((sum, collection) => {\n if (collection instanceof Set || collection instanceof Map) {\n return sum + collection.size;\n }\n return sum;\n }, 0);\n}\n","import { parseSync } from '@swc/core';\nimport type { ParseOptions as SwcParseOptions } from '@swc/core';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { UsageReport } from './types';\nimport { createState } from './core/state';\nimport { visitNode } from './core/visitor';\nimport { generateReport } from './core/report';\n\nfunction swcOptionsForFile(filePath: string): SwcParseOptions {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.ts')\n return {\n syntax: 'typescript',\n tsx: false,\n decorators: true,\n dynamicImport: true,\n };\n if (ext === '.tsx')\n return {\n syntax: 'typescript',\n tsx: true,\n decorators: true,\n dynamicImport: true,\n };\n if (ext === '.jsx')\n return {\n syntax: 'ecmascript',\n jsx: true,\n decorators: true,\n importAssertions: true,\n };\n // .js / .mjs / .cjs\n return {\n syntax: 'ecmascript',\n jsx: true,\n decorators: true,\n importAssertions: true,\n };\n}\n\nexport function parseCode(code: string, filePath = 'file.tsx'): UsageReport {\n const state = createState();\n const ast = parseSync(code, swcOptionsForFile(filePath));\n visitNode(ast, state);\n return generateReport(state, filePath);\n}\n\nexport function parseFile(filePath: string): UsageReport | null {\n const code = fs.readFileSync(filePath, 'utf8');\n return parseCode(code, filePath);\n}\n\nexport type { UsageReport } from './types';\n","import micromatch from 'micromatch';\nimport type { UsageReport } from '../swc-parser';\nimport type { HermexConfig } from '../config/types';\nimport type { MultiVersionMap } from '../lock-parser';\nimport type { ReleaseAgeEntry } from '../npm-registry/types';\n\nexport interface ComponentUsage {\n name: string;\n source: string;\n count: number;\n files: Set<string>;\n}\n\nexport interface PackageDistribution {\n packageName: string;\n version: string | null;\n componentCount: number;\n usageCount: number;\n percentage: number;\n components: string[];\n internal: boolean;\n hasVersionConflict: boolean;\n allVersions: string[];\n releaseAge?: ReleaseAgeEntry;\n}\n\nfunction resolvePackageFromImportPath(\n importPath: string,\n availablePackages: string[],\n): string {\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\n return 'local';\n }\n\n const sortedPackages = [...availablePackages].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const pkg of sortedPackages) {\n if (importPath === pkg) return pkg;\n if (importPath.startsWith(`${pkg}/`)) return pkg;\n }\n\n return 'unknown';\n}\n\nexport function findComponentSource(\n componentName: string,\n report: UsageReport,\n availablePackages: string[],\n): string {\n const namedImport = report.patterns.imports.named.find(\n (imp) => imp.name === componentName,\n );\n if (namedImport)\n return resolvePackageFromImportPath(namedImport.source, availablePackages);\n\n const defaultImport = report.patterns.imports.default.find(\n (imp) => imp.name === componentName,\n );\n if (defaultImport)\n return resolvePackageFromImportPath(\n defaultImport.source,\n availablePackages,\n );\n\n const aliasedImport = report.patterns.imports.aliased.find(\n (imp) => imp.local === componentName,\n );\n if (aliasedImport)\n return resolvePackageFromImportPath(\n aliasedImport.source,\n availablePackages,\n );\n\n return 'unknown';\n}\n\nfunction getPackageVersion(\n packageName: string,\n versions: Record<string, string>,\n): string | null {\n if (versions[packageName]) return versions[packageName];\n\n if (packageName.includes('/')) {\n const parts = packageName.split('/');\n if (packageName.startsWith('@') && parts.length > 2) {\n const basePackage = `${parts[0]}/${parts[1]}`;\n if (versions[basePackage]) return versions[basePackage];\n }\n if (!packageName.startsWith('@') && parts.length > 1) {\n if (versions[parts[0]]) return versions[parts[0]];\n }\n }\n\n return null;\n}\n\nexport function calculatePackageDistribution(\n componentUsageMap: Map<string, ComponentUsage>,\n versions: Record<string, string>,\n config?: HermexConfig,\n multiVersions: MultiVersionMap = {},\n): PackageDistribution[] {\n const ignorePatterns = config?.packages.ignore ?? [];\n const internalPatterns = config?.packages.internal ?? [];\n\n const packageMap = new Map<string, PackageDistribution>();\n\n for (const component of componentUsageMap.values()) {\n if (component.source === 'unknown' || component.source === 'local')\n continue;\n\n if (\n ignorePatterns.length > 0 &&\n micromatch.isMatch(component.source, ignorePatterns)\n ) {\n continue;\n }\n\n const existing = packageMap.get(component.source);\n if (existing) {\n existing.componentCount++;\n existing.usageCount += component.count;\n existing.components.push(component.name);\n } else {\n const isInternal =\n internalPatterns.length > 0\n ? micromatch.isMatch(component.source, internalPatterns)\n : false;\n\n const allVersions = multiVersions[component.source] ?? [];\n const hasVersionConflict = allVersions.length > 1;\n\n packageMap.set(component.source, {\n packageName: component.source,\n version: getPackageVersion(component.source, versions),\n componentCount: 1,\n usageCount: component.count,\n percentage: 0,\n components: [component.name],\n internal: isInternal,\n hasVersionConflict,\n allVersions,\n });\n }\n }\n\n const distribution = Array.from(packageMap.values());\n const totalExternalUsage = distribution.reduce(\n (sum, pkg) => sum + pkg.usageCount,\n 0,\n );\n\n for (const pkg of distribution) {\n pkg.percentage =\n totalExternalUsage > 0 ? (pkg.usageCount / totalExternalUsage) * 100 : 0;\n }\n\n return distribution.sort((a, b) => b.usageCount - a.usageCount);\n}\n","import { globSync } from 'glob';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface RuleViolation {\n type:\n | 'detect_files'\n | 'require_files'\n | 'forbid_packages'\n | 'require_packages'\n | 'require_scripts'\n | 'require_package_fields'\n | 'forbid_package_fields'\n | 'engine_version'\n | 'codeowners';\n severity: 'error' | 'warn' | 'info';\n patterns: string[];\n message?: string;\n matchedFiles: string[];\n // engine_version only\n installedRange?: string;\n requiredRange?: string;\n // package-field rules only\n fieldPath?: string;\n actualValue?: string;\n}\n\nexport function toArray<T>(val: T | T[] | undefined): T[] {\n if (!val) return [];\n return Array.isArray(val) ? val : [val];\n}\n\nexport function findMatches(\n patterns: string[],\n repoPath: string,\n ignore: string[],\n): string[] {\n const matches: string[] = [];\n for (const pattern of patterns) {\n const found = globSync(pattern, { cwd: repoPath, nodir: true, ignore });\n matches.push(...found.map((f) => f.replace(/\\\\/g, '/')));\n }\n return [...new Set(matches)];\n}\n\nexport function readPackageJson(\n repoPath: string,\n): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(\n path.join(repoPath, 'package.json'),\n 'utf-8',\n );\n return JSON.parse(content) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","import type { RulesConfig } from '../config/types';\nimport { toArray, findMatches } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateFileRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n excludes: string[],\n): RuleViolation[] {\n const violations: RuleViolation[] = [];\n\n for (const rule of toArray(rulesConfig.detect_files)) {\n const matches = findMatches(rule.patterns, repoPath, excludes);\n if (matches.length > 0) {\n violations.push({\n type: 'detect_files',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: matches,\n });\n }\n }\n\n for (const rule of toArray(rulesConfig.require_files)) {\n const matches = findMatches(rule.patterns, repoPath, excludes);\n if (matches.length === 0) {\n violations.push({\n type: 'require_files',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n });\n }\n }\n\n return violations;\n}\n","import micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateScriptRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const rules = toArray(rulesConfig.require_scripts);\n if (rules.length === 0) {\n return [];\n }\n\n const pkg = readPackageJson(repoPath);\n const scriptKeys = Object.keys(\n (pkg?.scripts as Record<string, string> | undefined) ?? {},\n );\n\n return rules\n .filter(\n (rule) =>\n !rule.patterns.some((p) =>\n scriptKeys.some((k) => micromatch.isMatch(k, p)),\n ),\n )\n .map((rule) => ({\n type: 'require_scripts' as const,\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n }));\n}\n","import micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\ninterface FieldLookup {\n exists: boolean;\n value: unknown;\n}\n\n/** Resolves a dot-path like \"engines.node\" against the manifest object. */\nfunction getFieldAtPath(\n pkg: Record<string, unknown> | null,\n path: string,\n): FieldLookup {\n let current: unknown = pkg;\n for (const key of path.split('.')) {\n if (\n current === null ||\n typeof current !== 'object' ||\n !(key in (current as Record<string, unknown>))\n ) {\n return { exists: false, value: undefined };\n }\n current = (current as Record<string, unknown>)[key];\n }\n return { exists: true, value: current };\n}\n\n/** Primitives compare by string form; objects/arrays never match a value pattern. */\nfunction valueMatches(value: unknown, valuePatterns: string[]): boolean {\n if (value === null || typeof value === 'object') return false;\n return micromatch.isMatch(String(value), valuePatterns);\n}\n\nexport function evaluatePackageFieldRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const requireRules = toArray(rulesConfig.require_package_fields);\n const forbidRules = toArray(rulesConfig.forbid_package_fields);\n if (requireRules.length === 0 && forbidRules.length === 0) return [];\n\n const pkg = readPackageJson(repoPath);\n const violations: RuleViolation[] = [];\n\n for (const rule of requireRules) {\n const lookups = rule.patterns.map((p) => ({\n path: p,\n ...getFieldAtPath(pkg, p),\n }));\n const satisfied = lookups.some(\n (l) => l.exists && (!rule.values || valueMatches(l.value, rule.values)),\n );\n if (!satisfied) {\n // Prefer reporting a present-but-mismatched field over a missing one\n const mismatch = rule.values ? lookups.find((l) => l.exists) : undefined;\n violations.push({\n type: 'require_package_fields',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n fieldPath: mismatch?.path,\n actualValue:\n mismatch && typeof mismatch.value !== 'object'\n ? String(mismatch.value)\n : undefined,\n });\n }\n }\n\n for (const rule of forbidRules) {\n for (const pattern of rule.patterns) {\n const lookup = getFieldAtPath(pkg, pattern);\n const hit =\n lookup.exists &&\n (!rule.values || valueMatches(lookup.value, rule.values));\n if (hit) {\n violations.push({\n type: 'forbid_package_fields',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n fieldPath: pattern,\n actualValue:\n lookup.value !== null && typeof lookup.value !== 'object'\n ? String(lookup.value)\n : undefined,\n });\n }\n }\n }\n\n return violations;\n}\n","import semver from 'semver';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateEngineVersion(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const rules = toArray(rulesConfig.engine_version);\n if (rules.length === 0) {\n return [];\n }\n\n const pkg = readPackageJson(repoPath);\n const nodeRange = (pkg?.engines as Record<string, string> | undefined)?.node;\n\n return rules.flatMap((rule): RuleViolation[] => {\n if (!nodeRange) {\n return [\n {\n type: 'engine_version',\n severity: rule.severity,\n patterns: [],\n message: rule.message ?? 'engines.node not specified in package.json',\n matchedFiles: [],\n requiredRange: rule.range,\n },\n ];\n }\n\n const minVer = semver.minVersion(nodeRange);\n if (!minVer || !semver.satisfies(minVer, rule.range)) {\n return [\n {\n type: 'engine_version',\n severity: rule.severity,\n patterns: [],\n message: rule.message,\n matchedFiles: [],\n installedRange: nodeRange,\n requiredRange: rule.range,\n },\n ];\n }\n\n return [];\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport type { RuleViolation } from './shared';\n\nconst CODEOWNERS_LOCATIONS = [\n '.github/CODEOWNERS',\n 'CODEOWNERS',\n 'docs/CODEOWNERS',\n];\n\nexport interface CodeownersEntry {\n /** as written in the CODEOWNERS file */\n pattern: string;\n /** translated micromatch patterns */\n globs: string[];\n /** may be empty ā an empty list un-assigns ownership for matching files */\n owners: string[];\n}\n\n/** First existing location, GitHub search order. Null if none exist. */\nexport function findCodeownersFile(repoPath: string): string | null {\n for (const location of CODEOWNERS_LOCATIONS) {\n const full = path.join(repoPath, location);\n if (fs.existsSync(full)) return full;\n }\n return null;\n}\n\n/** Parses content into entries; skips blank lines and # comments. */\nexport function parseCodeowners(content: string): CodeownersEntry[] {\n const entries: CodeownersEntry[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n const tokens = line.split(/\\s+/);\n const pattern = tokens[0];\n const owners = tokens.slice(1);\n\n entries.push({\n pattern,\n globs: codeownersPatternToGlobs(pattern),\n owners,\n });\n }\n\n return entries;\n}\n\n/**\n * Translates a CODEOWNERS (gitignore-style) pattern into micromatch glob(s).\n *\n * Rules:\n * - `*` alone matches everything.\n * - A leading `/`, or a `/` anywhere in the middle of the pattern, anchors\n * the match to the repo root (the leading `/` is stripped once anchored).\n * - A pattern with no anchoring gets a `**\\/` prefix so it matches at any depth.\n * - A trailing `/` restricts the match to a directory, so `/**` is appended.\n * - A bare name (no glob characters, no slash at all) also matches as a\n * directory anywhere, so the `/**` directory variant is added alongside\n * the plain match.\n */\nexport function codeownersPatternToGlobs(pattern: string): string[] {\n if (pattern === '*') return ['**'];\n\n let p = pattern;\n\n const hadLeadingSlash = p.startsWith('/');\n if (hadLeadingSlash) p = p.slice(1);\n\n const hadTrailingSlash = p.endsWith('/') && p.length > 1;\n if (hadTrailingSlash) p = p.slice(0, -1);\n\n const hasInternalSlash = p.includes('/');\n const anchored = hadLeadingSlash || hasInternalSlash;\n const hasGlobChars = /[*?[\\]{}!()]/.test(p);\n const isBareName = !anchored && !hasGlobChars && !hadTrailingSlash;\n\n const base = anchored ? p : `**/${p}`;\n const globs = [hadTrailingSlash ? `${base}/**` : base];\n\n if (isBareName) {\n globs.push(`${base}/**`);\n }\n\n return globs;\n}\n\n/** Last matching entry wins; owned iff that entry has >= 1 owner. */\nexport function fileIsOwned(file: string, entries: CodeownersEntry[]): boolean {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (micromatch.isMatch(file, entries[i].globs, { dot: true })) {\n return entries[i].owners.length > 0;\n }\n }\n return false;\n}\n\nexport function evaluateCodeowners(\n repoPath: string,\n rulesConfig: RulesConfig,\n scannedFiles: string[],\n): RuleViolation[] {\n const rule = rulesConfig.codeowners;\n if (!rule) return [];\n\n const filePath = findCodeownersFile(repoPath);\n if (!filePath) {\n return [\n {\n type: 'codeowners',\n severity: rule.severity,\n patterns: CODEOWNERS_LOCATIONS,\n message: rule.message,\n matchedFiles: [],\n },\n ];\n }\n\n const entries = parseCodeowners(fs.readFileSync(filePath, 'utf-8'));\n const relFiles = scannedFiles.map((f) =>\n (path.isAbsolute(f) ? path.relative(repoPath, f) : f).replace(/\\\\/g, '/'),\n );\n const unowned = relFiles.filter((f) => !fileIsOwned(f, entries));\n if (unowned.length === 0) return [];\n\n return [\n {\n type: 'codeowners',\n severity: rule.severity,\n patterns: [path.basename(filePath)],\n message: rule.message,\n matchedFiles: unowned,\n },\n ];\n}\n","import type { RulesConfig } from '../config/types';\nimport { evaluateFileRules } from './file-rules';\nimport { evaluateScriptRules } from './script-rules';\nimport { evaluatePackageFieldRules } from './package-field-rules';\nimport { evaluateEngineVersion } from './engine-version';\nimport { evaluateCodeowners } from './codeowners';\n\nexport type { RuleViolation } from './shared';\nexport { toArray } from './shared';\n\nexport function evaluateRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n excludes: string[],\n scannedFiles: string[] = [],\n): import('./shared').RuleViolation[] {\n return [\n ...evaluateFileRules(repoPath, rulesConfig, excludes),\n ...evaluateScriptRules(repoPath, rulesConfig),\n ...evaluatePackageFieldRules(repoPath, rulesConfig),\n ...evaluateEngineVersion(repoPath, rulesConfig),\n ...evaluateCodeowners(repoPath, rulesConfig, scannedFiles),\n ];\n}\n","import micromatch from 'micromatch';\nimport type { HermexConfig } from '../config/types';\nimport type { RuleViolation } from '../rules/evaluator';\nimport { toArray } from '../rules/evaluator';\nimport type { PackageDistribution } from './package-distribution';\n\nexport interface BannedPackageViolation {\n packageName: string;\n severity: 'error' | 'warn' | 'info';\n message?: string;\n}\n\nexport function detectBannedPackages(\n distribution: PackageDistribution[],\n config?: HermexConfig,\n): BannedPackageViolation[] {\n const forbidRules = toArray(config?.rules.forbid_packages);\n if (forbidRules.length === 0) {\n return [];\n }\n\n const violations: BannedPackageViolation[] = [];\n for (const pkg of distribution) {\n for (const rule of forbidRules) {\n if (micromatch.isMatch(pkg.packageName, rule.patterns)) {\n violations.push({\n packageName: pkg.packageName,\n severity: rule.severity,\n message: rule.message,\n });\n break;\n }\n }\n }\n return violations;\n}\n\nexport function detectRequiredPackages(\n distribution: PackageDistribution[],\n versions: Record<string, string>,\n config?: HermexConfig,\n): RuleViolation[] {\n const requireRules = toArray(config?.rules.require_packages);\n if (requireRules.length === 0) return [];\n\n // All package names available: from lockfile versions + from import distribution\n const installedNames = new Set([\n ...Object.keys(versions),\n ...distribution.map((p) => p.packageName),\n ]);\n\n const violations: RuleViolation[] = [];\n for (const rule of requireRules) {\n const satisfied = rule.patterns.some((p) =>\n [...installedNames].some((name) => micromatch.isMatch(name, p)),\n );\n if (!satisfied) {\n violations.push({\n type: 'require_packages',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n });\n }\n }\n return violations;\n}\n","import type { UsageReport } from '../swc-parser';\n\nexport interface PatternCount {\n patternType: string;\n displayName: string;\n count: number;\n}\n\nexport function countPatterns(\n report: UsageReport,\n patternMap: Map<string, number>,\n) {\n increment(\n patternMap,\n 'imports.default',\n report.patterns.imports.default.length,\n );\n increment(patternMap, 'imports.named', report.patterns.imports.named.length);\n increment(\n patternMap,\n 'imports.namespace',\n report.patterns.imports.namespace.length,\n );\n increment(\n patternMap,\n 'imports.aliased',\n report.patterns.imports.aliased.length,\n );\n increment(patternMap, 'usage.jsx', report.patterns.usage.jsx.length);\n increment(\n patternMap,\n 'usage.variables',\n report.patterns.usage.variables.length,\n );\n increment(\n patternMap,\n 'usage.destructuring',\n report.patterns.usage.destructuring.length,\n );\n increment(\n patternMap,\n 'usage.conditional',\n report.patterns.usage.conditional.length,\n );\n increment(patternMap, 'usage.arrays', report.patterns.usage.arrays.length);\n increment(patternMap, 'usage.objects', report.patterns.usage.objects.length);\n increment(patternMap, 'advanced.lazy', report.patterns.advanced.lazy.length);\n increment(\n patternMap,\n 'advanced.dynamic',\n report.patterns.advanced.dynamic.length,\n );\n increment(patternMap, 'advanced.hoc', report.patterns.advanced.hoc.length);\n increment(patternMap, 'advanced.memo', report.patterns.advanced.memo.length);\n increment(\n patternMap,\n 'advanced.forwardRef',\n report.patterns.advanced.forwardRef.length,\n );\n increment(\n patternMap,\n 'advanced.portal',\n report.patterns.advanced.portal.length,\n );\n}\n\nfunction increment(map: Map<string, number>, key: string, value: number) {\n map.set(key, (map.get(key) || 0) + value);\n}\n\nexport function getPatternDisplayName(patternType: string): string {\n const displayNames: Record<string, string> = {\n 'imports.default': 'Default Imports',\n 'imports.named': 'Named Imports',\n 'imports.namespace': 'Namespace Imports',\n 'imports.aliased': 'Aliased Imports',\n 'usage.jsx': 'JSX Usage',\n 'usage.variables': 'Variable Assignments',\n 'usage.destructuring': 'Destructuring',\n 'usage.conditional': 'Conditional Usage',\n 'usage.arrays': 'Array Mappings',\n 'usage.objects': 'Object Mappings',\n 'advanced.lazy': 'Lazy Loading',\n 'advanced.dynamic': 'Dynamic Imports',\n 'advanced.hoc': 'Higher-Order Components',\n 'advanced.memo': 'Memoized Components',\n 'advanced.forwardRef': 'Forward Refs',\n 'advanced.portal': 'Portal Usage',\n };\n return displayNames[patternType] || patternType;\n}\n","import type { VersusConfig } from '../config/types';\nimport type { PackageDistribution } from './package-distribution';\n\nfunction toPercentage(count: number, total: number): number {\n return total > 0 ? (count / total) * 100 : 0;\n}\n\nexport interface VersusEntry {\n packageName: string;\n count: number;\n percentage: number;\n components: string[];\n}\n\nexport interface VersusResult {\n name: string;\n packages: string[];\n entries: VersusEntry[];\n totalCount: number;\n}\n\nexport function calculateVersusResults(\n distribution: PackageDistribution[],\n versusConfigs: VersusConfig[],\n): VersusResult[] {\n const distMap = new Map(distribution.map((p) => [p.packageName, p]));\n\n return versusConfigs.map((vc) => {\n const entries: VersusEntry[] = vc.packages.map((pkgName) => {\n const pkg = distMap.get(pkgName);\n return {\n packageName: pkgName,\n count: pkg?.usageCount ?? 0,\n percentage: 0,\n components: pkg?.components ?? [],\n };\n });\n\n const totalCount = entries.reduce((sum, e) => sum + e.count, 0);\n\n for (const entry of entries) {\n entry.percentage = toPercentage(entry.count, totalCount);\n }\n\n entries.sort((a, b) => b.count - a.count);\n\n return { name: vc.name, packages: vc.packages, entries, totalCount };\n });\n}\n","import type { UsageReport } from '../swc-parser';\nimport type { HermexConfig } from '../config/types';\nimport type { MultiVersionMap } from '../lock-parser';\nimport type { RuleViolation } from '../rules/evaluator';\nimport type {\n ComponentUsage,\n PackageDistribution,\n} from './package-distribution';\nimport {\n calculatePackageDistribution,\n findComponentSource,\n} from './package-distribution';\nimport type { BannedPackageViolation } from './package-rules';\nimport { detectBannedPackages, detectRequiredPackages } from './package-rules';\nimport type { PatternCount } from './pattern-counter';\nimport { countPatterns, getPatternDisplayName } from './pattern-counter';\nimport type { VersusResult } from './versus';\nimport { calculateVersusResults } from './versus';\n\nexport interface AggregatedReport {\n filesAnalyzed: number;\n totalImports: number;\n totalComponents: number;\n totalUsagePatterns: number;\n patternCounts: PatternCount[];\n componentUsage: Map<string, ComponentUsage>;\n topComponents: ComponentUsage[];\n allComponents: string[];\n packageDistribution: PackageDistribution[];\n versusResults: VersusResult[];\n ruleViolations: RuleViolation[];\n bannedPackageViolations: BannedPackageViolation[];\n reports: UsageReport[];\n}\n\nexport function aggregateReports(\n reports: UsageReport[],\n versions: Record<string, string> = {},\n config?: HermexConfig,\n multiVersions: MultiVersionMap = {},\n): AggregatedReport {\n const componentUsageMap = new Map<string, ComponentUsage>();\n let totalImports = 0;\n let totalUsagePatterns = 0;\n const patternCountMap = new Map<string, number>();\n\n const availablePackages = Object.keys(versions);\n\n for (const report of reports) {\n totalImports += report.summary.totalImports;\n totalUsagePatterns += report.summary.totalUsagePatterns;\n\n for (const jsx of report.patterns.usage.jsx) {\n const key = jsx.component;\n const existing = componentUsageMap.get(key);\n\n if (existing) {\n existing.count++;\n existing.files.add(report.filePath);\n } else {\n const source = findComponentSource(\n jsx.component,\n report,\n availablePackages,\n );\n componentUsageMap.set(key, {\n name: jsx.component,\n source,\n count: 1,\n files: new Set([report.filePath]),\n });\n }\n }\n\n countPatterns(report, patternCountMap);\n }\n\n const topComponents = Array.from(componentUsageMap.values()).sort(\n (a, b) => b.count - a.count,\n );\n\n const allComponents = Array.from(componentUsageMap.keys()).sort();\n\n const patternCounts = Array.from(patternCountMap.entries())\n .map(([type, count]) => ({\n patternType: type,\n displayName: getPatternDisplayName(type),\n count,\n }))\n .sort((a, b) => b.count - a.count);\n\n const packageDistribution = calculatePackageDistribution(\n componentUsageMap,\n versions,\n config,\n multiVersions,\n );\n\n const versusResults = calculateVersusResults(\n packageDistribution,\n config?.versus ?? [],\n );\n const bannedPackageViolations = detectBannedPackages(\n packageDistribution,\n config,\n );\n\n const requiredPackageViolations = detectRequiredPackages(\n packageDistribution,\n versions,\n config,\n );\n\n return {\n filesAnalyzed: reports.length,\n totalImports,\n totalComponents: componentUsageMap.size,\n totalUsagePatterns,\n patternCounts,\n componentUsage: componentUsageMap,\n topComponents,\n allComponents,\n packageDistribution,\n versusResults,\n ruleViolations: requiredPackageViolations,\n bannedPackageViolations,\n reports,\n };\n}\n","import chalk from 'chalk';\nimport type { ParseError } from '../swc-parser/types';\n\nexport function printErrors(errors: ParseError[], isJson: boolean): void {\n if (errors.length === 0) return;\n const stream = isJson ? process.stderr : process.stdout;\n stream.write(chalk.yellow(`\\nā ${errors.length} file(s) failed to parse:\\n`));\n for (const { file, message } of errors) {\n stream.write(chalk.yellow(` ${file}\\n`));\n stream.write(chalk.gray(` ${message}\\n`));\n }\n stream.write('\\n');\n}\n","import fs from 'fs';\nimport { glob } from 'glob';\n\n/**\n * Find files matching a glob pattern\n * @param pattern - Glob pattern\n * @param ignorePatterns - Glob pattenrs to ignore\n * @returns Array of file paths\n */\nexport async function findFiles(\n pattern: string | string[],\n ignorePatterns: string[],\n): Promise<string[]> {\n const files = await glob(pattern, {\n ignore: ignorePatterns,\n nodir: true,\n windowsPathsNoEscape: true,\n });\n\n return files.map((f) => f.replace(/\\\\/g, '/'));\n}\n\n/**\n * Read file content\n * @param filePath - Path to file\n * @returns File content\n */\nexport function readFile(filePath: string): string {\n return fs.readFileSync(filePath, 'utf8');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction canonicalPackageName(pkgPath: string): string {\n // pkgPath examples:\n // \"node_modules/react\"\n // \"node_modules/@scope/pkg\"\n // \"node_modules/react/node_modules/scheduler\"\n // \"node_modules/@scope/a/node_modules/@scope/b\"\n // We want the last segment after the last \"node_modules/\"\n const idx = pkgPath.lastIndexOf('node_modules/');\n if (idx === -1) return pkgPath;\n return pkgPath.slice(idx + 'node_modules/'.length);\n}\n\nexport class NpmLockfileAdapter implements LockfileAdapter {\n name = 'npm';\n supportedVersions = ['v2', 'v3'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'package-lock.json');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = JSON.parse(content);\n const versions: Record<string, string> = {};\n\n // npm v7+ uses \"packages\" field (lockfileVersion 2, 3)\n if (lockData.packages) {\n Object.entries(lockData.packages).forEach(\n ([pkgPath, pkgData]: [string, any]) => {\n if (!pkgPath || pkgPath === '') return;\n\n // Only root-level packages (no nested node_modules in path)\n if (pkgPath.split('node_modules/').length > 2) return;\n\n const pkgName = canonicalPackageName(pkgPath);\n if (pkgData.version) {\n versions[pkgName] = pkgData.version;\n }\n },\n );\n }\n\n // npm v6 uses \"dependencies\" field (fallback)\n if (lockData.dependencies && Object.keys(versions).length === 0) {\n function extractVersions(deps: any, prefix = ''): void {\n Object.entries(deps).forEach(([name, data]: [string, any]) => {\n const fullName = prefix ? `${prefix}/${name}` : name;\n if (data.version) {\n versions[fullName] = data.version;\n }\n if (data.dependencies) {\n extractVersions(data.dependencies, fullName);\n }\n });\n }\n extractVersions(lockData.dependencies);\n }\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse package-lock.json: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = JSON.parse(content);\n const versionSets: Record<string, Set<string>> = {};\n\n if (lockData.packages) {\n Object.entries(lockData.packages).forEach(\n ([pkgPath, pkgData]: [string, any]) => {\n if (!pkgPath || pkgPath === '') return;\n\n const pkgName = canonicalPackageName(pkgPath);\n const version = (pkgData as any).version;\n if (!version) return;\n\n if (!versionSets[pkgName]) versionSets[pkgName] = new Set();\n versionSets[pkgName].add(version);\n },\n );\n }\n\n const result: MultiVersionMap = {};\n for (const [pkg, versions] of Object.entries(versionSets)) {\n result[pkg] = Array.from(versions).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { load } from 'js-yaml';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction parsePackageKey(\n rawKey: string,\n): { name: string; version: string } | null {\n const key = rawKey.startsWith('/') ? rawKey.slice(1) : rawKey;\n const withoutPeerSuffix = key.replace(/\\(.*\\)$/, '');\n\n const atMatch = withoutPeerSuffix.match(/^(.+)@(\\d+\\.\\d+\\.\\d+[^/]*)$/);\n if (atMatch) return { name: atMatch[1], version: atMatch[2] };\n\n const slashMatch = withoutPeerSuffix.match(/^(.+?)\\/(\\d+\\.\\d+\\.\\d+.*)$/);\n if (slashMatch) return { name: slashMatch[1], version: slashMatch[2] };\n\n return null;\n}\n\nexport class PnpmLockfileAdapter implements LockfileAdapter {\n name = 'pnpm';\n supportedVersions = ['v5', 'v6', 'v9'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'pnpm-lock.yaml');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = load(content) as any;\n const versions: Record<string, string> = {};\n\n // pnpm v9+ uses \"importers\" field\n if (lockData.importers) {\n const rootImporter = lockData.importers['.'];\n if (rootImporter) {\n // Parse dependencies\n if (rootImporter.dependencies) {\n for (const [name, data] of Object.entries(\n rootImporter.dependencies,\n )) {\n if (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data\n ) {\n versions[name] = (data as any).version;\n }\n }\n }\n // Parse devDependencies\n if (rootImporter.devDependencies) {\n for (const [name, data] of Object.entries(\n rootImporter.devDependencies,\n )) {\n if (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data\n ) {\n versions[name] = (data as any).version;\n }\n }\n }\n }\n }\n\n // pnpm v6-8 uses \"packages\" field\n if (lockData.packages && Object.keys(versions).length === 0) {\n Object.keys(lockData.packages).forEach((key) => {\n // Key format: \"/@babel/core/7.22.5\" or \"/package/1.0.0\"\n const match = key.match(/\\/(.+?)\\/(\\d+\\.\\d+\\.\\d+.*?)(?:_|$)/);\n if (match) {\n const [, pkgName, version] = match;\n versions[pkgName] = version;\n }\n });\n }\n\n // pnpm v5 uses \"dependencies\" and \"specifiers\"\n if (lockData.dependencies && Object.keys(versions).length === 0) {\n Object.entries(lockData.dependencies).forEach(\n ([name, versionSpec]: [string, any]) => {\n // versionSpec format: \"1.0.0\" or \"link:../package\"\n if (\n typeof versionSpec === 'string' &&\n !versionSpec.startsWith('link:')\n ) {\n versions[name] = versionSpec;\n } else if (typeof versionSpec === 'object' && versionSpec.version) {\n versions[name] = versionSpec.version;\n }\n },\n );\n }\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse pnpm-lock.yaml: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = load(content) as any;\n const versionSets: Record<string, Set<string>> = {};\n\n if (lockData.packages) {\n Object.keys(lockData.packages).forEach((key) => {\n const parsed = parsePackageKey(key);\n if (!parsed) return;\n if (!versionSets[parsed.name]) versionSets[parsed.name] = new Set();\n versionSets[parsed.name].add(parsed.version);\n });\n }\n\n const result: MultiVersionMap = {};\n for (const [pkg, versions] of Object.entries(versionSets)) {\n result[pkg] = Array.from(versions).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport lockfile from '@yarnpkg/lockfile';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction extractPackageName(key: string): string {\n if (key.startsWith('@')) {\n const match = key.match(/^(@[^@]+\\/[^@]+)@/);\n return match ? match[1] : key;\n }\n const match = key.match(/^([^@]+)@/);\n return match ? match[1] : key;\n}\n\nexport class YarnLockfileAdapter implements LockfileAdapter {\n name = 'yarn';\n supportedVersions = ['v1', 'v2+'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'yarn.lock');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const parsed = lockfile.parse(content);\n\n if (parsed.type !== 'success') {\n console.warn('Warning: Failed to parse yarn.lock');\n return {};\n }\n\n const versions: Record<string, string> = {};\n\n Object.entries(parsed.object).forEach(([key, value]: [string, any]) => {\n const pkgName = extractPackageName(key);\n\n if (value.version && !versions[pkgName]) {\n versions[pkgName] = value.version;\n }\n });\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse yarn.lock: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const parsed = lockfile.parse(content);\n\n if (parsed.type !== 'success') {\n return {};\n }\n\n const versionSets: Record<string, Set<string>> = {};\n\n Object.entries(parsed.object).forEach(([key, value]: [string, any]) => {\n if (!value.version) return;\n const pkgName = extractPackageName(key);\n if (!versionSets[pkgName]) versionSets[pkgName] = new Set();\n versionSets[pkgName].add(value.version);\n });\n\n const result: MultiVersionMap = {};\n for (const [pkg, vers] of Object.entries(versionSets)) {\n result[pkg] = Array.from(vers).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import { NpmLockfileAdapter } from './patterns/npm';\nimport { PnpmLockfileAdapter } from './patterns/pnpm';\nimport { YarnLockfileAdapter } from './patterns/yarn';\nimport type { LockfileAdapter, MultiVersionMap } from './lock-file-adapter';\n\nexport type { MultiVersionMap };\n\nexport interface VersionConflict {\n packageName: string;\n versions: string[];\n}\n\nexport interface LockfileResult {\n versions: Record<string, string>;\n multiVersions: MultiVersionMap;\n versionConflicts: VersionConflict[];\n lockfileType: 'npm' | 'yarn' | 'pnpm' | null;\n lockfilePath: string | null;\n supportedVersions: string[];\n}\n\nconst LOCKFILE_ADAPTERS: LockfileAdapter[] = [\n new NpmLockfileAdapter(),\n new YarnLockfileAdapter(),\n new PnpmLockfileAdapter(),\n];\n\n/**\n * Find and parse the appropriate lockfile in a directory\n * @param projectPath - Path to the project directory\n * @returns Object with versions map and lockfile type\n */\nexport function findAndParseLockfile(projectPath: string): LockfileResult {\n for (const adapter of LOCKFILE_ADAPTERS) {\n const lockfilePath = adapter.detect(projectPath);\n if (lockfilePath) {\n const versions = adapter.parse(lockfilePath);\n const multiVersions = adapter.parseMultiVersion\n ? adapter.parseMultiVersion(lockfilePath)\n : {};\n\n const versionConflicts: VersionConflict[] = Object.entries(multiVersions)\n .filter(([, vers]) => vers.length > 1)\n .map(([packageName, vers]) => ({ packageName, versions: vers }));\n\n return {\n versions,\n multiVersions,\n versionConflicts,\n lockfileType: adapter.name as 'npm' | 'yarn' | 'pnpm',\n lockfilePath,\n supportedVersions: adapter.supportedVersions,\n };\n }\n }\n\n throw new Error('No supported lockfile found');\n}\n\n/**\n * Get the version of a specific package from lockfile\n * @param projectPath - Path to the project directory\n * @param packageName - Name of the package\n * @returns Version string or null if not found\n */\nexport function getPackageVersion(\n projectPath: string,\n packageName: string,\n): string | null {\n const { versions } = findAndParseLockfile(projectPath);\n return versions[packageName] || null;\n}\n\n/**\n * Get versions for multiple packages\n * @param projectPath - Path to the project directory\n * @param packageNames - Array of package names\n * @returns Map of package names to versions\n */\nexport function getPackageVersions(\n projectPath: string,\n packageNames: string[],\n): Record<string, string> {\n const { versions } = findAndParseLockfile(projectPath);\n const result: Record<string, string> = {};\n\n packageNames.forEach((pkgName) => {\n if (versions[pkgName]) {\n result[pkgName] = versions[pkgName];\n }\n });\n\n return result;\n}\n","import type { RegistryPackageInfo } from './types';\n\nexport async function fetchPackageInfo(\n name: string,\n registryUrl: string,\n authToken?: string,\n): Promise<RegistryPackageInfo | null> {\n const url = `${registryUrl.replace(/\\/$/, '')}/${encodeURIComponent(name).replace('%40', '@')}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10_000);\n\n try {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as RegistryPackageInfo;\n return data;\n } catch {\n clearTimeout(timeoutId);\n return null;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport type { RegistryPackageInfo } from './types';\nimport { fetchPackageInfo } from './client';\n\nconst DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst DEFAULT_CACHE_DIR = join(homedir(), '.hermex', 'cache', 'npm');\n\nexport interface CacheOptions {\n /** Time-to-live for cache entries, in milliseconds. Default: 1 hour. */\n ttlMs?: number;\n /** Override the cache root directory ā primarily for tests. */\n cacheDir?: string;\n /** Fully disable cache reads and writes (falls straight through to a live fetch). */\n disabled?: boolean;\n}\n\ninterface CacheEntry {\n cachedAt: number;\n registryUrl: string;\n packageName: string;\n data: RegistryPackageInfo;\n}\n\nfunction cachePathFor(\n registryUrl: string,\n packageName: string,\n options?: CacheOptions,\n): string {\n const root = options?.cacheDir ?? DEFAULT_CACHE_DIR;\n const host = new URL(registryUrl).host.replace(/:/g, '_');\n const fileName = `${encodeURIComponent(packageName)}.json`;\n return join(root, host, fileName);\n}\n\nexport async function readCache(\n registryUrl: string,\n packageName: string,\n options?: CacheOptions,\n): Promise<RegistryPackageInfo | null> {\n const ttlMs = options?.ttlMs ?? DEFAULT_TTL_MS;\n try {\n const path = cachePathFor(registryUrl, packageName, options);\n const raw = await readFile(path, 'utf8');\n const entry = JSON.parse(raw) as CacheEntry;\n\n if (\n entry.registryUrl !== registryUrl ||\n entry.packageName !== packageName\n ) {\n return null;\n }\n if (Date.now() - entry.cachedAt >= ttlMs) return null;\n\n return entry.data;\n } catch {\n return null;\n }\n}\n\nexport async function writeCache(\n registryUrl: string,\n packageName: string,\n data: RegistryPackageInfo,\n options?: CacheOptions,\n): Promise<void> {\n const finalPath = cachePathFor(registryUrl, packageName, options);\n const tmpPath = `${finalPath}.tmp-${randomUUID()}`;\n\n try {\n await mkdir(dirname(finalPath), { recursive: true });\n const entry: CacheEntry = {\n cachedAt: Date.now(),\n registryUrl,\n packageName,\n data,\n };\n await writeFile(tmpPath, JSON.stringify(entry), 'utf8');\n await rename(tmpPath, finalPath);\n } catch {\n try {\n await unlink(tmpPath);\n } catch {\n // best-effort cleanup only\n }\n }\n}\n\nexport async function getPackageInfo(\n packageName: string,\n registryUrl: string,\n authToken?: string,\n options?: CacheOptions,\n): Promise<RegistryPackageInfo | null> {\n const cacheEnabled = !authToken && !options?.disabled;\n\n if (cacheEnabled) {\n const cached = await readCache(registryUrl, packageName, options);\n if (cached) return cached;\n }\n\n const info = await fetchPackageInfo(packageName, registryUrl, authToken);\n if (info && cacheEnabled) {\n await writeCache(registryUrl, packageName, info, options);\n }\n return info;\n}\n","import semver from 'semver';\nimport micromatch from 'micromatch';\nimport type { PackageDistribution } from '../utils/aggregator';\nimport type { ReleaseAgeConfig } from '../config/types';\nimport type {\n AvailableUpgrade,\n ReleaseAgeEntry,\n SemverBump,\n UpgradeLevel,\n} from './types';\nimport { getPackageInfo, type CacheOptions } from './cache';\n\nconst CONCURRENCY = 8;\n\nfunction daysSince(dateStr: string): number {\n const ms = Date.now() - new Date(dateStr).getTime();\n return Math.floor(ms / (1000 * 60 * 60 * 24));\n}\n\nfunction classifyBump(installed: string, candidate: string): SemverBump | null {\n const diff = semver.diff(installed, candidate);\n if (!diff) return null;\n if (diff === 'patch' || diff === 'prepatch') return 'patch';\n if (diff === 'minor' || diff === 'preminor') return 'minor';\n if (diff === 'major' || diff === 'premajor') return 'major';\n return null;\n}\n\nfunction upgradeLevel(\n daysAgo: number,\n bump: SemverBump,\n thresholds: ReleaseAgeConfig['thresholds'],\n): UpgradeLevel | null {\n const threshold = thresholds[bump];\n if (threshold === false || threshold === undefined) return null;\n if (daysAgo > threshold) {\n // major bump past its threshold ā mandatory, minor/patch ā needs\n return bump === 'major' ? 'mandatory_upgrade' : 'needs_upgrade';\n }\n return null;\n}\n\nfunction computeReleaseAge(\n installedVersion: string,\n timeMap: Record<string, string>,\n deprecated: string | undefined,\n thresholds: ReleaseAgeConfig['thresholds'],\n distTags: Record<string, string> | undefined,\n severity: 'error' | 'warn',\n): ReleaseAgeEntry {\n const byBump = new Map<SemverBump, { version: string; daysAgo: number }[]>();\n let minCompliantVersion: string | undefined;\n let minCompliantReleasedDaysAgo: number | undefined;\n\n for (const [version, dateStr] of Object.entries(timeMap)) {\n if (version === 'created' || version === 'modified') continue;\n if (!semver.valid(version)) continue;\n if (semver.prerelease(version)) continue;\n if (semver.lte(version, installedVersion)) continue;\n\n const bump = classifyBump(installedVersion, version);\n if (!bump) continue;\n\n const daysAgo = daysSince(dateStr);\n const list = byBump.get(bump) ?? [];\n list.push({ version, daysAgo });\n byBump.set(bump, list);\n\n // Track the oldest release, at whichever bump tier it belongs to, that's\n // still within that tier's configured age threshold (#21) ā generalizes\n // what was previously a patch-only check to all three tiers, since the\n // same \"is this candidate old enough to be safely adopted\" question\n // applies identically to patch, minor, and major bumps, just against a\n // different configured threshold per tier.\n const threshold = thresholds[bump];\n if (\n threshold !== false &&\n threshold !== undefined &&\n daysAgo <= threshold &&\n (minCompliantReleasedDaysAgo === undefined ||\n daysAgo > minCompliantReleasedDaysAgo)\n ) {\n minCompliantVersion = version;\n minCompliantReleasedDaysAgo = daysAgo;\n }\n }\n\n // A bump tier is \"breached\" if its oldest available version is older than the\n // tier's threshold ā report the newest version in that tier as the upgrade\n // target, not the version that happened to trigger the breach.\n const upgrades: AvailableUpgrade[] = [];\n for (const [bump, versions] of byBump.entries()) {\n const oldestDaysAgo = Math.max(...versions.map((v) => v.daysAgo));\n const level = upgradeLevel(oldestDaysAgo, bump, thresholds);\n if (!level) continue;\n\n const newest = versions.reduce((a, b) => (a.daysAgo < b.daysAgo ? a : b));\n upgrades.push({\n version: newest.version,\n releasedDaysAgo: newest.daysAgo,\n semverBump: bump,\n level,\n });\n }\n\n const finalUpgrades = upgrades.sort(\n (a, b) => b.releasedDaysAgo - a.releasedDaysAgo,\n );\n\n const latestVersion = distTags?.['latest'];\n const latestEntry = latestVersion ? timeMap[latestVersion] : undefined;\n const latestReleasedDaysAgo = latestEntry\n ? daysSince(latestEntry)\n : undefined;\n\n for (const upgrade of finalUpgrades) {\n if (latestVersion && upgrade.version === latestVersion) {\n upgrade.isLatest = true;\n }\n }\n\n const worstLevel: UpgradeLevel | null = finalUpgrades.some(\n (u) => u.level === 'mandatory_upgrade',\n )\n ? 'mandatory_upgrade'\n : finalUpgrades.length > 0\n ? 'needs_upgrade'\n : null;\n\n return {\n installedVersion,\n upgrades: finalUpgrades,\n worstLevel,\n deprecated,\n latestVersion,\n latestReleasedDaysAgo,\n minCompliantVersion,\n minCompliantReleasedDaysAgo,\n severity,\n };\n}\n\nexport async function enrichWithReleaseAge(\n packages: PackageDistribution[],\n config: ReleaseAgeConfig,\n): Promise<{ enriched: PackageDistribution[]; skipped: number }> {\n const registryUrl = config.registry;\n const authToken =\n config.authToken ?? process.env['HERMEX_REGISTRY_AUTH_TOKEN'];\n const targets = packages.filter((p) => !p.internal && p.version);\n const enriched = [...packages];\n let skipped = 0;\n\n const envTtl = Number(process.env['HERMEX_REGISTRY_CACHE_TTL_MS']);\n const cacheOptions: CacheOptions = {\n ttlMs: Number.isFinite(envTtl) && envTtl > 0 ? envTtl : config.cacheTtlMs,\n disabled:\n process.env['HERMEX_REGISTRY_CACHE_DISABLED'] === '1' ||\n config.cacheDisabled === true,\n };\n\n // Process in batches of CONCURRENCY\n for (let i = 0; i < targets.length; i += CONCURRENCY) {\n const batch = targets.slice(i, i + CONCURRENCY);\n const results = await Promise.all(\n batch.map(async (pkg) => {\n const info = await getPackageInfo(\n pkg.packageName,\n registryUrl,\n authToken,\n cacheOptions,\n );\n if (!info || !info.time) {\n skipped++;\n return { pkg, entry: null };\n }\n\n const deprecated =\n info.versions?.[pkg.version!]?.deprecated ?? info.deprecated;\n\n const severity: 'error' | 'warn' =\n config.enforceOn.length === 0 ||\n micromatch.isMatch(pkg.packageName, config.enforceOn)\n ? 'error'\n : 'warn';\n\n const entry = computeReleaseAge(\n pkg.version!,\n info.time,\n typeof deprecated === 'string' ? deprecated : undefined,\n config.thresholds,\n info['dist-tags'],\n severity,\n );\n\n return { pkg, entry };\n }),\n );\n\n for (const { pkg, entry } of results) {\n if (!entry) continue;\n const idx = enriched.findIndex((p) => p.packageName === pkg.packageName);\n if (idx !== -1) {\n enriched[idx] = { ...enriched[idx], releaseAge: entry };\n }\n }\n }\n\n return { enriched, skipped };\n}\n","import type { Ora } from 'ora';\nimport chalk from 'chalk';\nimport { parseFile } from '../swc-parser';\nimport type { UsageReport } from '../swc-parser';\nimport type { ParseError } from '../swc-parser/types';\nimport { aggregateReports } from '../utils/aggregator';\nimport type { AggregatedReport } from '../utils/aggregator';\nimport { printErrors } from '../utils/print-errors';\nimport { findFiles } from '../utils/file-utils';\nimport { findAndParseLockfile } from '../lock-parser';\nimport { evaluateRules } from '../rules/evaluator';\nimport { enrichWithReleaseAge } from '../npm-registry/enricher';\nimport type { HermexConfig } from '../config/types';\n\nconst DECLARATION_FILE_RE = /\\.d\\.(ts|mts|cts)$/;\n\nfunction isDeclarationFile(filePath: string): boolean {\n return DECLARATION_FILE_RE.test(filePath);\n}\n\n/**\n * Runs the shared parse ā aggregate ā rules ā release-age pipeline used by\n * both `scan` and `comply`. Returns `null` if no files matched (the spinner\n * has already reported the failure); throws on unexpected errors.\n */\nexport async function runPipeline(\n config: HermexConfig,\n spinner: Ora,\n isJson: boolean,\n): Promise<AggregatedReport | null> {\n const lockfileResult = findAndParseLockfile(process.cwd());\n\n spinner.succeed(\n chalk.blue(\n `š¦ Found ${lockfileResult.lockfileType} lockfile (supports: ${lockfileResult.supportedVersions.join(', ')}) - ${Object.keys(lockfileResult.versions).length} packages`,\n ),\n );\n\n spinner.start('Finding files...');\n const discovered = await findFiles(config.includes, config.excludes);\n const files = discovered.filter((f) => !isDeclarationFile(f));\n\n if (files.length === 0) {\n spinner.fail(\n chalk.red(\n `No files found matching includes: ${config.includes.join(', ')}`,\n ),\n );\n return null;\n }\n\n spinner.succeed(chalk.green(` Found ${files.length} files`));\n\n spinner.start('Analyzing files...');\n const reports: UsageReport[] = [];\n const parseErrors: ParseError[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n spinner.text = `Analyzing files... (${i + 1}/${files.length})`;\n\n try {\n const report = parseFile(file);\n if (report) {\n reports.push(report);\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n parseErrors.push({ file, message });\n }\n }\n\n spinner.succeed(\n chalk.green(\n `Analysis complete! Analyzed ${reports.length}/${files.length} files`,\n ),\n );\n\n printErrors(parseErrors, isJson);\n\n const aggregated = aggregateReports(\n reports,\n lockfileResult.versions,\n config,\n lockfileResult.multiVersions,\n );\n\n const evaluatorViolations = evaluateRules(\n process.cwd(),\n config.rules,\n config.excludes,\n files,\n );\n aggregated.ruleViolations = [\n ...aggregated.ruleViolations,\n ...evaluatorViolations,\n ];\n\n if (config.releaseAge.enabled) {\n spinner.start('Fetching release age from registry...');\n const { enriched, skipped } = await enrichWithReleaseAge(\n aggregated.packageDistribution,\n config.releaseAge,\n );\n aggregated.packageDistribution = enriched;\n spinner.succeed(\n chalk.blue(\n `š
Release age fetched${skipped > 0 ? chalk.gray(` (${skipped} packages skipped ā registry unreachable or not found)`) : ''}`,\n ),\n );\n }\n\n return aggregated;\n}\n","import ora from 'ora';\nimport type { Ora } from 'ora';\nimport chalk from 'chalk';\nimport { getVersion } from '../utils/version';\nimport type { HermexConfig } from '../config/types';\n\nexport interface CommandContext {\n isJson: boolean;\n spinner: Ora;\n}\n\n/**\n * Shared command preamble: routes human-readable chrome (version line,\n * spinner) to stderr when the command emits JSON on stdout.\n */\nexport function createCommandContext(config: HermexConfig): CommandContext {\n const isJson = config.output.format === 'json';\n const stream = isJson ? process.stderr : process.stdout;\n stream.write(chalk.gray(`hermex v${getVersion()}\\n`));\n const spinner = ora({ text: 'Parsing lockfile...', stream }).start();\n return { isJson, spinner };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { aggregateReports } from '../utils/aggregator';\nimport { printSummary } from '../utils/print-summary';\nimport { printDetails } from '../utils/print-details';\nimport { printComponents } from '../utils/print-components';\nimport { printPatterns } from '../utils/print-patterns';\nimport { printPackages } from '../utils/print-packages';\nimport { printVersus } from '../utils/print-versus';\nimport { printRules } from '../utils/print-rules';\nimport { printJson } from '../utils/print-json';\nimport { loadConfig } from '../config/loader';\nimport { runPipeline } from './pipeline';\nimport { createCommandContext } from './command-context';\nimport type { HermexConfig } from '../config/types';\n\nexport function registerScanCommand(program: Command) {\n program\n .command('scan')\n .description('Scan and analyze local files')\n .option(\n '--config <path>',\n 'Path to hermex config file (overrides CWD discovery)',\n )\n .action(async (options: { config?: string }) => {\n const config = await loadConfig(process.cwd(), options.config);\n await executeScan(config);\n });\n}\n\nexport async function executeScan(config: HermexConfig) {\n const { isJson, spinner } = createCommandContext(config);\n\n try {\n const aggregated = await runPipeline(config, spinner, isJson);\n if (!aggregated) return;\n\n if (isJson) {\n printJson(aggregated);\n } else {\n printScanResults(aggregated, config);\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red('Analysis failed: ' + message));\n process.exitCode = 1;\n }\n}\n\nfunction printScanResults(\n aggregated: ReturnType<typeof aggregateReports>,\n config: HermexConfig,\n) {\n if (config.output.packages) {\n printPackages(aggregated, config.output.packages);\n }\n\n if (config.output.versus) {\n printVersus(aggregated);\n }\n\n if (config.output.rules) {\n printRules(aggregated);\n }\n\n if (config.output.details) {\n printDetails(aggregated);\n }\n\n if (config.output.components) {\n printComponents(aggregated, config.output.components);\n }\n\n if (config.output.patterns) {\n printPatterns(aggregated, config.output.patterns);\n }\n\n if (config.output.summary) {\n printSummary(aggregated);\n }\n}\n","import chalk from 'chalk';\nimport type { ComplianceResult } from './compliance';\n\nexport function printComplianceVerdict(result: ComplianceResult): void {\n const mandatoryCount =\n result.errorRuleViolations.length +\n result.errorBannedPackageViolations.length +\n result.mandatoryReleaseAgeViolations.length;\n\n if (result.compliant) {\n console.log(chalk.greenBright.bold('\\nā COMPLIANT\\n'));\n return;\n }\n\n console.log(chalk.redBright.bold(`\\nā NOT COMPLIANT`));\n console.log(\n chalk.red(\n ` ${mandatoryCount} mandatory violation${mandatoryCount > 1 ? 's' : ''} found`,\n ),\n );\n\n if (result.mandatoryReleaseAgeViolations.length > 0) {\n console.log();\n for (const pkg of result.mandatoryReleaseAgeViolations) {\n const top = pkg.releaseAge?.upgrades[0];\n console.log(\n chalk.red(\n ` ā releaseAge ${pkg.packageName} is ${top?.semverBump} version behind (${top?.releasedDaysAgo}d) ā mandatory upgrade [ERROR]`,\n ),\n );\n }\n }\n\n console.log();\n}\n","import type { AggregatedReport } from './aggregator';\nimport type { RuleViolation } from '../rules/evaluator';\nimport type { BannedPackageViolation } from './package-rules';\nimport type { PackageDistribution } from './package-distribution';\n\nexport interface ComplianceResult {\n compliant: boolean;\n errorRuleViolations: RuleViolation[];\n errorBannedPackageViolations: BannedPackageViolation[];\n mandatoryReleaseAgeViolations: PackageDistribution[];\n}\n\n/**\n * A package is a mandatory compliance failure only when its releaseAge\n * severity is 'error' (i.e. it's in scope per `releaseAge.enforceOn`) AND\n * its worstLevel is 'mandatory_upgrade' ā 'needs_upgrade' (patch/minor) is\n * advisory even for enforced packages, matching the existing \"mandatory\"\n * vocabulary already used by upgradeLevel().\n */\nexport function computeCompliance(\n aggregated: AggregatedReport,\n): ComplianceResult {\n const errorRuleViolations = aggregated.ruleViolations.filter(\n (v) => v.severity === 'error',\n );\n const errorBannedPackageViolations =\n aggregated.bannedPackageViolations.filter((v) => v.severity === 'error');\n const mandatoryReleaseAgeViolations = aggregated.packageDistribution.filter(\n (p) =>\n p.releaseAge?.severity === 'error' &&\n p.releaseAge?.worstLevel === 'mandatory_upgrade',\n );\n\n return {\n compliant:\n errorRuleViolations.length === 0 &&\n errorBannedPackageViolations.length === 0 &&\n mandatoryReleaseAgeViolations.length === 0,\n errorRuleViolations,\n errorBannedPackageViolations,\n mandatoryReleaseAgeViolations,\n };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { printJson } from '../utils/print-json';\nimport { printRules } from '../utils/print-rules';\nimport { printPackages } from '../utils/print-packages';\nimport { printComplianceVerdict } from '../utils/print-compliance';\nimport { computeCompliance } from '../utils/compliance';\nimport { loadConfig } from '../config/loader';\nimport { runPipeline } from './pipeline';\nimport { createCommandContext } from './command-context';\nimport type { HermexConfig } from '../config/types';\n\nexport function registerComplyCommand(program: Command) {\n program\n .command('comply')\n .description(\n 'Check compliance with hermex.config.ts rules and release-age policy (exits non-zero if not compliant)',\n )\n .option(\n '--config <path>',\n 'Path to hermex config file (overrides CWD discovery)',\n )\n .action(async (options: { config?: string }) => {\n const config = await loadConfig(process.cwd(), options.config);\n await executeComply(config);\n });\n}\n\nexport async function executeComply(config: HermexConfig) {\n const { isJson, spinner } = createCommandContext(config);\n\n try {\n // Runs the full pipeline to completion regardless of violations found ā\n // comply must report everything in one pass, not fail on the first issue.\n const aggregated = await runPipeline(config, spinner, isJson);\n if (!aggregated) {\n process.exitCode = 2;\n return;\n }\n\n const compliance = computeCompliance(aggregated);\n\n if (isJson) {\n printJson(aggregated);\n } else {\n printRules(aggregated);\n if (config.releaseAge.enabled) {\n printPackages(aggregated, 'table');\n }\n printComplianceVerdict(compliance);\n }\n\n process.exitCode = compliance.compliant ? 0 : 1;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red('Compliance check failed: ' + message));\n process.exitCode = 2;\n }\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { registerScanCommand } from './commands/scan';\nimport { registerComplyCommand } from './commands/comply';\nimport { getVersion } from './utils/version';\n\nexport const program = new Command();\n\nprogram\n .name('hermex')\n .description('Analyze React component usage patterns in your codebase')\n .version(getVersion());\n\nregisterScanCommand(program);\nregisterComplyCommand(program);\n\nprogram.parse(process.argv);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["printHeader","printHeader","printHeader","printHeader","fs","path","path","fs","path","fs","path","fs","path","fs"],"sources":["../src/utils/format-utils.ts","../src/utils/print-summary.ts","../src/utils/print-details.ts","../src/utils/chart-renderer.ts","../src/utils/print-components.ts","../src/utils/print-patterns.ts","../src/utils/severity-format.ts","../src/utils/print-packages.ts","../src/utils/print-versus.ts","../src/utils/print-rules.ts","../src/utils/version.ts","../src/utils/print-json.ts","../src/config/schema.ts","../src/config/loader.ts","../src/swc-parser/core/state.ts","../src/swc-parser/patterns/imports.ts","../src/swc-parser/utils/jsx-helpers.ts","../src/swc-parser/patterns/props.ts","../src/swc-parser/patterns/jsx.ts","../src/swc-parser/utils/matchers.ts","../src/swc-parser/patterns/variables.ts","../src/swc-parser/patterns/conditionals.ts","../src/swc-parser/patterns/collections.ts","../src/swc-parser/patterns/lazy-dynamic.ts","../src/swc-parser/patterns/advanced.ts","../src/swc-parser/core/visitor.ts","../src/swc-parser/core/report.ts","../src/swc-parser/index.ts","../src/utils/package-distribution.ts","../src/rules/shared.ts","../src/rules/file-rules.ts","../src/rules/script-rules.ts","../src/rules/package-field-rules.ts","../src/rules/engine-version.ts","../src/rules/codeowners.ts","../src/rules/evaluator.ts","../src/utils/package-rules.ts","../src/utils/pattern-counter.ts","../src/utils/versus.ts","../src/utils/aggregator-core.ts","../src/utils/print-errors.ts","../src/utils/file-utils.ts","../src/lock-parser/patterns/npm.ts","../src/lock-parser/patterns/pnpm.ts","../src/lock-parser/patterns/yarn.ts","../src/lock-parser/index.ts","../src/npm-registry/client.ts","../src/npm-registry/cache.ts","../src/npm-registry/enricher.ts","../src/commands/pipeline.ts","../src/commands/command-context.ts","../src/commands/scan.ts","../src/utils/print-compliance.ts","../src/utils/compliance.ts","../src/commands/comply.ts","../src/cli.ts"],"sourcesContent":["/**\n * Format a number with thousand separators\n * @param num - Number to format\n * @returns Formatted string (e.g., 1,234,567)\n */\nexport function formatCount(num: number): string {\n return num.toLocaleString();\n}\n\n/**\n * Format duration in seconds to a readable string\n * @param seconds - Duration in seconds\n * @returns Formatted string (e.g., 10.21s, 1.57s, 0.12s)\n */\nexport function formatDuration(seconds: number): string {\n return `${seconds.toFixed(2)}s`;\n}\n\n/**\n * Format how far an upgrade candidate is past its age threshold\n * @returns Formatted string (e.g., \"40 days overdue\", \"1 day overdue\")\n */\nexport function formatDaysOverdue(\n releasedDaysAgo: number,\n thresholdDays: number,\n): string {\n const overdue = releasedDaysAgo - thresholdDays;\n return `${overdue} day${overdue === 1 ? '' : 's'} overdue`;\n}\n\n/**\n * Format how long until an upgrade candidate breaches its age threshold\n * @returns Formatted string (e.g., \"12 days remaining\", \"1 day remaining\")\n */\nexport function formatDaysRemaining(daysRemaining: number): string {\n return `${daysRemaining} day${daysRemaining === 1 ? '' : 's'} remaining`;\n}\n\n/**\n * Join a list of items, showing only the first `limit` and summarizing the rest\n * @returns Formatted string (e.g., \"a, b and 3 other files\", \"a, b and 1 other file\")\n */\nexport function formatTruncatedList(\n items: string[],\n noun: string,\n limit = 2,\n): string {\n const shown = items.slice(0, limit).join(', ');\n const rest = items.length - limit;\n if (rest <= 0) return shown;\n return `${shown} and ${rest} other ${noun}${rest === 1 ? '' : 's'}`;\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport } from './aggregator';\nimport { formatCount } from './format-utils';\n\nfunction printHeader() {\n console.log(chalk.green.bold('\\nš Summary\\n'));\n}\n\nexport function printSummary(aggregated: AggregatedReport) {\n printHeader();\n\n const table = new Table({\n head: ['Metric', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n // Calculate external components only (filter out unknown and local)\n const externalComponents = aggregated.topComponents.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n ).length;\n\n // Calculate total external package usage\n const totalExternalUsage = aggregated.packageDistribution.reduce(\n (sum, pkg) => sum + pkg.usageCount,\n 0,\n );\n\n table.push(\n ['Files Analyzed', formatCount(aggregated.filesAnalyzed)],\n ['External Packages', formatCount(aggregated.packageDistribution.length)],\n ['External Components', formatCount(externalComponents)],\n ['Total Usages', formatCount(totalExternalUsage)],\n );\n\n console.log(table.toString());\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport } from './aggregator';\nimport { formatCount } from './format-utils';\n\nfunction printHeader() {\n console.log(chalk.cyan.bold('\\nš Details\\n'));\n}\n\nexport function printDetails(aggregated: AggregatedReport) {\n printHeader();\n\n console.log(\n chalk.cyan(\n ` Total usage patterns: ${formatCount(aggregated.totalUsagePatterns)}`,\n ),\n );\n\n // Print each pattern type count\n for (const pattern of aggregated.patternCounts) {\n if (pattern.count > 0) {\n console.log(\n chalk.cyan(` ${pattern.displayName}: ${formatCount(pattern.count)}`),\n );\n }\n }\n}\n","import chalk from 'chalk';\nimport { formatCount } from './format-utils';\n\nexport interface ChartData {\n label: string;\n value: number;\n}\n\nexport interface ChartOptions {\n maxWidth?: number;\n showValues?: boolean;\n barChar?: string;\n emptyChar?: string;\n}\n\nexport function renderBarChart(data: ChartData[], options: ChartOptions = {}) {\n const {\n maxWidth = 50,\n showValues = true,\n barChar = 'ā',\n emptyChar = 'ā',\n } = options;\n\n if (data.length === 0) {\n console.log(chalk.gray(' No data to display'));\n return;\n }\n\n // Find max value for scaling\n const maxValue = Math.max(...data.map((d) => d.value));\n if (maxValue === 0) {\n console.log(chalk.gray(' All values are zero'));\n return;\n }\n\n // Find longest label for alignment\n const maxLabelLength = Math.max(...data.map((d) => d.label.length));\n\n // Render each bar\n for (const item of data) {\n const percentage = item.value / maxValue;\n const barLength = Math.round(percentage * maxWidth);\n const emptyLength = maxWidth - barLength;\n\n // Pad label\n const paddedLabel = item.label.padEnd(maxLabelLength, ' ');\n\n // Build bar\n const bar =\n chalk.green(barChar.repeat(barLength)) +\n chalk.gray(emptyChar.repeat(emptyLength));\n\n // Build value string\n const valueStr = showValues ? ` ${formatCount(item.value)}` : '';\n\n console.log(`${paddedLabel} ${bar}${valueStr}\\n`);\n }\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport, ComponentUsage } from './aggregator';\nimport { renderBarChart } from './chart-renderer';\n\nfunction printHeader() {\n console.log(chalk.magenta.bold('\\nāļø Components\\n'));\n}\n\nexport function printComponents(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const components = aggregated.topComponents;\n\n if (mode === 'table') {\n printComponentsTable(components);\n } else if (mode === 'chart') {\n printComponentsChart(components);\n }\n}\n\nfunction printComponentsTable(components: ComponentUsage[]) {\n printHeader();\n\n // Filter out unknown and local components - only show external packages\n const externalComponents = components.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n );\n\n if (externalComponents.length === 0) {\n console.log(chalk.gray(' No external components found'));\n return;\n }\n\n const table = new Table({\n head: ['Component', 'Package', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n externalComponents.forEach((comp) => {\n table.push([comp.name, comp.source, comp.count.toString()]);\n });\n\n console.log(table.toString());\n}\n\nfunction printComponentsChart(components: ComponentUsage[]) {\n printHeader();\n\n // Filter out unknown and local components - only show external packages\n const externalComponents = components.filter(\n (comp) => comp.source !== 'unknown' && comp.source !== 'local',\n );\n\n if (externalComponents.length === 0) {\n console.log(chalk.gray(' No external components found'));\n return;\n }\n\n const data = externalComponents.map((comp) => ({\n label: comp.name,\n value: comp.count,\n }));\n\n renderBarChart(data, { maxWidth: 50 });\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { AggregatedReport, PatternCount } from './aggregator';\nimport { renderBarChart } from './chart-renderer';\n\nfunction printHeader() {\n console.log(chalk.blue.bold('\\nš Code Patterns\\n'));\n}\n\nexport function printPatterns(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const patterns = aggregated.patternCounts.filter((p) => p.count > 0);\n\n if (mode === 'table') {\n printPatternsTable(patterns);\n } else if (mode === 'chart') {\n printPatternsChart(patterns);\n }\n}\n\nfunction printPatternsTable(patterns: PatternCount[]) {\n printHeader();\n\n if (patterns.length === 0) {\n console.log(chalk.gray(' No patterns found'));\n return;\n }\n\n const table = new Table({\n head: ['Pattern', 'Count'],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n patterns.forEach((pattern) => {\n table.push([pattern.displayName, pattern.count.toString()]);\n });\n\n console.log(table.toString());\n\n // Show total patterns count\n const totalPatterns = patterns.reduce((sum, p) => sum + p.count, 0);\n console.log(chalk.gray(`\\nTotal: ${totalPatterns} patterns detected`));\n}\n\nfunction printPatternsChart(patterns: PatternCount[]) {\n printHeader();\n\n if (patterns.length === 0) {\n console.log(chalk.gray(' No patterns found'));\n return;\n }\n\n const data = patterns.map((pattern) => ({\n label: pattern.displayName,\n value: pattern.count,\n }));\n\n renderBarChart(data, { maxWidth: 50 });\n}\n","import chalk from 'chalk';\n\nexport type DisplaySeverity = 'error' | 'warn' | 'info' | 'success';\n\nconst ICONS: Record<DisplaySeverity, string> = {\n error: 'š“',\n warn: 'š”',\n info: 'šµ',\n success: 'š¢',\n};\n\nconst COLORS: Record<DisplaySeverity, (text: string) => string> = {\n error: chalk.red,\n warn: chalk.yellow,\n info: chalk.blue,\n success: chalk.green,\n};\n\n/** Colored-circle glyph for a severity ā carries meaning without relying on ANSI color. */\nexport function severityIcon(severity: DisplaySeverity): string {\n return ICONS[severity];\n}\n\n/** chalk color function for a severity, for text that needs coloring. */\nexport function severityColor(\n severity: DisplaySeverity,\n): (text: string) => string {\n return COLORS[severity];\n}\n\nexport function formatViolationLine(opts: {\n icon: string;\n label: string;\n description: string;\n}): string {\n return ` ${opts.icon} ${opts.label.padEnd(14)} ${opts.description}`;\n}\n\n/**\n * Resolves an explicit color-on/off override from CLI flags or the NO_COLOR\n * convention (https://no-color.org). Returns `undefined` when there's no\n * explicit signal, meaning chalk's own auto-detection should be left alone\n * (including its GitHub-Actions-aware detection of non-TTY streams).\n */\nexport function resolveColorLevel(opts: {\n colorFlag?: boolean;\n noColorEnv?: string;\n}): 0 | 1 | undefined {\n if (opts.colorFlag === false) return 0;\n if (opts.colorFlag === true) return 1;\n if (opts.noColorEnv !== undefined) return 0;\n return undefined;\n}\n\n// oxlint-disable-next-line no-control-regex -- matching the ANSI escape byte is the point\nconst ANSI_ESCAPE_PATTERN = /\\x1b\\[[0-9;]*m/g;\n\nfunction stripAnsiWrites(stream: NodeJS.WriteStream): void {\n const originalWrite = stream.write.bind(stream);\n stream.write = ((chunk: unknown, ...rest: unknown[]) => {\n const stripped =\n typeof chunk === 'string'\n ? chunk.replace(ANSI_ESCAPE_PATTERN, '')\n : chunk;\n return (originalWrite as (...args: unknown[]) => boolean)(\n stripped,\n ...rest,\n );\n }) as typeof stream.write;\n}\n\n/**\n * Beyond setting chalk's own level, this strips ANSI codes at the stream\n * boundary when color is explicitly disabled. hermex also prints through\n * cli-table3 and ora (whose spinner symbols come from log-symbols/yoctocolors)\n * ā neither shares hermex's chalk instance or honors chalk.level, so mutating\n * chalk alone can't make NO_COLOR/--no-color hold for their output too.\n */\nexport function applyColorLevel(level: 0 | 1 | undefined): void {\n if (level === undefined) return;\n chalk.level = level;\n if (level === 0) {\n stripAnsiWrites(process.stdout);\n stripAnsiWrites(process.stderr);\n }\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type {\n AggregatedReport,\n BannedPackageViolation,\n PackageDistribution,\n} from './aggregator';\nimport type { ReleaseAgeEntry } from '../npm-registry/types';\nimport {\n formatCount,\n formatDaysOverdue,\n formatDaysRemaining,\n} from './format-utils';\nimport { severityIcon, severityColor } from './severity-format';\n\nfunction printHeader() {\n console.log(chalk.blueBright.bold('\\nš¦ Packages\\n'));\n}\n\nfunction formatPackageName(\n pkg: PackageDistribution,\n banned?: BannedPackageViolation,\n): string {\n let prefix = '';\n if (pkg.releaseAge?.deprecated) {\n prefix += severityColor('error')('[DEPRECATED] ');\n }\n if (banned) {\n prefix +=\n banned.severity === 'error'\n ? severityColor('error')('[BANNED] ')\n : severityColor('warn')('[RESTRICTED] ');\n } else if (pkg.internal) {\n prefix += severityColor('warn')('[int] ');\n }\n return prefix + pkg.packageName;\n}\n\nfunction formatUpgradeCell(releaseAge?: ReleaseAgeEntry): string {\n if (!releaseAge) return '';\n const { worstLevel, upgrades, severity, pendingUpgrade } = releaseAge;\n\n if (!worstLevel) {\n if (pendingUpgrade) {\n return `${severityIcon('info')} ${pendingUpgrade.semverBump} ${pendingUpgrade.version} (${formatDaysRemaining(pendingUpgrade.daysRemaining)})`;\n }\n return severityIcon('success');\n }\n\n const top = upgrades[0];\n if (!top) return severityIcon('success');\n\n const suffix = severity === 'warn' ? chalk.gray(' [not enforced]') : '';\n const overdue = formatDaysOverdue(top.releasedDaysAgo, top.thresholdDays);\n\n if (worstLevel === 'mandatory_upgrade') {\n const icon = severityIcon(severity === 'warn' ? 'warn' : 'error');\n return `${icon} ${top.semverBump} ${top.version} (${overdue})${suffix}`;\n }\n return `${severityIcon('warn')} ${top.semverBump} ${top.version} (${overdue})${suffix}`;\n}\n\nfunction getBannedViolation(\n pkg: PackageDistribution,\n violations: BannedPackageViolation[],\n): BannedPackageViolation | undefined {\n return violations.find((v) => v.packageName === pkg.packageName);\n}\n\nexport function printPackages(\n aggregated: AggregatedReport,\n mode: 'table' | 'chart',\n) {\n const packages = aggregated.packageDistribution;\n const violations = aggregated.bannedPackageViolations;\n\n if (mode === 'table') {\n printPackagesTable(packages, violations);\n } else if (mode === 'chart') {\n printPackagesChart(packages, violations);\n }\n}\n\nfunction printPackagesTable(\n packages: PackageDistribution[],\n violations: BannedPackageViolation[],\n) {\n printHeader();\n\n if (packages.length === 0) {\n console.log(chalk.gray(' No packages found'));\n return;\n }\n\n const hasReleaseAge = packages.some((p) => p.releaseAge !== undefined);\n const head = ['Package', 'Version', 'Components', 'Usage', 'Percentage'];\n if (hasReleaseAge) head.push('Upgrades');\n\n const table = new Table({\n head,\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n packages.forEach((pkg) => {\n const versionCell = pkg.hasVersionConflict\n ? chalk.yellow(\n `ā ${pkg.allVersions.join(', ')} (${pkg.allVersions.length} versions ā bundle impact)`,\n )\n : pkg.version || 'N/A';\n\n const row = [\n formatPackageName(pkg, getBannedViolation(pkg, violations)),\n versionCell,\n formatCount(pkg.componentCount),\n formatCount(pkg.usageCount),\n `${pkg.percentage.toFixed(1)}%`,\n ];\n if (hasReleaseAge) row.push(formatUpgradeCell(pkg.releaseAge));\n table.push(row);\n });\n\n console.log(table.toString());\n\n const totalComponents = packages.reduce(\n (sum, p) => sum + p.componentCount,\n 0,\n );\n const totalExternalUsage = packages.reduce((sum, p) => sum + p.usageCount, 0);\n console.log(\n chalk.gray(\n `\\nTotal: ${formatCount(packages.length)} packages | ${formatCount(totalComponents)} unique components | ${formatCount(totalExternalUsage)} total usages`,\n ),\n );\n}\n\nfunction printPackagesChart(\n packages: PackageDistribution[],\n violations: BannedPackageViolation[],\n) {\n printHeader();\n\n if (packages.length === 0) {\n console.log(chalk.gray(' No packages found'));\n return;\n }\n\n const maxBarWidth = 40;\n const maxPercentage = Math.max(...packages.map((p) => p.percentage));\n const maxLabelLength = Math.max(\n ...packages.map((p) => p.packageName.length + (p.internal ? 6 : 0)),\n );\n\n packages.forEach((pkg) => {\n const barLength = Math.round(\n (pkg.percentage / maxPercentage) * maxBarWidth,\n );\n const emptyLength = maxBarWidth - barLength;\n const label = formatPackageName(\n pkg,\n getBannedViolation(pkg, violations),\n ).padEnd(maxLabelLength, ' ');\n\n const bar =\n chalk.green('ā'.repeat(barLength)) + chalk.gray('ā'.repeat(emptyLength));\n\n console.log(\n `${label} ${bar} ${chalk.bold(pkg.percentage.toFixed(1) + '%')} (${pkg.usageCount})`,\n );\n });\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport, VersusResult } from './aggregator';\nimport { formatTruncatedList } from './format-utils';\n\nconst BAR_WIDTH = 30;\n\nfunction renderBar(percentage: number): string {\n const filled = Math.round((percentage / 100) * BAR_WIDTH);\n const empty = BAR_WIDTH - filled;\n return chalk.cyan('ā'.repeat(filled)) + chalk.gray('ā'.repeat(empty));\n}\n\nfunction printVersusResult(result: VersusResult) {\n console.log(chalk.bold(` ${result.name}`));\n console.log(chalk.gray(` ${'ā'.repeat(50)}`));\n\n const maxNameLen = Math.max(\n ...result.entries.map((e) => e.packageName.length),\n );\n\n for (const entry of result.entries) {\n const name = entry.packageName.padEnd(maxNameLen);\n const bar = renderBar(entry.percentage);\n const pct = chalk.bold(`${entry.percentage.toFixed(1)}%`);\n const usage = chalk.gray(`(${entry.count} usages)`);\n const components =\n entry.components.length > 0\n ? chalk.gray(` ${formatTruncatedList(entry.components, 'component')}`)\n : '';\n\n console.log(` ${name} ${bar} ${pct} ${usage}${components}`);\n }\n\n if (result.totalCount === 0) {\n console.log(\n chalk.gray(' No usage detected for any package in this group.'),\n );\n }\n\n console.log();\n}\n\nexport function printVersus(aggregated: AggregatedReport) {\n if (aggregated.versusResults.length === 0) return;\n\n console.log(chalk.magentaBright.bold('\\nāļø Versus\\n'));\n\n for (const result of aggregated.versusResults) {\n printVersusResult(result);\n }\n}\n","import chalk from 'chalk';\nimport type { AggregatedReport } from './aggregator';\nimport type { RuleViolation } from '../rules/evaluator';\nimport { formatTruncatedList } from './format-utils';\nimport { severityIcon, formatViolationLine } from './severity-format';\n\nfunction formatRuleType(type: RuleViolation['type']): string {\n switch (type) {\n case 'detect_files':\n return 'detect_files';\n case 'require_files':\n return 'require_files';\n case 'require_packages':\n return 'require_packages';\n case 'require_scripts':\n return 'require_scripts';\n case 'require_package_fields':\n return 'package_fields';\n case 'forbid_package_fields':\n return 'package_fields';\n case 'engine_version':\n return 'engine_version';\n case 'codeowners':\n return 'codeowners';\n }\n}\n\nfunction describeViolation(v: RuleViolation): string {\n const patterns = v.patterns.join(', ');\n const suffix = v.message ? chalk.gray(` ā ${v.message}`) : '';\n\n if (v.type === 'detect_files') {\n const files = v.matchedFiles.map((f) => {\n const parts = f.replace(/\\\\/g, '/').split('/');\n return parts[parts.length - 1];\n });\n return `${patterns} detected (${formatTruncatedList(files, 'file')})${suffix}`;\n }\n\n if (v.type === 'require_files') return `${patterns} not found${suffix}`;\n if (v.type === 'require_packages')\n return `${patterns} not installed${suffix}`;\n if (v.type === 'require_scripts')\n return `script ${patterns} missing in package.json${suffix}`;\n if (v.type === 'require_package_fields') {\n if (v.fieldPath && v.actualValue !== undefined)\n return `field ${v.fieldPath} is ${chalk.yellow(v.actualValue)}, does not match required value${suffix}`;\n return `field ${patterns} missing in package.json${suffix}`;\n }\n if (v.type === 'forbid_package_fields')\n return `field ${v.fieldPath ?? patterns} is forbidden in package.json${suffix}`;\n\n if (v.type === 'engine_version') {\n if (!v.installedRange)\n return `engines.node not specified (required ${v.requiredRange})${suffix}`;\n return `engines.node is ${chalk.yellow(v.installedRange)}, required ${chalk.cyan(v.requiredRange)}${suffix}`;\n }\n\n if (v.type === 'codeowners') {\n if (v.matchedFiles.length === 0)\n return `CODEOWNERS not found (looked in ${patterns})${suffix}`;\n return `${v.matchedFiles.length} scanned file(s) have no owner: ${formatTruncatedList(v.matchedFiles, 'file')}${suffix}`;\n }\n\n return `${patterns} not present${suffix}`;\n}\n\nexport function printRules(aggregated: AggregatedReport): void {\n const { ruleViolations, bannedPackageViolations } = aggregated;\n const hasRuleViolations = ruleViolations.length > 0;\n const hasBannedViolations = bannedPackageViolations.length > 0;\n\n if (!hasRuleViolations && !hasBannedViolations) {\n console.log(\n chalk.greenBright.bold(`\\n${severityIcon('success')} Compliance\\n`),\n );\n console.log(chalk.gray(' All compliance checks passed'));\n return;\n }\n\n console.log(chalk.blueBright.bold('\\nš Compliance\\n'));\n\n if (hasRuleViolations) {\n for (const v of ruleViolations) {\n console.log(\n formatViolationLine({\n icon: severityIcon(v.severity),\n label: formatRuleType(v.type),\n description: describeViolation(v),\n }),\n );\n }\n }\n\n if (hasBannedViolations) {\n for (const v of bannedPackageViolations) {\n const msg = v.message ? chalk.gray(` ā ${v.message}`) : '';\n console.log(\n formatViolationLine({\n icon: severityIcon(v.severity),\n label: 'forbid_packages',\n description: `${v.packageName} is forbidden${msg}`,\n }),\n );\n }\n }\n\n const errorCount = [\n ...ruleViolations.filter((v) => v.severity === 'error'),\n ...bannedPackageViolations.filter((v) => v.severity === 'error'),\n ].length;\n const warnCount = [\n ...ruleViolations.filter((v) => v.severity === 'warn'),\n ...bannedPackageViolations.filter((v) => v.severity === 'warn'),\n ].length;\n\n const parts: string[] = [];\n if (errorCount > 0)\n parts.push(chalk.red(`${errorCount} error${errorCount > 1 ? 's' : ''}`));\n if (warnCount > 0)\n parts.push(chalk.yellow(`${warnCount} warning${warnCount > 1 ? 's' : ''}`));\n console.log(chalk.gray(`\\n ${parts.join(', ')}`));\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\n\nlet cachedVersion: string | undefined;\n\n/**\n * Walks up from `dir` to find the nearest package.json.\n * Needed because this module's own path differs between the tsdown-bundled\n * single-file `dist/cli.mjs` and the unbundled source used by tests.\n */\nfunction findPackageJson(dir: string): string {\n let current = dir;\n while (true) {\n const candidate = path.join(current, 'package.json');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(`Could not locate package.json above ${dir}`);\n }\n current = parent;\n }\n}\n\nexport function getVersion(): string {\n if (cachedVersion) return cachedVersion;\n\n const dir = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = findPackageJson(dir);\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version: string };\n\n cachedVersion = pkg.version;\n return cachedVersion;\n}\n","import type { AggregatedReport } from './aggregator';\nimport { getVersion } from './version';\n\nexport function printJson(aggregated: AggregatedReport): void {\n const result = {\n version: getVersion(),\n summary: {\n filesAnalyzed: aggregated.filesAnalyzed,\n totalImports: aggregated.totalImports,\n totalComponents: aggregated.totalComponents,\n totalUsagePatterns: aggregated.totalUsagePatterns,\n },\n packages: aggregated.packageDistribution,\n components: aggregated.topComponents.map((c) => ({\n ...c,\n files: [...c.files],\n })),\n patterns: aggregated.patternCounts,\n versus: aggregated.versusResults,\n ruleViolations: aggregated.ruleViolations,\n bannedPackageViolations: aggregated.bannedPackageViolations,\n };\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n}\n","import { z } from 'zod';\n\n// āā Sub-schemas āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nconst RuleSeveritySchema = z.enum(['error', 'warn', 'info']);\n\nconst RuleConfigSchema = z.object({\n severity: RuleSeveritySchema,\n patterns: z.array(z.string()),\n message: z.string().optional(),\n});\n\nconst RuleConfigOrArraySchema = z.union([\n RuleConfigSchema,\n z.array(RuleConfigSchema),\n]);\n\nconst PackageFieldRuleSchema = RuleConfigSchema.extend({\n /** Optional micromatch patterns the field's stringified value must match */\n values: z.array(z.string()).optional(),\n});\n\nconst PackageFieldRuleOrArraySchema = z.union([\n PackageFieldRuleSchema,\n z.array(PackageFieldRuleSchema),\n]);\n\nconst EngineVersionRuleSchema = z.object({\n severity: RuleSeveritySchema,\n range: z.string(),\n message: z.string().optional(),\n});\n\nconst CodeownersRuleSchema = z.object({\n severity: RuleSeveritySchema,\n message: z.string().optional(),\n});\n\nconst ThresholdSchema = z.union([z.number(), z.literal(false)]);\n\n// āā Main schema with defaults āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport const HermexConfigSchema = z.object({\n includes: z.array(z.string()).default(['**/*.{tsx,jsx,ts,js}']),\n excludes: z\n .array(z.string())\n .default(['**/node_modules/**', '**/dist/**', '**/build/**']),\n\n packages: z\n .object({\n internal: z.array(z.string()).default([]),\n ignore: z.array(z.string()).default([]),\n })\n .default(() => ({ internal: [], ignore: [] })),\n\n versus: z\n .array(z.object({ name: z.string(), packages: z.array(z.string()).min(2) }))\n .default([]),\n\n rules: z\n .object({\n detect_files: RuleConfigOrArraySchema.default([]),\n require_files: RuleConfigOrArraySchema.default([]),\n forbid_packages: RuleConfigOrArraySchema.default([]),\n require_packages: RuleConfigOrArraySchema.default([]),\n require_scripts: RuleConfigOrArraySchema.default([]),\n require_package_fields: PackageFieldRuleOrArraySchema.default([]),\n forbid_package_fields: PackageFieldRuleOrArraySchema.default([]),\n engine_version: z\n .union([EngineVersionRuleSchema, z.array(EngineVersionRuleSchema)])\n .optional(),\n codeowners: CodeownersRuleSchema.optional(),\n })\n .default(() => ({\n detect_files: [] as RuleConfig[],\n require_files: [] as RuleConfig[],\n forbid_packages: [] as RuleConfig[],\n require_packages: [] as RuleConfig[],\n require_scripts: [] as RuleConfig[],\n require_package_fields: [] as PackageFieldRule[],\n forbid_package_fields: [] as PackageFieldRule[],\n })),\n\n output: z\n .object({\n summary: z.union([z.literal('log'), z.literal(false)]).default('log'),\n components: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n packages: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n patterns: z\n .union([z.enum(['table', 'chart']), z.literal(false)])\n .default('table'),\n details: z.boolean().default(false),\n versus: z.boolean().default(true),\n rules: z.boolean().default(true),\n format: z.enum(['human', 'json']).default('human'),\n })\n .default(() => ({\n summary: 'log' as const,\n components: 'table' as const,\n packages: 'table' as const,\n patterns: 'table' as const,\n details: false,\n versus: true,\n rules: true,\n format: 'human' as const,\n })),\n\n releaseAge: z\n .object({\n enabled: z.boolean().default(false),\n registry: z.string().default('https://registry.npmjs.org'),\n authToken: z.string().optional(),\n thresholds: z\n .object({\n patch: ThresholdSchema.default(30),\n minor: ThresholdSchema.default(45),\n major: ThresholdSchema.default(60),\n })\n .default(() => ({ patch: 30, minor: 45, major: 60 })),\n enforceOn: z.array(z.string()).default([]),\n cacheTtlMs: z.number().int().positive().optional(),\n cacheDisabled: z.boolean().default(false),\n })\n .default(() => ({\n enabled: false,\n registry: 'https://registry.npmjs.org',\n thresholds: { patch: 30, minor: 45, major: 60 },\n enforceOn: [],\n cacheDisabled: false,\n })),\n});\n\n// āā Derived types āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n/** Config as returned after parsing ā all defaults applied, all fields required */\nexport type HermexConfig = z.infer<typeof HermexConfigSchema>;\n\n/** Config as accepted by the user ā everything optional */\nexport type HermexConfigInput = z.input<typeof HermexConfigSchema>;\n\n// Sub-types derived from the output shape so they can never drift from the schema\nexport type RuleSeverity = z.infer<typeof RuleSeveritySchema>;\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\nexport type PackageFieldRule = z.infer<typeof PackageFieldRuleSchema>;\nexport type EngineVersionRule = z.infer<typeof EngineVersionRuleSchema>;\nexport type CodeownersRule = z.infer<typeof CodeownersRuleSchema>;\nexport type PackagesConfig = HermexConfig['packages'];\nexport type VersusConfig = HermexConfig['versus'][number];\nexport type RulesConfig = HermexConfig['rules'];\nexport type OutputConfig = HermexConfig['output'];\nexport type ReleaseAgeConfig = HermexConfig['releaseAge'];\nexport type ReleaseAgeThresholds = HermexConfig['releaseAge']['thresholds'];\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { HermexConfigSchema } from './schema';\nimport type { HermexConfig } from './schema';\n\nexport async function loadConfig(\n cwd: string,\n explicitPath?: string,\n): Promise<HermexConfig> {\n const configPath = explicitPath\n ? resolve(explicitPath)\n : join(cwd, 'hermex.config.ts');\n\n if (explicitPath && !existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n if (existsSync(configPath)) {\n const mod = await import(pathToFileURL(configPath).href);\n return HermexConfigSchema.parse(mod.default ?? mod);\n }\n\n return HermexConfigSchema.parse({});\n}\n","import type { ParserState, UsagePatterns } from '../types';\n\nexport function createState(): ParserState {\n const usagePatterns: UsagePatterns = {\n namedImports: new Set(),\n namespaceImports: new Set(),\n defaultImports: new Set(),\n aliasedImports: new Map(),\n variableAssignments: new Map(),\n lazyImports: new Set(),\n dynamicImports: new Set(),\n conditionalUsage: new Set(),\n arrayMappings: new Set(),\n objectMappings: new Set(),\n hocUsage: new Set(),\n forwardedRefs: new Set(),\n memoizedComponents: new Set(),\n portalUsage: new Set(),\n jsxUsage: new Map(),\n destructuredUsage: new Set(),\n propsAnalysis: new Map(),\n };\n\n return {\n usagePatterns,\n componentNames: new Set(),\n allIdentifiers: new Set(),\n };\n}\n","import type { ImportDeclaration } from '@swc/core';\nimport type { ParserState } from '../types';\n\n/**\n * Analyzes import declarations and tracks all types:\n * - Default imports\n * - Named imports\n * - Namespace imports\n * - Aliased imports\n */\nexport function analyzeImportDeclaration(\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const source = node.source.value;\n\n for (const spec of node.specifiers) {\n switch (spec.type) {\n case 'ImportDefaultSpecifier':\n analyzeDefaultImport(spec, source, node, state);\n break;\n\n case 'ImportNamespaceSpecifier':\n analyzeNamespaceImport(spec, source, node, state);\n break;\n\n case 'ImportSpecifier':\n analyzeNamedImport(spec, source, node, state);\n break;\n }\n }\n}\n\nfunction analyzeDefaultImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const name = spec.local.value;\n\n state.usagePatterns.defaultImports.add({\n name,\n source,\n line: node.span?.start || 0,\n });\n\n state.componentNames.add(name);\n}\n\nfunction analyzeNamespaceImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const name = spec.local.value;\n\n state.usagePatterns.namespaceImports.add({\n name,\n source,\n line: node.span?.start || 0,\n });\n\n state.allIdentifiers.add(name);\n}\n\nfunction analyzeNamedImport(\n spec: any,\n source: string,\n node: ImportDeclaration,\n state: ParserState,\n): void {\n const importedName = spec.imported ? spec.imported.value : spec.local.value;\n const localName = spec.local.value;\n\n state.usagePatterns.namedImports.add({\n name: importedName,\n source,\n line: node.span?.start || 0,\n });\n\n // Track aliases\n if (importedName !== localName) {\n state.usagePatterns.aliasedImports.set(localName, {\n imported: importedName,\n local: localName,\n source,\n line: node.span?.start || 0,\n });\n }\n\n state.componentNames.add(localName);\n}\n","import type { ParserState } from '../types';\n\n/**\n * Extracts the name from a JSX element (handles identifiers and member expressions)\n */\nexport function getJSXElementName(nameNode: any): string {\n if (!nameNode) return '';\n\n switch (nameNode.type) {\n case 'Identifier':\n return nameNode.value;\n case 'JSXMemberExpression':\n return `${getJSXElementName(nameNode.object)}.${nameNode.property.value}`;\n default:\n return '';\n }\n}\n\n/**\n * Checks if a JSX member expression is a known component\n */\nexport function isMemberExpressionComponent(\n nameNode: any,\n state: ParserState,\n): boolean {\n if (nameNode?.type === 'JSXMemberExpression') {\n const objectName = getJSXElementName(nameNode.object);\n return state.allIdentifiers.has(objectName);\n }\n return false;\n}\n\n/**\n * Extracts props from JSX attributes\n */\nexport function extractJSXProps(attributes: any[]): Array<{\n name: string;\n value: any;\n isSpread?: boolean;\n}> {\n if (!attributes) return [];\n\n return attributes\n .map((attr) => {\n if (attr.type === 'JSXAttribute') {\n return {\n name: attr.name?.value || attr.name?.name?.value,\n value: extractJSXAttributeValue(attr.value),\n };\n }\n if (attr.type === 'SpreadElement') {\n return {\n name: '...',\n value: '[spread]',\n isSpread: true,\n };\n }\n return null;\n })\n .filter(Boolean) as Array<{\n name: string;\n value: any;\n isSpread?: boolean;\n }>;\n}\n\n/**\n * Extracts value from JSX attribute\n */\nexport function extractJSXAttributeValue(value: any): any {\n if (!value) return true; // boolean attribute\n\n switch (value.type) {\n case 'StringLiteral':\n return value.value;\n case 'JSXExpressionContainer':\n return extractExpressionValue(value.expression);\n default:\n return '[complex]';\n }\n}\n\n/**\n * Extracts a readable value from an expression\n */\nexport function extractExpressionValue(expr: any): any {\n if (!expr) return '[unknown]';\n\n switch (expr.type) {\n case 'StringLiteral':\n case 'NumericLiteral':\n case 'BooleanLiteral':\n return expr.value;\n case 'Identifier':\n return `{${expr.value}}`;\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n return '[function]';\n case 'ObjectExpression':\n return '[object]';\n case 'ArrayExpression':\n return '[array]';\n default:\n return '[expression]';\n }\n}\n\n/**\n * Determines the context where a component is being used\n */\nexport function getUsageContext(parent: any): string {\n if (!parent) return 'direct';\n\n switch (parent.type) {\n case 'ConditionalExpression':\n return 'conditional';\n case 'ArrayExpression':\n return 'array';\n case 'ObjectExpression':\n return 'object';\n case 'CallExpression':\n return 'hoc';\n case 'VariableDeclarator':\n return 'variable';\n default:\n return 'jsx';\n }\n}\n","import type { PropsAnalysis, PropDetail, ParserState } from '../types';\n\n/**\n * Analyzes props in detail for a component\n */\nexport function analyzePropsInDetail(\n attributes: any[],\n componentName: string,\n state: ParserState,\n): PropsAnalysis {\n const analysis: PropsAnalysis = {\n namedProps: [],\n hasSpread: false,\n hasComplexProps: false,\n hasEventHandlers: false,\n propDetails: [],\n };\n\n if (!attributes) return analysis;\n\n for (const attr of attributes) {\n if (attr.type === 'JSXAttribute') {\n const propName = attr.name?.value || attr.name?.name?.value;\n if (propName) {\n analysis.namedProps.push(propName);\n\n const propDetail: PropDetail = {\n name: propName,\n type: getPropType(attr.value),\n isEventHandler: propName.startsWith('on'),\n isComplex: isComplexProp(attr.value),\n };\n\n if (propDetail.isEventHandler) {\n analysis.hasEventHandlers = true;\n }\n if (propDetail.isComplex) {\n analysis.hasComplexProps = true;\n }\n\n analysis.propDetails.push(propDetail);\n }\n } else if (attr.type === 'SpreadElement') {\n analysis.hasSpread = true;\n analysis.propDetails.push({\n name: '...',\n type: 'spread',\n isSpread: true,\n isComplex: true,\n isEventHandler: false,\n warning: 'Spread props cannot be statically analyzed',\n });\n analysis.hasComplexProps = true;\n }\n }\n\n // Store in state\n state.usagePatterns.propsAnalysis.set(componentName, analysis);\n\n return analysis;\n}\n\n/**\n * Determines the type of a prop value\n */\nfunction getPropType(value: any): string {\n if (!value) return 'boolean';\n\n switch (value.type) {\n case 'StringLiteral':\n return 'string';\n case 'JSXExpressionContainer': {\n const expr = value.expression;\n if (!expr) return 'unknown';\n switch (expr.type) {\n case 'NumericLiteral':\n return 'number';\n case 'BooleanLiteral':\n return 'boolean';\n case 'StringLiteral':\n return 'string';\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n return 'function';\n case 'ObjectExpression':\n return 'object';\n case 'ArrayExpression':\n return 'array';\n case 'Identifier':\n return 'variable';\n default:\n return 'expression';\n }\n }\n default:\n return 'unknown';\n }\n}\n\n/**\n * Checks if a prop value is complex (object, array, call, conditional)\n */\nfunction isComplexProp(value: any): boolean {\n if (!value) return false;\n if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression;\n if (!expr) return false;\n return (\n expr.type === 'ObjectExpression' ||\n expr.type === 'ArrayExpression' ||\n expr.type === 'CallExpression' ||\n expr.type === 'ConditionalExpression'\n );\n }\n return false;\n}\n","import type { ParserState, JSXUsage } from '../types';\nimport {\n getJSXElementName,\n isMemberExpressionComponent,\n extractJSXProps,\n getUsageContext,\n} from '../utils/jsx-helpers';\nimport { analyzePropsInDetail } from './props';\n\n/**\n * Analyzes JSX element usage\n */\nexport function analyzeJSXElement(node: any, state: ParserState): void {\n if (node.opening) {\n analyzeJSXOpeningElement(node.opening, state, node);\n }\n}\n\n/**\n * Analyzes JSX opening element and tracks component usage\n */\nexport function analyzeJSXOpeningElement(\n node: any,\n state: ParserState,\n parent?: any,\n): void {\n const elementName = getJSXElementName(node.name);\n\n // Check if this is a known component\n if (\n !state.componentNames.has(elementName) &&\n !isMemberExpressionComponent(node.name, state)\n ) {\n return;\n }\n\n const propsAnalysis = analyzePropsInDetail(\n node.attributes,\n elementName,\n state,\n );\n const usage: JSXUsage = {\n component: elementName,\n props: extractJSXProps(node.attributes).map((p) => p.name),\n propsAnalysis,\n line: node.span?.start || 0,\n context: getUsageContext(parent),\n };\n\n // Track JSX usage\n if (!state.usagePatterns.jsxUsage.has(elementName)) {\n state.usagePatterns.jsxUsage.set(elementName, usage);\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Checks if a name is a known component from imports\n */\nexport function isKnownComponent(name: string, state: ParserState): boolean {\n return state.componentNames.has(name) || state.allIdentifiers.has(name);\n}\n\n/**\n * Checks if a function name matches HOC patterns\n */\nexport function isHOCPattern(name: string): boolean {\n const hocPatterns = ['with', 'enhance', 'wrap', 'connect', 'create'];\n return hocPatterns.some((pattern) => name.startsWith(pattern));\n}\n\n/**\n * Checks if a node represents a HOC function call\n */\nexport function isHOCFunction(callee: any): boolean {\n if (!callee) return false;\n\n if (callee.type === 'Identifier') {\n return isHOCPattern(callee.value);\n }\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property;\n return prop?.value && isHOCPattern(prop.value);\n }\n\n return false;\n}\n\n/**\n * Checks if an expression looks like a React component\n * (starts with capital letter)\n */\nexport function looksLikeComponent(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\n/**\n * Checks if source is from a specific library (for filtering)\n */\nexport function isFromLibrary(source: string, libraryName: string): boolean {\n return source.startsWith(libraryName) || source.includes(libraryName);\n}\n","import type { ParserState } from '../types';\nimport { isKnownComponent } from '../utils/matchers';\n\n/**\n * Analyzes variable declarations for component assignments\n */\nexport function analyzeVariableDeclaration(\n node: any,\n state: ParserState,\n): void {\n if (!node.declarations) return;\n\n for (const decl of node.declarations) {\n if (decl.id?.type === 'Identifier') {\n const varName = decl.id.value;\n\n // Check if it's assigning a component\n if (decl.init) {\n const assignment = extractAssignmentInfo(decl.init);\n if (assignment && isKnownComponent(assignment, state)) {\n state.usagePatterns.variableAssignments.set(varName, {\n assignment,\n line: node.span?.start || 0,\n });\n state.componentNames.add(varName);\n }\n }\n }\n\n // Handle destructuring assignments\n if (decl.id?.type === 'ObjectPattern') {\n analyzeDestructuringPattern(decl.id, decl.init, state);\n }\n }\n}\n\n/**\n * Analyzes destructuring patterns\n */\nexport function analyzeDestructuringPattern(\n pattern: any,\n init: any,\n state: ParserState,\n): void {\n if (!pattern.properties) return;\n\n for (const prop of pattern.properties) {\n if (\n prop.type === 'AssignmentPatternProperty' &&\n prop.key?.type === 'Identifier'\n ) {\n const propName = prop.key.value;\n\n if (init?.type === 'Identifier' && state.allIdentifiers.has(init.value)) {\n state.usagePatterns.destructuredUsage.add({\n property: propName,\n source: init.value,\n line: pattern.span?.start || 0,\n });\n state.componentNames.add(propName);\n }\n }\n }\n}\n\n/**\n * Extracts assignment information from various node types\n */\nfunction extractAssignmentInfo(node: any): string | null {\n switch (node.type) {\n case 'Identifier':\n return node.value;\n case 'MemberExpression':\n return `${extractAssignmentInfo(node.object)}.${node.property.value}`;\n case 'ConditionalExpression':\n return `${extractAssignmentInfo(node.consequent)} | ${extractAssignmentInfo(node.alternate)}`;\n default:\n return null;\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes conditional expressions (ternary operators) with components\n */\nexport function analyzeConditionalExpression(\n node: any,\n state: ParserState,\n): void {\n const consequent =\n node.consequent?.type === 'Identifier' ? node.consequent.value : null;\n const alternate =\n node.alternate?.type === 'Identifier' ? node.alternate.value : null;\n\n if (\n (consequent && state.componentNames.has(consequent)) ||\n (alternate && state.componentNames.has(alternate))\n ) {\n state.usagePatterns.conditionalUsage.add({\n consequent: consequent || '',\n alternate: alternate || '',\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes array expressions containing components\n */\nexport function analyzeArrayExpression(node: any, state: ParserState): void {\n // Check if array contains components\n const hasComponents = node.elements?.some((elem: any) => {\n if (elem?.expression?.type === 'Identifier') {\n return state.componentNames.has(elem.expression.value);\n }\n return false;\n });\n\n if (hasComponents) {\n state.usagePatterns.arrayMappings.add({\n components: node.elements\n ?.map((elem: any) => elem?.expression?.value)\n .filter(Boolean),\n line: node.span?.start || 0,\n });\n }\n}\n\n/**\n * Analyzes object expressions with component mappings\n */\nexport function analyzeObjectExpression(node: any, state: ParserState): void {\n // Check if object contains component mappings\n const componentProps = node.properties?.filter((prop: any) => {\n if (prop.type === 'KeyValueProperty' && prop.value?.type === 'Identifier') {\n return state.componentNames.has(prop.value.value);\n }\n return false;\n });\n\n if (componentProps?.length > 0) {\n state.usagePatterns.objectMappings.add({\n mappings: componentProps.map((prop: any) => ({\n key: prop.key?.value || '[computed]',\n component: prop.value?.value,\n })),\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes React.lazy() imports\n */\nexport function analyzeLazyImport(node: any, state: ParserState): void {\n const arg = node.arguments?.[0]?.expression;\n if (\n arg?.type === 'ArrowFunctionExpression' &&\n arg.body?.type === 'CallExpression'\n ) {\n const importCall = arg.body;\n if (importCall.callee?.type === 'Import') {\n const source = importCall.arguments?.[0]?.expression?.value;\n if (source) {\n state.usagePatterns.lazyImports.add({\n source,\n line: node.span?.start || 0,\n });\n }\n }\n }\n}\n\n/**\n * Analyzes dynamic import() calls\n */\nexport function analyzeDynamicImport(node: any, state: ParserState): void {\n const source = node.arguments?.[0]?.expression?.value;\n if (source) {\n state.usagePatterns.dynamicImports.add({\n source,\n line: node.span?.start || 0,\n });\n }\n}\n","import type { ParserState } from '../types';\n\n/**\n * Analyzes Higher-Order Component (HOC) usage\n */\nexport function analyzeHOCUsage(node: any, state: ParserState): void {\n state.usagePatterns.hocUsage.add({\n function: node.callee?.value || '[unknown]',\n component: node.arguments?.[0]?.expression?.value || '[unknown]',\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes React.memo() usage\n */\nexport function analyzeMemoUsage(node: any, state: ParserState): void {\n const component = node.arguments?.[0]?.expression;\n if (\n component?.type === 'Identifier' &&\n state.componentNames.has(component.value)\n ) {\n state.usagePatterns.memoizedComponents.add({\n component: component.value,\n line: node.span?.start || 0,\n });\n }\n}\n\n/**\n * Analyzes React.forwardRef() usage\n */\nexport function analyzeForwardRefUsage(node: any, state: ParserState): void {\n state.usagePatterns.forwardedRefs.add({\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes ReactDOM.createPortal() usage\n */\nexport function analyzePortalUsage(node: any, state: ParserState): void {\n state.usagePatterns.portalUsage.add({\n line: node.span?.start || 0,\n });\n}\n\n/**\n * Analyzes member expression access (e.g., Foundation.Button)\n */\nexport function analyzeMemberExpression(node: any, state: ParserState): void {\n // Check if this is a namespace access like Foundation.Button\n if (\n node.object?.type === 'Identifier' &&\n state.allIdentifiers.has(node.object.value)\n ) {\n // const namespaceName = node.object.value;\n const propertyName = node.property?.value;\n\n if (propertyName) {\n // Track namespace property access\n state.componentNames.add(propertyName);\n }\n }\n}\n\n/**\n * Checks if a node represents HOC pattern\n */\nexport function isHOCPattern(node: any, state: ParserState): boolean {\n // Simple heuristic: function that returns a component-like structure\n return (\n node.callee?.type === 'Identifier' &&\n node.arguments?.some(\n (arg: any) =>\n arg.expression?.type === 'Identifier' &&\n state.componentNames.has(arg.expression.value),\n )\n );\n}\n","import type { ParserState, VisitorContext } from '../types';\nimport { analyzeImportDeclaration } from '../patterns/imports';\nimport { analyzeJSXElement, analyzeJSXOpeningElement } from '../patterns/jsx';\nimport { analyzeVariableDeclaration } from '../patterns/variables';\nimport { analyzeConditionalExpression } from '../patterns/conditionals';\nimport {\n analyzeArrayExpression,\n analyzeObjectExpression,\n} from '../patterns/collections';\nimport {\n analyzeLazyImport,\n analyzeDynamicImport,\n} from '../patterns/lazy-dynamic';\nimport {\n analyzeHOCUsage,\n analyzeMemoUsage,\n analyzeForwardRefUsage,\n analyzePortalUsage,\n analyzeMemberExpression,\n isHOCPattern,\n} from '../patterns/advanced';\n\n/**\n * Main AST visitor that routes nodes to appropriate pattern analyzers\n */\nexport function visitNode(\n node: any,\n state: ParserState,\n context: VisitorContext = {},\n): void {\n if (!node) return;\n\n switch (node.type) {\n case 'Module':\n // Process imports first (they populate componentNames)\n if (node.body) {\n for (const item of node.body) {\n if (item.type === 'ImportDeclaration') {\n visitNode(item, state, context);\n }\n }\n // Then process everything else\n for (const item of node.body) {\n if (item.type !== 'ImportDeclaration') {\n visitNode(item, state, { ...context, parent: node });\n }\n }\n }\n break;\n\n case 'ImportDeclaration':\n analyzeImportDeclaration(node, state);\n break;\n\n case 'CallExpression':\n analyzeCallExpression(node, state, context);\n break;\n\n case 'VariableDeclaration':\n analyzeVariableDeclaration(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'JSXElement':\n case 'JSXFragment':\n analyzeJSXElement(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'JSXOpeningElement':\n analyzeJSXOpeningElement(node, state, context.parent);\n break;\n\n case 'ArrayExpression':\n analyzeArrayExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'ObjectExpression':\n analyzeObjectExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'MemberExpression':\n analyzeMemberExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'ConditionalExpression':\n analyzeConditionalExpression(node, state);\n visitChildren(node, state, context);\n break;\n\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n case 'ExpressionStatement':\n case 'ReturnStatement':\n case 'VariableDeclarator':\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n visitChildren(node, state, { ...context, parent: node });\n break;\n\n default:\n visitChildren(node, state, context);\n break;\n }\n}\n\n/**\n * Analyzes call expressions and routes to specific analyzers\n */\nfunction analyzeCallExpression(\n node: any,\n state: ParserState,\n context: VisitorContext,\n): void {\n // Analyze lazy imports\n if (\n node.callee?.value === 'lazy' ||\n (node.callee?.object?.value === 'React' &&\n node.callee?.property?.value === 'lazy')\n ) {\n analyzeLazyImport(node, state);\n }\n\n // Analyze dynamic imports\n if (node.callee?.type === 'Import') {\n analyzeDynamicImport(node, state);\n }\n\n // Analyze HOC patterns\n if (isHOCPattern(node, state)) {\n analyzeHOCUsage(node, state);\n }\n\n // Analyze React.memo, React.forwardRef\n if (node.callee?.object?.value === 'React') {\n if (node.callee?.property?.value === 'memo') {\n analyzeMemoUsage(node, state);\n } else if (node.callee?.property?.value === 'forwardRef') {\n analyzeForwardRefUsage(node, state);\n }\n }\n\n // Analyze createPortal\n if (\n node.callee?.property?.value === 'createPortal' ||\n node.callee?.value === 'createPortal'\n ) {\n analyzePortalUsage(node, state);\n }\n\n visitChildren(node, state, context);\n}\n\n/**\n * Visits all children of a node\n */\nfunction visitChildren(\n node: any,\n state: ParserState,\n context: VisitorContext,\n): void {\n if (!node) return;\n\n for (const key in node) {\n const value = node[key];\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item && typeof item === 'object') {\n visitNode(item, state, { ...context, parent: node });\n }\n }\n } else if (value && typeof value === 'object' && value.type) {\n visitNode(value, state, { ...context, parent: node });\n }\n }\n}\n","import type { ParserState, UsageReport } from '../types';\n\n/**\n * Generates a comprehensive usage report from parser state\n */\nexport function generateReport(\n state: ParserState,\n filePath: string,\n): UsageReport {\n const report: UsageReport = {\n filePath,\n summary: {\n totalImports:\n state.usagePatterns.defaultImports.size +\n state.usagePatterns.namedImports.size +\n state.usagePatterns.namespaceImports.size,\n totalComponents: state.componentNames.size,\n totalUsagePatterns: calculateTotalPatterns(state),\n },\n patterns: {\n imports: {\n default: Array.from(state.usagePatterns.defaultImports),\n named: Array.from(state.usagePatterns.namedImports),\n namespace: Array.from(state.usagePatterns.namespaceImports),\n aliased: Array.from(state.usagePatterns.aliasedImports.values()),\n },\n usage: {\n jsx: Array.from(state.usagePatterns.jsxUsage.values()),\n variables: Array.from(\n state.usagePatterns.variableAssignments.entries(),\n ).map(([key, value]) => ({\n variable: key,\n assignment: value.assignment,\n })),\n destructuring: Array.from(state.usagePatterns.destructuredUsage),\n conditional: Array.from(state.usagePatterns.conditionalUsage),\n arrays: Array.from(state.usagePatterns.arrayMappings),\n objects: Array.from(state.usagePatterns.objectMappings),\n },\n advanced: {\n lazy: Array.from(state.usagePatterns.lazyImports),\n dynamic: Array.from(state.usagePatterns.dynamicImports),\n hoc: Array.from(state.usagePatterns.hocUsage),\n memo: Array.from(state.usagePatterns.memoizedComponents),\n forwardRef: Array.from(state.usagePatterns.forwardedRefs),\n portal: Array.from(state.usagePatterns.portalUsage),\n },\n props: Array.from(state.usagePatterns.propsAnalysis.entries()).map(\n ([component, analysis]) => ({\n component,\n analysis,\n }),\n ),\n },\n components: Array.from(state.componentNames).sort(),\n };\n\n return report;\n}\n\n/**\n * Calculates total number of usage patterns found\n */\nfunction calculateTotalPatterns(state: ParserState): number {\n return Object.values(state.usagePatterns).reduce((sum, collection) => {\n if (collection instanceof Set || collection instanceof Map) {\n return sum + collection.size;\n }\n return sum;\n }, 0);\n}\n","import { parseSync } from '@swc/core';\nimport type { ParseOptions as SwcParseOptions } from '@swc/core';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { UsageReport } from './types';\nimport { createState } from './core/state';\nimport { visitNode } from './core/visitor';\nimport { generateReport } from './core/report';\n\nfunction swcOptionsForFile(filePath: string): SwcParseOptions {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.ts')\n return {\n syntax: 'typescript',\n tsx: false,\n decorators: true,\n dynamicImport: true,\n };\n if (ext === '.tsx')\n return {\n syntax: 'typescript',\n tsx: true,\n decorators: true,\n dynamicImport: true,\n };\n if (ext === '.jsx')\n return {\n syntax: 'ecmascript',\n jsx: true,\n decorators: true,\n importAssertions: true,\n };\n // .js / .mjs / .cjs\n return {\n syntax: 'ecmascript',\n jsx: true,\n decorators: true,\n importAssertions: true,\n };\n}\n\nexport function parseCode(code: string, filePath = 'file.tsx'): UsageReport {\n const state = createState();\n const ast = parseSync(code, swcOptionsForFile(filePath));\n visitNode(ast, state);\n return generateReport(state, filePath);\n}\n\nexport function parseFile(filePath: string): UsageReport | null {\n const code = fs.readFileSync(filePath, 'utf8');\n return parseCode(code, filePath);\n}\n\nexport type { UsageReport } from './types';\n","import micromatch from 'micromatch';\nimport type { UsageReport } from '../swc-parser';\nimport type { HermexConfig } from '../config/types';\nimport type { MultiVersionMap } from '../lock-parser';\nimport type { ReleaseAgeEntry } from '../npm-registry/types';\n\nexport interface ComponentUsage {\n name: string;\n source: string;\n count: number;\n files: Set<string>;\n}\n\nexport interface PackageDistribution {\n packageName: string;\n version: string | null;\n componentCount: number;\n usageCount: number;\n percentage: number;\n components: string[];\n internal: boolean;\n hasVersionConflict: boolean;\n allVersions: string[];\n releaseAge?: ReleaseAgeEntry;\n}\n\nfunction resolvePackageFromImportPath(\n importPath: string,\n availablePackages: string[],\n): string {\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\n return 'local';\n }\n\n const sortedPackages = [...availablePackages].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const pkg of sortedPackages) {\n if (importPath === pkg) return pkg;\n if (importPath.startsWith(`${pkg}/`)) return pkg;\n }\n\n return 'unknown';\n}\n\nexport function findComponentSource(\n componentName: string,\n report: UsageReport,\n availablePackages: string[],\n): string {\n const namedImport = report.patterns.imports.named.find(\n (imp) => imp.name === componentName,\n );\n if (namedImport)\n return resolvePackageFromImportPath(namedImport.source, availablePackages);\n\n const defaultImport = report.patterns.imports.default.find(\n (imp) => imp.name === componentName,\n );\n if (defaultImport)\n return resolvePackageFromImportPath(\n defaultImport.source,\n availablePackages,\n );\n\n const aliasedImport = report.patterns.imports.aliased.find(\n (imp) => imp.local === componentName,\n );\n if (aliasedImport)\n return resolvePackageFromImportPath(\n aliasedImport.source,\n availablePackages,\n );\n\n return 'unknown';\n}\n\nfunction getPackageVersion(\n packageName: string,\n versions: Record<string, string>,\n): string | null {\n if (versions[packageName]) return versions[packageName];\n\n if (packageName.includes('/')) {\n const parts = packageName.split('/');\n if (packageName.startsWith('@') && parts.length > 2) {\n const basePackage = `${parts[0]}/${parts[1]}`;\n if (versions[basePackage]) return versions[basePackage];\n }\n if (!packageName.startsWith('@') && parts.length > 1) {\n if (versions[parts[0]]) return versions[parts[0]];\n }\n }\n\n return null;\n}\n\nexport function calculatePackageDistribution(\n componentUsageMap: Map<string, ComponentUsage>,\n versions: Record<string, string>,\n config?: HermexConfig,\n multiVersions: MultiVersionMap = {},\n): PackageDistribution[] {\n const ignorePatterns = config?.packages.ignore ?? [];\n const internalPatterns = config?.packages.internal ?? [];\n\n const packageMap = new Map<string, PackageDistribution>();\n\n for (const component of componentUsageMap.values()) {\n if (component.source === 'unknown' || component.source === 'local')\n continue;\n\n if (\n ignorePatterns.length > 0 &&\n micromatch.isMatch(component.source, ignorePatterns)\n ) {\n continue;\n }\n\n const existing = packageMap.get(component.source);\n if (existing) {\n existing.componentCount++;\n existing.usageCount += component.count;\n existing.components.push(component.name);\n } else {\n const isInternal =\n internalPatterns.length > 0\n ? micromatch.isMatch(component.source, internalPatterns)\n : false;\n\n const allVersions = multiVersions[component.source] ?? [];\n const hasVersionConflict = allVersions.length > 1;\n\n packageMap.set(component.source, {\n packageName: component.source,\n version: getPackageVersion(component.source, versions),\n componentCount: 1,\n usageCount: component.count,\n percentage: 0,\n components: [component.name],\n internal: isInternal,\n hasVersionConflict,\n allVersions,\n });\n }\n }\n\n const distribution = Array.from(packageMap.values());\n const totalExternalUsage = distribution.reduce(\n (sum, pkg) => sum + pkg.usageCount,\n 0,\n );\n\n for (const pkg of distribution) {\n pkg.percentage =\n totalExternalUsage > 0 ? (pkg.usageCount / totalExternalUsage) * 100 : 0;\n }\n\n return distribution.sort((a, b) => b.usageCount - a.usageCount);\n}\n","import { globSync } from 'glob';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface RuleViolation {\n type:\n | 'detect_files'\n | 'require_files'\n | 'require_packages'\n | 'require_scripts'\n | 'require_package_fields'\n | 'forbid_package_fields'\n | 'engine_version'\n | 'codeowners';\n severity: 'error' | 'warn' | 'info';\n patterns: string[];\n message?: string;\n matchedFiles: string[];\n // engine_version only\n installedRange?: string;\n requiredRange?: string;\n // package-field rules only\n fieldPath?: string;\n actualValue?: string;\n}\n\nexport function toArray<T>(val: T | T[] | undefined): T[] {\n if (!val) return [];\n return Array.isArray(val) ? val : [val];\n}\n\nexport function findMatches(\n patterns: string[],\n repoPath: string,\n ignore: string[],\n): string[] {\n const matches: string[] = [];\n for (const pattern of patterns) {\n const found = globSync(pattern, { cwd: repoPath, nodir: true, ignore });\n matches.push(...found.map((f) => f.replace(/\\\\/g, '/')));\n }\n return [...new Set(matches)];\n}\n\nexport function readPackageJson(\n repoPath: string,\n): Record<string, unknown> | null {\n try {\n const content = fs.readFileSync(\n path.join(repoPath, 'package.json'),\n 'utf-8',\n );\n return JSON.parse(content) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","import type { RulesConfig } from '../config/types';\nimport { toArray, findMatches } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateFileRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n excludes: string[],\n): RuleViolation[] {\n const violations: RuleViolation[] = [];\n\n for (const rule of toArray(rulesConfig.detect_files)) {\n const matches = findMatches(rule.patterns, repoPath, excludes);\n if (matches.length > 0) {\n violations.push({\n type: 'detect_files',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: matches,\n });\n }\n }\n\n for (const rule of toArray(rulesConfig.require_files)) {\n const matches = findMatches(rule.patterns, repoPath, excludes);\n if (matches.length === 0) {\n violations.push({\n type: 'require_files',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n });\n }\n }\n\n return violations;\n}\n","import micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateScriptRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const rules = toArray(rulesConfig.require_scripts);\n if (rules.length === 0) {\n return [];\n }\n\n const pkg = readPackageJson(repoPath);\n const scriptKeys = Object.keys(\n (pkg?.scripts as Record<string, string> | undefined) ?? {},\n );\n\n return rules\n .filter(\n (rule) =>\n !rule.patterns.some((p) =>\n scriptKeys.some((k) => micromatch.isMatch(k, p)),\n ),\n )\n .map((rule) => ({\n type: 'require_scripts' as const,\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n }));\n}\n","import micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\ninterface FieldLookup {\n exists: boolean;\n value: unknown;\n}\n\n/** Resolves a dot-path like \"engines.node\" against the manifest object. */\nfunction getFieldAtPath(\n pkg: Record<string, unknown> | null,\n path: string,\n): FieldLookup {\n let current: unknown = pkg;\n for (const key of path.split('.')) {\n if (\n current === null ||\n typeof current !== 'object' ||\n !(key in (current as Record<string, unknown>))\n ) {\n return { exists: false, value: undefined };\n }\n current = (current as Record<string, unknown>)[key];\n }\n return { exists: true, value: current };\n}\n\n/** Primitives compare by string form; objects/arrays never match a value pattern. */\nfunction valueMatches(value: unknown, valuePatterns: string[]): boolean {\n if (value === null || typeof value === 'object') return false;\n return micromatch.isMatch(String(value), valuePatterns);\n}\n\nexport function evaluatePackageFieldRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const requireRules = toArray(rulesConfig.require_package_fields);\n const forbidRules = toArray(rulesConfig.forbid_package_fields);\n if (requireRules.length === 0 && forbidRules.length === 0) return [];\n\n const pkg = readPackageJson(repoPath);\n const violations: RuleViolation[] = [];\n\n for (const rule of requireRules) {\n const lookups = rule.patterns.map((p) => ({\n path: p,\n ...getFieldAtPath(pkg, p),\n }));\n const satisfied = lookups.some(\n (l) => l.exists && (!rule.values || valueMatches(l.value, rule.values)),\n );\n if (!satisfied) {\n // Prefer reporting a present-but-mismatched field over a missing one\n const mismatch = rule.values ? lookups.find((l) => l.exists) : undefined;\n violations.push({\n type: 'require_package_fields',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n fieldPath: mismatch?.path,\n actualValue:\n mismatch && typeof mismatch.value !== 'object'\n ? String(mismatch.value)\n : undefined,\n });\n }\n }\n\n for (const rule of forbidRules) {\n for (const pattern of rule.patterns) {\n const lookup = getFieldAtPath(pkg, pattern);\n const hit =\n lookup.exists &&\n (!rule.values || valueMatches(lookup.value, rule.values));\n if (hit) {\n violations.push({\n type: 'forbid_package_fields',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n fieldPath: pattern,\n actualValue:\n lookup.value !== null && typeof lookup.value !== 'object'\n ? String(lookup.value)\n : undefined,\n });\n }\n }\n }\n\n return violations;\n}\n","import semver from 'semver';\nimport type { RulesConfig } from '../config/types';\nimport { toArray, readPackageJson } from './shared';\nimport type { RuleViolation } from './shared';\n\nexport function evaluateEngineVersion(\n repoPath: string,\n rulesConfig: RulesConfig,\n): RuleViolation[] {\n const rules = toArray(rulesConfig.engine_version);\n if (rules.length === 0) {\n return [];\n }\n\n const pkg = readPackageJson(repoPath);\n const nodeRange = (pkg?.engines as Record<string, string> | undefined)?.node;\n\n return rules.flatMap((rule): RuleViolation[] => {\n if (!nodeRange) {\n return [\n {\n type: 'engine_version',\n severity: rule.severity,\n patterns: [],\n message: rule.message ?? 'engines.node not specified in package.json',\n matchedFiles: [],\n requiredRange: rule.range,\n },\n ];\n }\n\n const minVer = semver.minVersion(nodeRange);\n if (!minVer || !semver.satisfies(minVer, rule.range)) {\n return [\n {\n type: 'engine_version',\n severity: rule.severity,\n patterns: [],\n message: rule.message,\n matchedFiles: [],\n installedRange: nodeRange,\n requiredRange: rule.range,\n },\n ];\n }\n\n return [];\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport micromatch from 'micromatch';\nimport type { RulesConfig } from '../config/types';\nimport type { RuleViolation } from './shared';\n\nconst CODEOWNERS_LOCATIONS = [\n '.github/CODEOWNERS',\n 'CODEOWNERS',\n 'docs/CODEOWNERS',\n];\n\nexport interface CodeownersEntry {\n /** as written in the CODEOWNERS file */\n pattern: string;\n /** translated micromatch patterns */\n globs: string[];\n /** may be empty ā an empty list un-assigns ownership for matching files */\n owners: string[];\n}\n\n/** First existing location, GitHub search order. Null if none exist. */\nexport function findCodeownersFile(repoPath: string): string | null {\n for (const location of CODEOWNERS_LOCATIONS) {\n const full = path.join(repoPath, location);\n if (fs.existsSync(full)) return full;\n }\n return null;\n}\n\n/** Parses content into entries; skips blank lines and # comments. */\nexport function parseCodeowners(content: string): CodeownersEntry[] {\n const entries: CodeownersEntry[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n const tokens = line.split(/\\s+/);\n const pattern = tokens[0];\n const owners = tokens.slice(1);\n\n entries.push({\n pattern,\n globs: codeownersPatternToGlobs(pattern),\n owners,\n });\n }\n\n return entries;\n}\n\n/**\n * Translates a CODEOWNERS (gitignore-style) pattern into micromatch glob(s).\n *\n * Rules:\n * - `*` alone matches everything.\n * - A leading `/`, or a `/` anywhere in the middle of the pattern, anchors\n * the match to the repo root (the leading `/` is stripped once anchored).\n * - A pattern with no anchoring gets a `**\\/` prefix so it matches at any depth.\n * - A trailing `/` restricts the match to a directory, so `/**` is appended.\n * - A bare name (no glob characters, no slash at all) also matches as a\n * directory anywhere, so the `/**` directory variant is added alongside\n * the plain match.\n */\nexport function codeownersPatternToGlobs(pattern: string): string[] {\n if (pattern === '*') return ['**'];\n\n let p = pattern;\n\n const hadLeadingSlash = p.startsWith('/');\n if (hadLeadingSlash) p = p.slice(1);\n\n const hadTrailingSlash = p.endsWith('/') && p.length > 1;\n if (hadTrailingSlash) p = p.slice(0, -1);\n\n const hasInternalSlash = p.includes('/');\n const anchored = hadLeadingSlash || hasInternalSlash;\n const hasGlobChars = /[*?[\\]{}!()]/.test(p);\n const isBareName = !anchored && !hasGlobChars && !hadTrailingSlash;\n\n const base = anchored ? p : `**/${p}`;\n const globs = [hadTrailingSlash ? `${base}/**` : base];\n\n if (isBareName) {\n globs.push(`${base}/**`);\n }\n\n return globs;\n}\n\n/** Last matching entry wins; owned iff that entry has >= 1 owner. */\nexport function fileIsOwned(file: string, entries: CodeownersEntry[]): boolean {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (micromatch.isMatch(file, entries[i].globs, { dot: true })) {\n return entries[i].owners.length > 0;\n }\n }\n return false;\n}\n\nexport function evaluateCodeowners(\n repoPath: string,\n rulesConfig: RulesConfig,\n scannedFiles: string[],\n): RuleViolation[] {\n const rule = rulesConfig.codeowners;\n if (!rule) return [];\n\n const filePath = findCodeownersFile(repoPath);\n if (!filePath) {\n return [\n {\n type: 'codeowners',\n severity: rule.severity,\n patterns: CODEOWNERS_LOCATIONS,\n message: rule.message,\n matchedFiles: [],\n },\n ];\n }\n\n const entries = parseCodeowners(fs.readFileSync(filePath, 'utf-8'));\n const relFiles = scannedFiles.map((f) =>\n (path.isAbsolute(f) ? path.relative(repoPath, f) : f).replace(/\\\\/g, '/'),\n );\n const unowned = relFiles.filter((f) => !fileIsOwned(f, entries));\n if (unowned.length === 0) return [];\n\n return [\n {\n type: 'codeowners',\n severity: rule.severity,\n patterns: [path.basename(filePath)],\n message: rule.message,\n matchedFiles: unowned,\n },\n ];\n}\n","import type { RulesConfig } from '../config/types';\nimport { evaluateFileRules } from './file-rules';\nimport { evaluateScriptRules } from './script-rules';\nimport { evaluatePackageFieldRules } from './package-field-rules';\nimport { evaluateEngineVersion } from './engine-version';\nimport { evaluateCodeowners } from './codeowners';\n\nexport type { RuleViolation } from './shared';\nexport { toArray } from './shared';\n\nexport function evaluateRules(\n repoPath: string,\n rulesConfig: RulesConfig,\n excludes: string[],\n scannedFiles: string[] = [],\n): import('./shared').RuleViolation[] {\n return [\n ...evaluateFileRules(repoPath, rulesConfig, excludes),\n ...evaluateScriptRules(repoPath, rulesConfig),\n ...evaluatePackageFieldRules(repoPath, rulesConfig),\n ...evaluateEngineVersion(repoPath, rulesConfig),\n ...evaluateCodeowners(repoPath, rulesConfig, scannedFiles),\n ];\n}\n","import micromatch from 'micromatch';\nimport type { HermexConfig } from '../config/types';\nimport type { RuleViolation } from '../rules/evaluator';\nimport { toArray } from '../rules/evaluator';\nimport type { PackageDistribution } from './package-distribution';\n\nexport interface BannedPackageViolation {\n packageName: string;\n severity: 'error' | 'warn' | 'info';\n message?: string;\n}\n\nexport function detectBannedPackages(\n distribution: PackageDistribution[],\n config?: HermexConfig,\n): BannedPackageViolation[] {\n const forbidRules = toArray(config?.rules.forbid_packages);\n if (forbidRules.length === 0) {\n return [];\n }\n\n const violations: BannedPackageViolation[] = [];\n for (const pkg of distribution) {\n for (const rule of forbidRules) {\n if (micromatch.isMatch(pkg.packageName, rule.patterns)) {\n violations.push({\n packageName: pkg.packageName,\n severity: rule.severity,\n message: rule.message,\n });\n break;\n }\n }\n }\n return violations;\n}\n\nexport function detectRequiredPackages(\n distribution: PackageDistribution[],\n versions: Record<string, string>,\n config?: HermexConfig,\n): RuleViolation[] {\n const requireRules = toArray(config?.rules.require_packages);\n if (requireRules.length === 0) return [];\n\n // All package names available: from lockfile versions + from import distribution\n const installedNames = new Set([\n ...Object.keys(versions),\n ...distribution.map((p) => p.packageName),\n ]);\n\n const violations: RuleViolation[] = [];\n for (const rule of requireRules) {\n const satisfied = rule.patterns.some((p) =>\n [...installedNames].some((name) => micromatch.isMatch(name, p)),\n );\n if (!satisfied) {\n violations.push({\n type: 'require_packages',\n severity: rule.severity,\n patterns: rule.patterns,\n message: rule.message,\n matchedFiles: [],\n });\n }\n }\n return violations;\n}\n","import type { UsageReport } from '../swc-parser';\n\nexport interface PatternCount {\n patternType: string;\n displayName: string;\n count: number;\n}\n\nexport function countPatterns(\n report: UsageReport,\n patternMap: Map<string, number>,\n) {\n increment(\n patternMap,\n 'imports.default',\n report.patterns.imports.default.length,\n );\n increment(patternMap, 'imports.named', report.patterns.imports.named.length);\n increment(\n patternMap,\n 'imports.namespace',\n report.patterns.imports.namespace.length,\n );\n increment(\n patternMap,\n 'imports.aliased',\n report.patterns.imports.aliased.length,\n );\n increment(patternMap, 'usage.jsx', report.patterns.usage.jsx.length);\n increment(\n patternMap,\n 'usage.variables',\n report.patterns.usage.variables.length,\n );\n increment(\n patternMap,\n 'usage.destructuring',\n report.patterns.usage.destructuring.length,\n );\n increment(\n patternMap,\n 'usage.conditional',\n report.patterns.usage.conditional.length,\n );\n increment(patternMap, 'usage.arrays', report.patterns.usage.arrays.length);\n increment(patternMap, 'usage.objects', report.patterns.usage.objects.length);\n increment(patternMap, 'advanced.lazy', report.patterns.advanced.lazy.length);\n increment(\n patternMap,\n 'advanced.dynamic',\n report.patterns.advanced.dynamic.length,\n );\n increment(patternMap, 'advanced.hoc', report.patterns.advanced.hoc.length);\n increment(patternMap, 'advanced.memo', report.patterns.advanced.memo.length);\n increment(\n patternMap,\n 'advanced.forwardRef',\n report.patterns.advanced.forwardRef.length,\n );\n increment(\n patternMap,\n 'advanced.portal',\n report.patterns.advanced.portal.length,\n );\n}\n\nfunction increment(map: Map<string, number>, key: string, value: number) {\n map.set(key, (map.get(key) || 0) + value);\n}\n\nexport function getPatternDisplayName(patternType: string): string {\n const displayNames: Record<string, string> = {\n 'imports.default': 'Default Imports',\n 'imports.named': 'Named Imports',\n 'imports.namespace': 'Namespace Imports',\n 'imports.aliased': 'Aliased Imports',\n 'usage.jsx': 'JSX Usage',\n 'usage.variables': 'Variable Assignments',\n 'usage.destructuring': 'Destructuring',\n 'usage.conditional': 'Conditional Usage',\n 'usage.arrays': 'Array Mappings',\n 'usage.objects': 'Object Mappings',\n 'advanced.lazy': 'Lazy Loading',\n 'advanced.dynamic': 'Dynamic Imports',\n 'advanced.hoc': 'Higher-Order Components',\n 'advanced.memo': 'Memoized Components',\n 'advanced.forwardRef': 'Forward Refs',\n 'advanced.portal': 'Portal Usage',\n };\n return displayNames[patternType] || patternType;\n}\n","import type { VersusConfig } from '../config/types';\nimport type { PackageDistribution } from './package-distribution';\n\nfunction toPercentage(count: number, total: number): number {\n return total > 0 ? (count / total) * 100 : 0;\n}\n\nexport interface VersusEntry {\n packageName: string;\n count: number;\n percentage: number;\n components: string[];\n}\n\nexport interface VersusResult {\n name: string;\n packages: string[];\n entries: VersusEntry[];\n totalCount: number;\n}\n\nexport function calculateVersusResults(\n distribution: PackageDistribution[],\n versusConfigs: VersusConfig[],\n): VersusResult[] {\n const distMap = new Map(distribution.map((p) => [p.packageName, p]));\n\n return versusConfigs.map((vc) => {\n const entries: VersusEntry[] = vc.packages.map((pkgName) => {\n const pkg = distMap.get(pkgName);\n return {\n packageName: pkgName,\n count: pkg?.usageCount ?? 0,\n percentage: 0,\n components: pkg?.components ?? [],\n };\n });\n\n const totalCount = entries.reduce((sum, e) => sum + e.count, 0);\n\n for (const entry of entries) {\n entry.percentage = toPercentage(entry.count, totalCount);\n }\n\n entries.sort((a, b) => b.count - a.count);\n\n return { name: vc.name, packages: vc.packages, entries, totalCount };\n });\n}\n","import type { UsageReport } from '../swc-parser';\nimport type { HermexConfig } from '../config/types';\nimport type { MultiVersionMap } from '../lock-parser';\nimport type { RuleViolation } from '../rules/evaluator';\nimport type {\n ComponentUsage,\n PackageDistribution,\n} from './package-distribution';\nimport {\n calculatePackageDistribution,\n findComponentSource,\n} from './package-distribution';\nimport type { BannedPackageViolation } from './package-rules';\nimport { detectBannedPackages, detectRequiredPackages } from './package-rules';\nimport type { PatternCount } from './pattern-counter';\nimport { countPatterns, getPatternDisplayName } from './pattern-counter';\nimport type { VersusResult } from './versus';\nimport { calculateVersusResults } from './versus';\n\nexport interface AggregatedReport {\n filesAnalyzed: number;\n totalImports: number;\n totalComponents: number;\n totalUsagePatterns: number;\n patternCounts: PatternCount[];\n componentUsage: Map<string, ComponentUsage>;\n topComponents: ComponentUsage[];\n allComponents: string[];\n packageDistribution: PackageDistribution[];\n versusResults: VersusResult[];\n ruleViolations: RuleViolation[];\n bannedPackageViolations: BannedPackageViolation[];\n reports: UsageReport[];\n}\n\nexport function aggregateReports(\n reports: UsageReport[],\n versions: Record<string, string> = {},\n config?: HermexConfig,\n multiVersions: MultiVersionMap = {},\n): AggregatedReport {\n const componentUsageMap = new Map<string, ComponentUsage>();\n let totalImports = 0;\n let totalUsagePatterns = 0;\n const patternCountMap = new Map<string, number>();\n\n const availablePackages = Object.keys(versions);\n\n for (const report of reports) {\n totalImports += report.summary.totalImports;\n totalUsagePatterns += report.summary.totalUsagePatterns;\n\n for (const jsx of report.patterns.usage.jsx) {\n const key = jsx.component;\n const existing = componentUsageMap.get(key);\n\n if (existing) {\n existing.count++;\n existing.files.add(report.filePath);\n } else {\n const source = findComponentSource(\n jsx.component,\n report,\n availablePackages,\n );\n componentUsageMap.set(key, {\n name: jsx.component,\n source,\n count: 1,\n files: new Set([report.filePath]),\n });\n }\n }\n\n countPatterns(report, patternCountMap);\n }\n\n const topComponents = Array.from(componentUsageMap.values()).sort(\n (a, b) => b.count - a.count,\n );\n\n const allComponents = Array.from(componentUsageMap.keys()).sort();\n\n const patternCounts = Array.from(patternCountMap.entries())\n .map(([type, count]) => ({\n patternType: type,\n displayName: getPatternDisplayName(type),\n count,\n }))\n .sort((a, b) => b.count - a.count);\n\n const packageDistribution = calculatePackageDistribution(\n componentUsageMap,\n versions,\n config,\n multiVersions,\n );\n\n const versusResults = calculateVersusResults(\n packageDistribution,\n config?.versus ?? [],\n );\n const bannedPackageViolations = detectBannedPackages(\n packageDistribution,\n config,\n );\n\n const requiredPackageViolations = detectRequiredPackages(\n packageDistribution,\n versions,\n config,\n );\n\n return {\n filesAnalyzed: reports.length,\n totalImports,\n totalComponents: componentUsageMap.size,\n totalUsagePatterns,\n patternCounts,\n componentUsage: componentUsageMap,\n topComponents,\n allComponents,\n packageDistribution,\n versusResults,\n ruleViolations: requiredPackageViolations,\n bannedPackageViolations,\n reports,\n };\n}\n","import chalk from 'chalk';\nimport type { ParseError } from '../swc-parser/types';\n\nexport function printErrors(errors: ParseError[], isJson: boolean): void {\n if (errors.length === 0) return;\n const stream = isJson ? process.stderr : process.stdout;\n stream.write(chalk.yellow(`\\nā ${errors.length} file(s) failed to parse:\\n`));\n for (const { file, message } of errors) {\n stream.write(chalk.yellow(` ${file}\\n`));\n stream.write(chalk.gray(` ${message}\\n`));\n }\n stream.write('\\n');\n}\n","import fs from 'fs';\nimport { glob } from 'glob';\n\n/**\n * Find files matching a glob pattern\n * @param pattern - Glob pattern\n * @param ignorePatterns - Glob pattenrs to ignore\n * @returns Array of file paths\n */\nexport async function findFiles(\n pattern: string | string[],\n ignorePatterns: string[],\n): Promise<string[]> {\n const files = await glob(pattern, {\n ignore: ignorePatterns,\n nodir: true,\n windowsPathsNoEscape: true,\n });\n\n return files.map((f) => f.replace(/\\\\/g, '/'));\n}\n\n/**\n * Read file content\n * @param filePath - Path to file\n * @returns File content\n */\nexport function readFile(filePath: string): string {\n return fs.readFileSync(filePath, 'utf8');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction canonicalPackageName(pkgPath: string): string {\n // pkgPath examples:\n // \"node_modules/react\"\n // \"node_modules/@scope/pkg\"\n // \"node_modules/react/node_modules/scheduler\"\n // \"node_modules/@scope/a/node_modules/@scope/b\"\n // We want the last segment after the last \"node_modules/\"\n const idx = pkgPath.lastIndexOf('node_modules/');\n if (idx === -1) return pkgPath;\n return pkgPath.slice(idx + 'node_modules/'.length);\n}\n\nexport class NpmLockfileAdapter implements LockfileAdapter {\n name = 'npm';\n supportedVersions = ['v2', 'v3'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'package-lock.json');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = JSON.parse(content);\n const versions: Record<string, string> = {};\n\n // npm v7+ uses \"packages\" field (lockfileVersion 2, 3)\n if (lockData.packages) {\n Object.entries(lockData.packages).forEach(\n ([pkgPath, pkgData]: [string, any]) => {\n if (!pkgPath || pkgPath === '') return;\n\n // Only root-level packages (no nested node_modules in path)\n if (pkgPath.split('node_modules/').length > 2) return;\n\n const pkgName = canonicalPackageName(pkgPath);\n if (pkgData.version) {\n versions[pkgName] = pkgData.version;\n }\n },\n );\n }\n\n // npm v6 uses \"dependencies\" field (fallback)\n if (lockData.dependencies && Object.keys(versions).length === 0) {\n function extractVersions(deps: any, prefix = ''): void {\n Object.entries(deps).forEach(([name, data]: [string, any]) => {\n const fullName = prefix ? `${prefix}/${name}` : name;\n if (data.version) {\n versions[fullName] = data.version;\n }\n if (data.dependencies) {\n extractVersions(data.dependencies, fullName);\n }\n });\n }\n extractVersions(lockData.dependencies);\n }\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse package-lock.json: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = JSON.parse(content);\n const versionSets: Record<string, Set<string>> = {};\n\n if (lockData.packages) {\n Object.entries(lockData.packages).forEach(\n ([pkgPath, pkgData]: [string, any]) => {\n if (!pkgPath || pkgPath === '') return;\n\n const pkgName = canonicalPackageName(pkgPath);\n const version = (pkgData as any).version;\n if (!version) return;\n\n if (!versionSets[pkgName]) versionSets[pkgName] = new Set();\n versionSets[pkgName].add(version);\n },\n );\n }\n\n const result: MultiVersionMap = {};\n for (const [pkg, versions] of Object.entries(versionSets)) {\n result[pkg] = Array.from(versions).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { load } from 'js-yaml';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction parsePackageKey(\n rawKey: string,\n): { name: string; version: string } | null {\n const key = rawKey.startsWith('/') ? rawKey.slice(1) : rawKey;\n const withoutPeerSuffix = key.replace(/\\(.*\\)$/, '');\n\n const atMatch = withoutPeerSuffix.match(/^(.+)@(\\d+\\.\\d+\\.\\d+[^/]*)$/);\n if (atMatch) return { name: atMatch[1], version: atMatch[2] };\n\n const slashMatch = withoutPeerSuffix.match(/^(.+?)\\/(\\d+\\.\\d+\\.\\d+.*)$/);\n if (slashMatch) return { name: slashMatch[1], version: slashMatch[2] };\n\n return null;\n}\n\nexport class PnpmLockfileAdapter implements LockfileAdapter {\n name = 'pnpm';\n supportedVersions = ['v5', 'v6', 'v9'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'pnpm-lock.yaml');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = load(content) as any;\n const versions: Record<string, string> = {};\n\n // pnpm v9+ uses \"importers\" field\n if (lockData.importers) {\n const rootImporter = lockData.importers['.'];\n if (rootImporter) {\n // Parse dependencies\n if (rootImporter.dependencies) {\n for (const [name, data] of Object.entries(\n rootImporter.dependencies,\n )) {\n if (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data\n ) {\n versions[name] = (data as any).version;\n }\n }\n }\n // Parse devDependencies\n if (rootImporter.devDependencies) {\n for (const [name, data] of Object.entries(\n rootImporter.devDependencies,\n )) {\n if (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data\n ) {\n versions[name] = (data as any).version;\n }\n }\n }\n }\n }\n\n // pnpm v6-8 uses \"packages\" field\n if (lockData.packages && Object.keys(versions).length === 0) {\n Object.keys(lockData.packages).forEach((key) => {\n // Key format: \"/@babel/core/7.22.5\" or \"/package/1.0.0\"\n const match = key.match(/\\/(.+?)\\/(\\d+\\.\\d+\\.\\d+.*?)(?:_|$)/);\n if (match) {\n const [, pkgName, version] = match;\n versions[pkgName] = version;\n }\n });\n }\n\n // pnpm v5 uses \"dependencies\" and \"specifiers\"\n if (lockData.dependencies && Object.keys(versions).length === 0) {\n Object.entries(lockData.dependencies).forEach(\n ([name, versionSpec]: [string, any]) => {\n // versionSpec format: \"1.0.0\" or \"link:../package\"\n if (\n typeof versionSpec === 'string' &&\n !versionSpec.startsWith('link:')\n ) {\n versions[name] = versionSpec;\n } else if (typeof versionSpec === 'object' && versionSpec.version) {\n versions[name] = versionSpec.version;\n }\n },\n );\n }\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse pnpm-lock.yaml: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const lockData = load(content) as any;\n const versionSets: Record<string, Set<string>> = {};\n\n if (lockData.packages) {\n Object.keys(lockData.packages).forEach((key) => {\n const parsed = parsePackageKey(key);\n if (!parsed) return;\n if (!versionSets[parsed.name]) versionSets[parsed.name] = new Set();\n versionSets[parsed.name].add(parsed.version);\n });\n }\n\n const result: MultiVersionMap = {};\n for (const [pkg, versions] of Object.entries(versionSets)) {\n result[pkg] = Array.from(versions).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport lockfile from '@yarnpkg/lockfile';\nimport type { LockfileAdapter, MultiVersionMap } from '../lock-file-adapter';\n\nfunction extractPackageName(key: string): string {\n if (key.startsWith('@')) {\n const match = key.match(/^(@[^@]+\\/[^@]+)@/);\n return match ? match[1] : key;\n }\n const match = key.match(/^([^@]+)@/);\n return match ? match[1] : key;\n}\n\nexport class YarnLockfileAdapter implements LockfileAdapter {\n name = 'yarn';\n supportedVersions = ['v1', 'v2+'];\n\n detect(projectPath: string): string | null {\n const lockfilePath = path.join(projectPath, 'yarn.lock');\n return fs.existsSync(lockfilePath) ? lockfilePath : null;\n }\n\n parse(lockFilePath: string): Record<string, string> {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const parsed = lockfile.parse(content);\n\n if (parsed.type !== 'success') {\n console.warn('Warning: Failed to parse yarn.lock');\n return {};\n }\n\n const versions: Record<string, string> = {};\n\n Object.entries(parsed.object).forEach(([key, value]: [string, any]) => {\n const pkgName = extractPackageName(key);\n\n if (value.version && !versions[pkgName]) {\n versions[pkgName] = value.version;\n }\n });\n\n return versions;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not parse yarn.lock: ${message}`);\n return {};\n }\n }\n\n parseMultiVersion(lockFilePath: string): MultiVersionMap {\n try {\n const content = fs.readFileSync(lockFilePath, 'utf8');\n const parsed = lockfile.parse(content);\n\n if (parsed.type !== 'success') {\n return {};\n }\n\n const versionSets: Record<string, Set<string>> = {};\n\n Object.entries(parsed.object).forEach(([key, value]: [string, any]) => {\n if (!value.version) return;\n const pkgName = extractPackageName(key);\n if (!versionSets[pkgName]) versionSets[pkgName] = new Set();\n versionSets[pkgName].add(value.version);\n });\n\n const result: MultiVersionMap = {};\n for (const [pkg, vers] of Object.entries(versionSets)) {\n result[pkg] = Array.from(vers).sort();\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","import { NpmLockfileAdapter } from './patterns/npm';\nimport { PnpmLockfileAdapter } from './patterns/pnpm';\nimport { YarnLockfileAdapter } from './patterns/yarn';\nimport type { LockfileAdapter, MultiVersionMap } from './lock-file-adapter';\n\nexport type { MultiVersionMap };\n\nexport interface VersionConflict {\n packageName: string;\n versions: string[];\n}\n\nexport interface LockfileResult {\n versions: Record<string, string>;\n multiVersions: MultiVersionMap;\n versionConflicts: VersionConflict[];\n lockfileType: 'npm' | 'yarn' | 'pnpm' | null;\n lockfilePath: string | null;\n supportedVersions: string[];\n}\n\nconst LOCKFILE_ADAPTERS: LockfileAdapter[] = [\n new NpmLockfileAdapter(),\n new YarnLockfileAdapter(),\n new PnpmLockfileAdapter(),\n];\n\n/**\n * Find and parse the appropriate lockfile in a directory\n * @param projectPath - Path to the project directory\n * @returns Object with versions map and lockfile type\n */\nexport function findAndParseLockfile(projectPath: string): LockfileResult {\n for (const adapter of LOCKFILE_ADAPTERS) {\n const lockfilePath = adapter.detect(projectPath);\n if (lockfilePath) {\n const versions = adapter.parse(lockfilePath);\n const multiVersions = adapter.parseMultiVersion\n ? adapter.parseMultiVersion(lockfilePath)\n : {};\n\n const versionConflicts: VersionConflict[] = Object.entries(multiVersions)\n .filter(([, vers]) => vers.length > 1)\n .map(([packageName, vers]) => ({ packageName, versions: vers }));\n\n return {\n versions,\n multiVersions,\n versionConflicts,\n lockfileType: adapter.name as 'npm' | 'yarn' | 'pnpm',\n lockfilePath,\n supportedVersions: adapter.supportedVersions,\n };\n }\n }\n\n throw new Error('No supported lockfile found');\n}\n\n/**\n * Get the version of a specific package from lockfile\n * @param projectPath - Path to the project directory\n * @param packageName - Name of the package\n * @returns Version string or null if not found\n */\nexport function getPackageVersion(\n projectPath: string,\n packageName: string,\n): string | null {\n const { versions } = findAndParseLockfile(projectPath);\n return versions[packageName] || null;\n}\n\n/**\n * Get versions for multiple packages\n * @param projectPath - Path to the project directory\n * @param packageNames - Array of package names\n * @returns Map of package names to versions\n */\nexport function getPackageVersions(\n projectPath: string,\n packageNames: string[],\n): Record<string, string> {\n const { versions } = findAndParseLockfile(projectPath);\n const result: Record<string, string> = {};\n\n packageNames.forEach((pkgName) => {\n if (versions[pkgName]) {\n result[pkgName] = versions[pkgName];\n }\n });\n\n return result;\n}\n","import type { RegistryPackageInfo } from './types';\n\nexport async function fetchPackageInfo(\n name: string,\n registryUrl: string,\n authToken?: string,\n): Promise<RegistryPackageInfo | null> {\n const url = `${registryUrl.replace(/\\/$/, '')}/${encodeURIComponent(name).replace('%40', '@')}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10_000);\n\n try {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as RegistryPackageInfo;\n return data;\n } catch {\n clearTimeout(timeoutId);\n return null;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport type { RegistryPackageInfo } from './types';\nimport { fetchPackageInfo } from './client';\n\nconst DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst DEFAULT_CACHE_DIR = join(homedir(), '.hermex', 'cache', 'npm');\n\nexport interface CacheOptions {\n /** Time-to-live for cache entries, in milliseconds. Default: 1 hour. */\n ttlMs?: number;\n /** Override the cache root directory ā primarily for tests. */\n cacheDir?: string;\n /** Fully disable cache reads and writes (falls straight through to a live fetch). */\n disabled?: boolean;\n}\n\ninterface CacheEntry {\n cachedAt: number;\n registryUrl: string;\n packageName: string;\n data: RegistryPackageInfo;\n}\n\nfunction cachePathFor(\n registryUrl: string,\n packageName: string,\n options?: CacheOptions,\n): string {\n const root = options?.cacheDir ?? DEFAULT_CACHE_DIR;\n const host = new URL(registryUrl).host.replace(/:/g, '_');\n const fileName = `${encodeURIComponent(packageName)}.json`;\n return join(root, host, fileName);\n}\n\nexport async function readCache(\n registryUrl: string,\n packageName: string,\n options?: CacheOptions,\n): Promise<RegistryPackageInfo | null> {\n const ttlMs = options?.ttlMs ?? DEFAULT_TTL_MS;\n try {\n const path = cachePathFor(registryUrl, packageName, options);\n const raw = await readFile(path, 'utf8');\n const entry = JSON.parse(raw) as CacheEntry;\n\n if (\n entry.registryUrl !== registryUrl ||\n entry.packageName !== packageName\n ) {\n return null;\n }\n if (Date.now() - entry.cachedAt >= ttlMs) return null;\n\n return entry.data;\n } catch {\n return null;\n }\n}\n\nexport async function writeCache(\n registryUrl: string,\n packageName: string,\n data: RegistryPackageInfo,\n options?: CacheOptions,\n): Promise<void> {\n const finalPath = cachePathFor(registryUrl, packageName, options);\n const tmpPath = `${finalPath}.tmp-${randomUUID()}`;\n\n try {\n await mkdir(dirname(finalPath), { recursive: true });\n const entry: CacheEntry = {\n cachedAt: Date.now(),\n registryUrl,\n packageName,\n data,\n };\n await writeFile(tmpPath, JSON.stringify(entry), 'utf8');\n await rename(tmpPath, finalPath);\n } catch {\n try {\n await unlink(tmpPath);\n } catch {\n // best-effort cleanup only\n }\n }\n}\n\nexport async function getPackageInfo(\n packageName: string,\n registryUrl: string,\n authToken?: string,\n options?: CacheOptions,\n): Promise<RegistryPackageInfo | null> {\n const cacheEnabled = !authToken && !options?.disabled;\n\n if (cacheEnabled) {\n const cached = await readCache(registryUrl, packageName, options);\n if (cached) return cached;\n }\n\n const info = await fetchPackageInfo(packageName, registryUrl, authToken);\n if (info && cacheEnabled) {\n await writeCache(registryUrl, packageName, info, options);\n }\n return info;\n}\n","import semver from 'semver';\nimport micromatch from 'micromatch';\nimport type { PackageDistribution } from '../utils/aggregator';\nimport type { ReleaseAgeConfig } from '../config/types';\nimport type {\n AvailableUpgrade,\n PendingUpgrade,\n ReleaseAgeEntry,\n SemverBump,\n UpgradeLevel,\n} from './types';\nimport { getPackageInfo, type CacheOptions } from './cache';\n\nconst CONCURRENCY = 8;\n\nfunction daysSince(dateStr: string): number {\n const ms = Date.now() - new Date(dateStr).getTime();\n return Math.floor(ms / (1000 * 60 * 60 * 24));\n}\n\nfunction classifyBump(installed: string, candidate: string): SemverBump | null {\n const diff = semver.diff(installed, candidate);\n if (!diff) return null;\n if (diff === 'patch' || diff === 'prepatch') return 'patch';\n if (diff === 'minor' || diff === 'preminor') return 'minor';\n if (diff === 'major' || diff === 'premajor') return 'major';\n return null;\n}\n\nfunction pickNewest(versions: { version: string; daysAgo: number }[]): {\n version: string;\n daysAgo: number;\n} {\n return versions.reduce((a, b) => (a.daysAgo < b.daysAgo ? a : b));\n}\n\nfunction upgradeLevel(\n daysAgo: number,\n bump: SemverBump,\n thresholds: ReleaseAgeConfig['thresholds'],\n): UpgradeLevel | null {\n const threshold = thresholds[bump];\n if (threshold === false || threshold === undefined) return null;\n if (daysAgo > threshold) {\n // major bump past its threshold ā mandatory, minor/patch ā needs\n return bump === 'major' ? 'mandatory_upgrade' : 'needs_upgrade';\n }\n return null;\n}\n\nfunction computeReleaseAge(\n installedVersion: string,\n timeMap: Record<string, string>,\n deprecated: string | undefined,\n thresholds: ReleaseAgeConfig['thresholds'],\n distTags: Record<string, string> | undefined,\n severity: 'error' | 'warn',\n): ReleaseAgeEntry {\n const byBump = new Map<SemverBump, { version: string; daysAgo: number }[]>();\n let minCompliantVersion: string | undefined;\n let minCompliantReleasedDaysAgo: number | undefined;\n\n for (const [version, dateStr] of Object.entries(timeMap)) {\n if (version === 'created' || version === 'modified') continue;\n if (!semver.valid(version)) continue;\n if (semver.prerelease(version)) continue;\n if (semver.lte(version, installedVersion)) continue;\n\n const bump = classifyBump(installedVersion, version);\n if (!bump) continue;\n\n const daysAgo = daysSince(dateStr);\n const list = byBump.get(bump) ?? [];\n list.push({ version, daysAgo });\n byBump.set(bump, list);\n\n // Track the oldest release, at whichever bump tier it belongs to, that's\n // still within that tier's configured age threshold (#21) ā generalizes\n // what was previously a patch-only check to all three tiers, since the\n // same \"is this candidate old enough to be safely adopted\" question\n // applies identically to patch, minor, and major bumps, just against a\n // different configured threshold per tier.\n const threshold = thresholds[bump];\n if (\n threshold !== false &&\n threshold !== undefined &&\n daysAgo <= threshold &&\n (minCompliantReleasedDaysAgo === undefined ||\n daysAgo > minCompliantReleasedDaysAgo)\n ) {\n minCompliantVersion = version;\n minCompliantReleasedDaysAgo = daysAgo;\n }\n }\n\n // A bump tier is \"breached\" if its oldest available version is older than the\n // tier's threshold ā report the newest version in that tier as the upgrade\n // target, not the version that happened to trigger the breach.\n const upgrades: AvailableUpgrade[] = [];\n for (const [bump, versions] of byBump.entries()) {\n const oldestDaysAgo = Math.max(...versions.map((v) => v.daysAgo));\n const level = upgradeLevel(oldestDaysAgo, bump, thresholds);\n if (!level) continue;\n\n const newest = pickNewest(versions);\n upgrades.push({\n version: newest.version,\n releasedDaysAgo: newest.daysAgo,\n semverBump: bump,\n level,\n thresholdDays: thresholds[bump] as number,\n });\n }\n\n const finalUpgrades = upgrades.sort(\n (a, b) => b.releasedDaysAgo - a.releasedDaysAgo,\n );\n\n const latestVersion = distTags?.['latest'];\n const latestEntry = latestVersion ? timeMap[latestVersion] : undefined;\n const latestReleasedDaysAgo = latestEntry\n ? daysSince(latestEntry)\n : undefined;\n\n for (const upgrade of finalUpgrades) {\n if (latestVersion && upgrade.version === latestVersion) {\n upgrade.isLatest = true;\n }\n }\n\n const worstLevel: UpgradeLevel | null = finalUpgrades.some(\n (u) => u.level === 'mandatory_upgrade',\n )\n ? 'mandatory_upgrade'\n : finalUpgrades.length > 0\n ? 'needs_upgrade'\n : null;\n\n // Only surface a \"coming due\" advisory when nothing has breached yet ā a\n // package that's already in violation on one tier doesn't also need an\n // \"N days remaining\" note about another, unbreached tier.\n let pendingUpgrade: PendingUpgrade | undefined;\n if (worstLevel === null) {\n for (const [bump, versions] of byBump.entries()) {\n const threshold = thresholds[bump];\n if (threshold === false || threshold === undefined) continue;\n\n const oldestDaysAgo = Math.max(...versions.map((v) => v.daysAgo));\n const daysRemaining = threshold - oldestDaysAgo;\n if (daysRemaining <= 0) continue;\n\n if (!pendingUpgrade || daysRemaining < pendingUpgrade.daysRemaining) {\n const newest = pickNewest(versions);\n pendingUpgrade = {\n version: newest.version,\n semverBump: bump,\n releasedDaysAgo: newest.daysAgo,\n thresholdDays: threshold,\n daysRemaining,\n };\n }\n }\n }\n\n return {\n installedVersion,\n upgrades: finalUpgrades,\n worstLevel,\n pendingUpgrade,\n deprecated,\n latestVersion,\n latestReleasedDaysAgo,\n minCompliantVersion,\n minCompliantReleasedDaysAgo,\n severity,\n };\n}\n\nexport async function enrichWithReleaseAge(\n packages: PackageDistribution[],\n config: ReleaseAgeConfig,\n): Promise<{ enriched: PackageDistribution[]; skipped: number }> {\n const registryUrl = config.registry;\n const authToken =\n config.authToken ?? process.env['HERMEX_REGISTRY_AUTH_TOKEN'];\n const targets = packages.filter((p) => !p.internal && p.version);\n const enriched = [...packages];\n let skipped = 0;\n\n const envTtl = Number(process.env['HERMEX_REGISTRY_CACHE_TTL_MS']);\n const cacheOptions: CacheOptions = {\n ttlMs: Number.isFinite(envTtl) && envTtl > 0 ? envTtl : config.cacheTtlMs,\n disabled:\n process.env['HERMEX_REGISTRY_CACHE_DISABLED'] === '1' ||\n config.cacheDisabled === true,\n };\n\n // Process in batches of CONCURRENCY\n for (let i = 0; i < targets.length; i += CONCURRENCY) {\n const batch = targets.slice(i, i + CONCURRENCY);\n const results = await Promise.all(\n batch.map(async (pkg) => {\n const info = await getPackageInfo(\n pkg.packageName,\n registryUrl,\n authToken,\n cacheOptions,\n );\n if (!info || !info.time) {\n skipped++;\n return { pkg, entry: null };\n }\n\n const deprecated =\n info.versions?.[pkg.version!]?.deprecated ?? info.deprecated;\n\n const severity: 'error' | 'warn' =\n config.enforceOn.length === 0 ||\n micromatch.isMatch(pkg.packageName, config.enforceOn)\n ? 'error'\n : 'warn';\n\n const entry = computeReleaseAge(\n pkg.version!,\n info.time,\n typeof deprecated === 'string' ? deprecated : undefined,\n config.thresholds,\n info['dist-tags'],\n severity,\n );\n\n return { pkg, entry };\n }),\n );\n\n for (const { pkg, entry } of results) {\n if (!entry) continue;\n const idx = enriched.findIndex((p) => p.packageName === pkg.packageName);\n if (idx !== -1) {\n enriched[idx] = { ...enriched[idx], releaseAge: entry };\n }\n }\n }\n\n return { enriched, skipped };\n}\n","import type { Ora } from 'ora';\nimport chalk from 'chalk';\nimport { parseFile } from '../swc-parser';\nimport type { UsageReport } from '../swc-parser';\nimport type { ParseError } from '../swc-parser/types';\nimport { aggregateReports } from '../utils/aggregator';\nimport type { AggregatedReport } from '../utils/aggregator';\nimport { printErrors } from '../utils/print-errors';\nimport { findFiles } from '../utils/file-utils';\nimport { findAndParseLockfile } from '../lock-parser';\nimport { evaluateRules } from '../rules/evaluator';\nimport { enrichWithReleaseAge } from '../npm-registry/enricher';\nimport type { HermexConfig } from '../config/types';\n\nconst DECLARATION_FILE_RE = /\\.d\\.(ts|mts|cts)$/;\n\nfunction isDeclarationFile(filePath: string): boolean {\n return DECLARATION_FILE_RE.test(filePath);\n}\n\n/**\n * Runs the shared parse ā aggregate ā rules ā release-age pipeline used by\n * both `scan` and `comply`. Returns `null` if no files matched (the spinner\n * has already reported the failure); throws on unexpected errors.\n */\nexport async function runPipeline(\n config: HermexConfig,\n spinner: Ora,\n isJson: boolean,\n): Promise<AggregatedReport | null> {\n const lockfileResult = findAndParseLockfile(process.cwd());\n\n spinner.succeed(\n chalk.blue(\n `š¦ Found ${lockfileResult.lockfileType} lockfile (supports: ${lockfileResult.supportedVersions.join(', ')}) - ${Object.keys(lockfileResult.versions).length} packages`,\n ),\n );\n\n spinner.start('Finding files...');\n const discovered = await findFiles(config.includes, config.excludes);\n const files = discovered.filter((f) => !isDeclarationFile(f));\n\n if (files.length === 0) {\n spinner.fail(\n chalk.red(\n `No files found matching includes: ${config.includes.join(', ')}`,\n ),\n );\n return null;\n }\n\n spinner.succeed(chalk.green(` Found ${files.length} files`));\n\n spinner.start('Analyzing files...');\n const reports: UsageReport[] = [];\n const parseErrors: ParseError[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n spinner.text = `Analyzing files... (${i + 1}/${files.length})`;\n\n try {\n const report = parseFile(file);\n if (report) {\n reports.push(report);\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n parseErrors.push({ file, message });\n }\n }\n\n spinner.succeed(\n chalk.green(\n `Analysis complete! Analyzed ${reports.length}/${files.length} files`,\n ),\n );\n\n printErrors(parseErrors, isJson);\n\n const aggregated = aggregateReports(\n reports,\n lockfileResult.versions,\n config,\n lockfileResult.multiVersions,\n );\n\n const evaluatorViolations = evaluateRules(\n process.cwd(),\n config.rules,\n config.excludes,\n files,\n );\n aggregated.ruleViolations = [\n ...aggregated.ruleViolations,\n ...evaluatorViolations,\n ];\n\n if (config.releaseAge.enabled) {\n spinner.start('Fetching release age from registry...');\n const { enriched, skipped } = await enrichWithReleaseAge(\n aggregated.packageDistribution,\n config.releaseAge,\n );\n aggregated.packageDistribution = enriched;\n spinner.succeed(\n chalk.blue(\n `š
Release age fetched${skipped > 0 ? chalk.gray(` (${skipped} packages skipped ā registry unreachable or not found)`) : ''}`,\n ),\n );\n }\n\n return aggregated;\n}\n","import ora from 'ora';\nimport type { Ora } from 'ora';\nimport chalk from 'chalk';\nimport { getVersion } from '../utils/version';\nimport { applyColorLevel, resolveColorLevel } from '../utils/severity-format';\nimport type { HermexConfig } from '../config/types';\n\nexport interface CommandContext {\n isJson: boolean;\n spinner: Ora;\n}\n\nexport interface CommandContextOptions {\n /** Overrides config.output.format when set (from --format). */\n format?: 'human' | 'json';\n /** Set to false when --no-color is passed. */\n color?: boolean;\n}\n\n/**\n * Shared command preamble: routes human-readable chrome (version line,\n * spinner) to stderr when the command emits JSON on stdout.\n */\nexport function createCommandContext(\n config: HermexConfig,\n options: CommandContextOptions = {},\n): CommandContext {\n applyColorLevel(\n resolveColorLevel({\n colorFlag: options.color === false ? false : undefined,\n noColorEnv: process.env['NO_COLOR'],\n }),\n );\n\n const isJson = (options.format ?? config.output.format) === 'json';\n const stream = isJson ? process.stderr : process.stdout;\n stream.write(chalk.gray(`hermex v${getVersion()}\\n`));\n const spinner = ora({ text: 'Parsing lockfile...', stream }).start();\n return { isJson, spinner };\n}\n","import { Command, Option } from 'commander';\nimport chalk from 'chalk';\nimport { aggregateReports } from '../utils/aggregator';\nimport { printSummary } from '../utils/print-summary';\nimport { printDetails } from '../utils/print-details';\nimport { printComponents } from '../utils/print-components';\nimport { printPatterns } from '../utils/print-patterns';\nimport { printPackages } from '../utils/print-packages';\nimport { printVersus } from '../utils/print-versus';\nimport { printRules } from '../utils/print-rules';\nimport { printJson } from '../utils/print-json';\nimport { loadConfig } from '../config/loader';\nimport { runPipeline } from './pipeline';\nimport { createCommandContext } from './command-context';\nimport type { CommandContextOptions } from './command-context';\nimport type { HermexConfig } from '../config/types';\n\nexport function registerScanCommand(program: Command) {\n program\n .command('scan')\n .description('Scan and analyze local files')\n .option(\n '--config <path>',\n 'Path to hermex config file (overrides CWD discovery)',\n )\n .addOption(\n new Option(\n '--format <format>',\n 'Output format, overrides output.format in the config file',\n ).choices(['human', 'json']),\n )\n .option('--no-color', 'Disable colored output (see also NO_COLOR env var)')\n .action(\n async (options: {\n config?: string;\n format?: 'human' | 'json';\n color?: boolean;\n }) => {\n const config = await loadConfig(process.cwd(), options.config);\n await executeScan(config, {\n format: options.format,\n color: options.color,\n });\n },\n );\n}\n\nexport async function executeScan(\n config: HermexConfig,\n contextOptions: CommandContextOptions = {},\n) {\n const { isJson, spinner } = createCommandContext(config, contextOptions);\n\n try {\n const aggregated = await runPipeline(config, spinner, isJson);\n if (!aggregated) return;\n\n if (isJson) {\n printJson(aggregated);\n } else {\n printScanResults(aggregated, config);\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red('Analysis failed: ' + message));\n process.exitCode = 1;\n }\n}\n\nfunction printScanResults(\n aggregated: ReturnType<typeof aggregateReports>,\n config: HermexConfig,\n) {\n if (config.output.packages) {\n printPackages(aggregated, config.output.packages);\n }\n\n if (config.output.versus) {\n printVersus(aggregated);\n }\n\n if (config.output.rules) {\n printRules(aggregated);\n }\n\n if (config.output.details) {\n printDetails(aggregated);\n }\n\n if (config.output.components) {\n printComponents(aggregated, config.output.components);\n }\n\n if (config.output.patterns) {\n printPatterns(aggregated, config.output.patterns);\n }\n\n if (config.output.summary) {\n printSummary(aggregated);\n }\n}\n","import chalk from 'chalk';\nimport type { ComplianceResult } from './compliance';\nimport { severityIcon } from './severity-format';\n\n/**\n * Prints only the bottom-line verdict ā the Compliance and Packages sections\n * printed above this already itemize every violation (rule and release-age\n * alike), so repeating them here would just restate the same š“ rows.\n */\nexport function printComplianceVerdict(result: ComplianceResult): void {\n const mandatoryCount =\n result.errorRuleViolations.length +\n result.errorBannedPackageViolations.length +\n result.mandatoryReleaseAgeViolations.length;\n\n if (result.compliant) {\n console.log(\n chalk.greenBright.bold(`\\n${severityIcon('success')} COMPLIANT\\n`),\n );\n return;\n }\n\n console.log(chalk.redBright.bold(`\\n${severityIcon('error')} NOT COMPLIANT`));\n console.log(\n chalk.red(\n ` ${mandatoryCount} mandatory violation${mandatoryCount > 1 ? 's' : ''} found`,\n ),\n );\n console.log();\n}\n","import type { AggregatedReport } from './aggregator';\nimport type { RuleViolation } from '../rules/evaluator';\nimport type { BannedPackageViolation } from './package-rules';\nimport type { PackageDistribution } from './package-distribution';\n\nexport interface ComplianceResult {\n compliant: boolean;\n errorRuleViolations: RuleViolation[];\n errorBannedPackageViolations: BannedPackageViolation[];\n mandatoryReleaseAgeViolations: PackageDistribution[];\n}\n\n/**\n * A package is a mandatory compliance failure only when its releaseAge\n * severity is 'error' (i.e. it's in scope per `releaseAge.enforceOn`) AND\n * its worstLevel is 'mandatory_upgrade' ā 'needs_upgrade' (patch/minor) is\n * advisory even for enforced packages, matching the existing \"mandatory\"\n * vocabulary already used by upgradeLevel().\n */\nexport function computeCompliance(\n aggregated: AggregatedReport,\n): ComplianceResult {\n const errorRuleViolations = aggregated.ruleViolations.filter(\n (v) => v.severity === 'error',\n );\n const errorBannedPackageViolations =\n aggregated.bannedPackageViolations.filter((v) => v.severity === 'error');\n const mandatoryReleaseAgeViolations = aggregated.packageDistribution.filter(\n (p) =>\n p.releaseAge?.severity === 'error' &&\n p.releaseAge?.worstLevel === 'mandatory_upgrade',\n );\n\n return {\n compliant:\n errorRuleViolations.length === 0 &&\n errorBannedPackageViolations.length === 0 &&\n mandatoryReleaseAgeViolations.length === 0,\n errorRuleViolations,\n errorBannedPackageViolations,\n mandatoryReleaseAgeViolations,\n };\n}\n","import { Command, Option } from 'commander';\nimport chalk from 'chalk';\nimport { printJson } from '../utils/print-json';\nimport { printRules } from '../utils/print-rules';\nimport { printPackages } from '../utils/print-packages';\nimport { printVersus } from '../utils/print-versus';\nimport { printComplianceVerdict } from '../utils/print-compliance';\nimport { computeCompliance } from '../utils/compliance';\nimport { loadConfig } from '../config/loader';\nimport { runPipeline } from './pipeline';\nimport { createCommandContext } from './command-context';\nimport type { CommandContextOptions } from './command-context';\nimport type { HermexConfig } from '../config/types';\n\nexport function registerComplyCommand(program: Command) {\n program\n .command('comply')\n .description(\n 'Check compliance with hermex.config.ts rules and release-age policy (exits non-zero if not compliant)',\n )\n .option(\n '--config <path>',\n 'Path to hermex config file (overrides CWD discovery)',\n )\n .addOption(\n new Option(\n '--format <format>',\n 'Output format, overrides output.format in the config file',\n ).choices(['human', 'json']),\n )\n .option('--no-color', 'Disable colored output (see also NO_COLOR env var)')\n .action(\n async (options: {\n config?: string;\n format?: 'human' | 'json';\n color?: boolean;\n }) => {\n const config = await loadConfig(process.cwd(), options.config);\n await executeComply(config, {\n format: options.format,\n color: options.color,\n });\n },\n );\n}\n\nexport async function executeComply(\n config: HermexConfig,\n contextOptions: CommandContextOptions = {},\n) {\n const { isJson, spinner } = createCommandContext(config, contextOptions);\n\n try {\n // Runs the full pipeline to completion regardless of violations found ā\n // comply must report everything in one pass, not fail on the first issue.\n const aggregated = await runPipeline(config, spinner, isJson);\n if (!aggregated) {\n process.exitCode = 2;\n return;\n }\n\n const compliance = computeCompliance(aggregated);\n\n if (isJson) {\n printJson(aggregated);\n } else {\n printRules(aggregated);\n if (config.releaseAge.enabled) {\n printPackages(aggregated, 'table');\n }\n if (config.output.versus) {\n printVersus(aggregated);\n }\n printComplianceVerdict(compliance);\n }\n\n process.exitCode = compliance.compliant ? 0 : 1;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red('Compliance check failed: ' + message));\n process.exitCode = 2;\n }\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { registerScanCommand } from './commands/scan';\nimport { registerComplyCommand } from './commands/comply';\nimport { getVersion } from './utils/version';\n\nexport const program = new Command();\n\nprogram\n .name('hermex')\n .description('Analyze React component usage patterns in your codebase')\n .version(getVersion());\n\nregisterScanCommand(program);\nregisterComplyCommand(program);\n\nprogram.parse(process.argv);\n"],"mappings":"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"}
|