@pranavraut033/ats-checker 0.1.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/README.md +47 -0
- package/dist/index.d.mts +135 -0
- package/dist/index.d.ts +135 -0
- package/dist/index.js +757 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +753 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/text.ts","../src/utils/skills.ts","../src/core/parser/jd.parser.ts","../src/utils/dates.ts","../src/core/parser/resume.parser.ts","../src/core/rules/rule.engine.ts","../src/core/scoring/scorer.ts","../src/profiles/index.ts","../src/core/scoring/weights.ts","../src/core/suggestions/suggestion.engine.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const STOP_WORDS = new Set([\n \"the\",\n \"and\",\n \"or\",\n \"a\",\n \"an\",\n \"of\",\n \"for\",\n \"to\",\n \"with\",\n \"in\",\n \"on\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"is\",\n \"are\",\n \"be\",\n \"this\",\n \"that\",\n \"it\",\n \"was\",\n \"were\",\n \"will\",\n \"can\",\n \"should\",\n \"must\",\n \"have\",\n \"has\",\n \"had\",\n]);\n\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\r\\n?/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nexport function normalizeForComparison(text: string): string {\n return normalizeWhitespace(text).toLowerCase();\n}\n\nexport function splitLines(text: string): string[] {\n return text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nexport function tokenize(text: string): string[] {\n return normalizeForComparison(text)\n .split(/[^a-z0-9+]+/i)\n .map((word) => word.trim())\n .filter((word) => word.length > 1 && !STOP_WORDS.has(word));\n}\n\nexport function unique(values: string[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const lower = value.toLowerCase();\n if (!seen.has(lower)) {\n seen.add(lower);\n output.push(value);\n }\n }\n return output;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function countFrequencies(values: string[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const value of values) {\n counts[value] = (counts[value] ?? 0) + 1;\n }\n return counts;\n}\n\nexport function containsTableLikeStructure(text: string): boolean {\n const lines = splitLines(text);\n let tableLines = 0;\n for (const line of lines) {\n const hasPipeColumns = line.includes(\"|\") && line.split(\"|\").length >= 3;\n const hasTabColumns = /\\t.+\\t/.test(line);\n const hasAlignedSpaces = /( {3,})(\\S+)( {3,}\\S+)/.test(line);\n if (hasPipeColumns || hasTabColumns || hasAlignedSpaces) {\n tableLines += 1;\n }\n }\n return tableLines >= 2;\n}\n","import { SkillAliases } from \"../types/config\";\nimport { unique } from \"./text\";\n\nexport function normalizeSkill(skill: string, aliases: SkillAliases): string {\n const normalized = skill.trim().toLowerCase();\n for (const [canonical, aliasList] of Object.entries(aliases)) {\n if (canonical.toLowerCase() === normalized) {\n return canonical.toLowerCase();\n }\n if (aliasList.some((alias) => alias.toLowerCase() === normalized)) {\n return canonical.toLowerCase();\n }\n }\n return normalized;\n}\n\nexport function normalizeSkills(skills: string[], aliases: SkillAliases): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases)));\n}\n\nexport function expandAliases(skills: string[], aliases: SkillAliases): string[] {\n const expanded: string[] = [];\n for (const skill of skills) {\n const canonical = normalizeSkill(skill, aliases);\n expanded.push(canonical);\n const aliasList = aliases[canonical];\n if (aliasList) {\n expanded.push(...aliasList.map((alias) => alias.toLowerCase()));\n }\n }\n return unique(expanded);\n}\n\nexport function skillMatched(candidate: string, targetSkills: Set<string>, aliases: SkillAliases): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases);\n if (targetSkills.has(normalizedCandidate)) {\n return true;\n }\n for (const alias of Object.values(aliases)) {\n if (alias.map((value) => value.toLowerCase()).includes(normalizedCandidate)) {\n return true;\n }\n }\n return false;\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedJobDescription } from \"../../types/parser\";\nimport { normalizeForComparison, normalizeWhitespace, splitLines, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst DEGREE_KEYWORDS = [\n \"bachelor\",\n \"b.s\",\n \"bs\",\n \"bsc\",\n \"master\",\n \"m.s\",\n \"ms\",\n \"msc\",\n \"phd\",\n \"doctorate\",\n \"mba\",\n \"associate\",\n];\n\nfunction extractRequiredSkills(lines: string[]): string[] {\n const required: string[] = [];\n for (const line of lines) {\n if (/must|require|required|need/i.test(line)) {\n required.push(...line.split(/[,.;•-]/));\n }\n }\n return required.map((value) => value.trim()).filter(Boolean);\n}\n\nfunction extractPreferredSkills(lines: string[]): string[] {\n const preferred: string[] = [];\n for (const line of lines) {\n if (/preferred|nice to have|plus/i.test(line)) {\n preferred.push(...line.split(/[,.;•-]/));\n }\n }\n return preferred.map((value) => value.trim()).filter(Boolean);\n}\n\nfunction extractRoleKeywords(text: string): string[] {\n const roleMatch = text.match(/(engineer|developer|manager|scientist|analyst|designer|architect)/i);\n const titleTokens = roleMatch ? roleMatch[0].split(/\\s+/) : [];\n return unique(tokenize(titleTokens.join(\" \") || text.split(/\\n/)[0] || \"\"));\n}\n\nfunction extractMinExperience(text: string): number | undefined {\n const match = text.match(/(\\d{1,2})\\+?\\s+(?:years|yrs)/i);\n if (match) {\n return Number.parseInt(match[1], 10);\n }\n return undefined;\n}\n\nfunction extractEducationRequirements(text: string): string[] {\n const normalized = normalizeForComparison(text);\n return DEGREE_KEYWORDS.filter((degree) => normalized.includes(degree));\n}\n\nexport function parseJobDescription(\n jobDescription: string,\n config: ResolvedATSConfig\n): ParsedJobDescription {\n const normalizedText = normalizeWhitespace(jobDescription);\n const lines = splitLines(jobDescription);\n\n const requiredSkillsRaw = extractRequiredSkills(lines);\n const preferredSkillsRaw = extractPreferredSkills(lines);\n\n const requiredSkills = normalizeSkills(requiredSkillsRaw, config.skillAliases);\n const preferredSkills = normalizeSkills(preferredSkillsRaw, config.skillAliases);\n const keywords = unique([...requiredSkills, ...preferredSkills, ...tokenize(normalizedText)]);\n\n return {\n raw: jobDescription,\n normalizedText,\n requiredSkills,\n preferredSkills,\n roleKeywords: extractRoleKeywords(jobDescription),\n keywords,\n minExperienceYears: extractMinExperience(jobDescription),\n educationRequirements: extractEducationRequirements(jobDescription),\n };\n}\n","import { ParsedDateRange } from \"../types/parser\";\n\nconst MONTHS: Record<string, number> = {\n jan: 1,\n january: 1,\n feb: 2,\n february: 2,\n mar: 3,\n march: 3,\n apr: 4,\n april: 4,\n may: 5,\n jun: 6,\n june: 6,\n jul: 7,\n july: 7,\n aug: 8,\n august: 8,\n sep: 9,\n sept: 9,\n september: 9,\n oct: 10,\n october: 10,\n nov: 11,\n november: 11,\n dec: 12,\n december: 12,\n};\n\ninterface ParsedDateToken {\n year: number;\n month?: number;\n}\n\nfunction parseDateToken(raw: string): ParsedDateToken | null {\n const cleaned = raw.trim().toLowerCase();\n const monthMatch = cleaned.match(/([a-z]{3,9})\\s*(\\d{4})/i);\n if (monthMatch) {\n const monthName = monthMatch[1].toLowerCase();\n const year = Number.parseInt(monthMatch[2], 10);\n const month = MONTHS[monthName];\n if (!Number.isNaN(year)) {\n return { year, month };\n }\n }\n const yearMatch = cleaned.match(/(20\\d{2}|19\\d{2})/);\n if (yearMatch) {\n const year = Number.parseInt(yearMatch[1], 10);\n return { year };\n }\n return null;\n}\n\nfunction monthsBetween(start: ParsedDateToken, end: ParsedDateToken): number {\n const startMonth = start.month ?? 1;\n const endMonth = end.month ?? 12;\n return (end.year - start.year) * 12 + (endMonth - startMonth + 1);\n}\n\nexport function parseDateRange(text: string): ParsedDateRange | null {\n const normalized = text.trim();\n const rangeMatch = normalized.match(/([A-Za-z]{3,9}\\s+\\d{4}|\\d{4})\\s*(?:-|to|–|—)\\s*(Present|Current|Now|[A-Za-z]{3,9}\\s+\\d{4}|\\d{4})/i);\n if (!rangeMatch) {\n return null;\n }\n const startToken = parseDateToken(rangeMatch[1]);\n const endRaw = rangeMatch[2];\n const isPresent = /present|current|now/i.test(endRaw);\n const endToken = isPresent ? undefined : parseDateToken(endRaw);\n if (!startToken) {\n return null;\n }\n const endTokenResolved: ParsedDateToken = endToken ?? {\n year: new Date().getFullYear(),\n month: new Date().getMonth() + 1,\n };\n const durationInMonths = monthsBetween(startToken, endTokenResolved);\n return {\n raw: normalized,\n start: rangeMatch[1],\n end: isPresent ? \"present\" : rangeMatch[2],\n durationInMonths: durationInMonths > 0 ? durationInMonths : undefined,\n };\n}\n\nexport function sumExperienceYears(ranges: ParsedDateRange[]): number {\n const months = ranges\n .map((range) => range.durationInMonths ?? 0)\n .reduce((total, value) => total + value, 0);\n return Number((months / 12).toFixed(2));\n}\n","import { ResolvedATSConfig } from \"../../types/config\";\nimport { ParsedExperienceEntry, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { parseDateRange, sumExperienceYears } from \"../../utils/dates\";\nimport {\n normalizeForComparison,\n normalizeWhitespace,\n splitLines,\n tokenize,\n unique,\n} from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst SECTION_ALIASES: Record<ResumeSection, string[]> = {\n summary: [\"summary\", \"profile\", \"about\"],\n experience: [\"experience\", \"work experience\", \"professional experience\", \"employment\"],\n skills: [\"skills\", \"technical skills\", \"technologies\"],\n education: [\"education\", \"academics\", \"academic background\"],\n projects: [\"projects\", \"portfolio\"],\n certifications: [\"certifications\", \"licenses\"]\n};\n\nconst ACTION_VERBS = [\n \"led\",\n \"managed\",\n \"built\",\n \"designed\",\n \"implemented\",\n \"developed\",\n \"created\",\n \"improved\",\n \"optimized\",\n \"launched\",\n \"architected\",\n \"delivered\",\n \"shipped\",\n \"collaborated\",\n \"automated\",\n \"mentored\",\n \"modernized\",\n \"reduced\",\n \"increased\",\n];\n\nfunction detectSection(line: string): ResumeSection | null {\n const normalized = line.toLowerCase();\n for (const [section, aliases] of Object.entries(SECTION_ALIASES)) {\n for (const alias of aliases) {\n const headerPattern = new RegExp(`^${alias}(\\s*:)?$`, \"i\");\n if (headerPattern.test(normalized)) {\n return section as ResumeSection;\n }\n }\n }\n return null;\n}\n\nfunction extractSections(text: string): {\n sections: Partial<Record<ResumeSection, string>>;\n detected: ResumeSection[];\n} {\n const lines = splitLines(text);\n const sections: Partial<Record<ResumeSection, string>> = {};\n const detected: ResumeSection[] = [];\n let current: ResumeSection | null = null;\n const buffer: string[] = [];\n\n const flush = () => {\n if (current) {\n sections[current] = buffer.join(\"\\n\").trim();\n buffer.length = 0;\n }\n };\n\n for (const line of lines) {\n const maybeSection = detectSection(line);\n if (maybeSection) {\n flush();\n current = maybeSection;\n detected.push(maybeSection);\n continue;\n }\n buffer.push(line);\n }\n flush();\n return { sections, detected: unique(detected) };\n}\n\nfunction parseSkills(sectionContent: string | undefined, aliases: ResolvedATSConfig[\"skillAliases\"]): string[] {\n if (!sectionContent) return [];\n const raw = sectionContent\n .split(/[,;\\n]/)\n .map((skill) => skill.trim())\n .filter(Boolean);\n return normalizeSkills(raw, aliases);\n}\n\nfunction parseActionVerbs(text: string): string[] {\n const words = tokenize(text);\n return ACTION_VERBS.filter((verb) => words.includes(verb));\n}\n\nfunction parseExperience(sectionContent: string | undefined): {\n entries: ParsedExperienceEntry[];\n rangesInMonths: number[];\n jobTitles: string[];\n} {\n if (!sectionContent) {\n return { entries: [], rangesInMonths: [], jobTitles: [] };\n }\n const lines = splitLines(sectionContent);\n const entries: ParsedExperienceEntry[] = [];\n const rangesInMonths: number[] = [];\n const jobTitles: string[] = [];\n\n for (const line of lines) {\n const range = parseDateRange(line);\n if (range) {\n const previous = entries[entries.length - 1];\n if (previous && !previous.dates) {\n previous.dates = range;\n } else {\n entries.push({ dates: range });\n }\n if (range.durationInMonths) {\n rangesInMonths.push(range.durationInMonths);\n }\n continue;\n }\n\n const titleMatch = line.match(/^(Senior|Lead|Principal|Staff|Software|Full\\s*Stack|Frontend|Backend|Engineer|Developer|Manager|Analyst)[^,-]*/i);\n if (titleMatch) {\n const title = titleMatch[0].trim();\n jobTitles.push(title.toLowerCase());\n const entry: ParsedExperienceEntry = { title, description: line };\n entries.push(entry);\n continue;\n }\n\n if (entries.length > 0) {\n const current = entries[entries.length - 1];\n current.description = [current.description, line].filter(Boolean).join(\" \").trim();\n }\n }\n\n return { entries, rangesInMonths, jobTitles: unique(jobTitles) };\n}\n\nfunction parseEducation(sectionContent: string | undefined): string[] {\n if (!sectionContent) return [];\n return splitLines(sectionContent).map((line) => normalizeForComparison(line));\n}\n\nfunction collectKeywords(text: string): string[] {\n return unique(tokenize(text));\n}\n\nexport function parseResume(resumeText: string, config: ResolvedATSConfig): ParsedResume {\n const normalizedText = normalizeWhitespace(resumeText);\n const { sections, detected } = extractSections(resumeText);\n const skills = parseSkills(sections.skills, config.skillAliases);\n const actionVerbs = parseActionVerbs(normalizedText);\n const experienceData = parseExperience(sections.experience);\n const educationEntries = parseEducation(sections.education);\n const totalExperienceYears = sumExperienceYears(\n experienceData.entries\n .map((entry) => entry.dates)\n .filter((range): range is NonNullable<typeof range> => Boolean(range))\n );\n\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n const warnings: string[] = [];\n for (const section of requiredSections) {\n if (!detected.includes(section)) {\n warnings.push(`${section} section not detected`);\n }\n }\n\n return {\n raw: resumeText,\n normalizedText,\n detectedSections: detected,\n sectionContent: sections,\n skills,\n jobTitles: experienceData.jobTitles,\n actionVerbs,\n educationEntries,\n experience: experienceData.entries,\n totalExperienceYears,\n keywords: collectKeywords(normalizedText),\n warnings,\n };\n}\n","import { ResolvedATSConfig, RuleContext } from \"../../types/config\";\nimport { ParsedJobDescription, ParsedResume, ResumeSection } from \"../../types/parser\";\nimport { containsTableLikeStructure } from \"../../utils/text\";\n\ninterface RuleEvaluationInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n breakdown?: RuleContext[\"breakdown\"];\n matchedKeywords?: string[];\n overusedKeywords?: string[];\n}\n\nexport interface RuleEvaluationResult {\n totalPenalty: number;\n warnings: string[];\n}\n\nexport class RuleEngine {\n constructor(private readonly config: ResolvedATSConfig) {}\n\n private applySectionPenalties(resume: ParsedResume): RuleEvaluationResult {\n const requiredSections: ResumeSection[] = [\"summary\", \"experience\", \"skills\", \"education\"];\n let totalPenalty = 0;\n const warnings: string[] = [];\n\n const penaltyBySection: Record<ResumeSection, number> = {\n summary: this.config.sectionPenalties.missingSummary,\n experience: this.config.sectionPenalties.missingExperience,\n skills: this.config.sectionPenalties.missingSkills,\n education: this.config.sectionPenalties.missingEducation,\n projects: 0,\n certifications: 0,\n };\n\n for (const section of requiredSections) {\n if (!resume.detectedSections.includes(section)) {\n const penalty = penaltyBySection[section] ?? 0;\n totalPenalty += penalty;\n warnings.push(`${section} section missing (penalty ${penalty})`);\n }\n }\n return { totalPenalty, warnings };\n }\n\n private applyDefaultRules(input: RuleEvaluationInput): RuleEvaluationResult {\n let totalPenalty = 0;\n const warnings: string[] = [];\n\n const sectionResult = this.applySectionPenalties(input.resume);\n totalPenalty += sectionResult.totalPenalty;\n warnings.push(...sectionResult.warnings);\n\n if (containsTableLikeStructure(input.resume.raw)) {\n totalPenalty += 8;\n warnings.push(\"Detected table-like or columnar formatting (penalty 8)\");\n }\n\n if (input.overusedKeywords && input.overusedKeywords.length > 0) {\n const penalty = input.overusedKeywords.length * this.config.keywordDensity.overusePenalty;\n totalPenalty += penalty;\n warnings.push(`Keyword stuffing detected for: ${input.overusedKeywords.join(\", \")} (penalty ${penalty})`);\n }\n\n if (input.resume.detectedSections.length < 3) {\n totalPenalty += 5;\n warnings.push(\"Few recognizable sections found (penalty 5)\");\n }\n\n return { totalPenalty, warnings };\n }\n\n evaluate(input: RuleEvaluationInput): RuleEvaluationResult {\n const defaultResult = this.applyDefaultRules(input);\n let totalPenalty = defaultResult.totalPenalty;\n const warnings = [...defaultResult.warnings];\n\n for (const rule of this.config.rules) {\n const context: RuleContext = {\n resume: input.resume,\n job: input.job,\n weights: this.config.weights,\n keywordDensity: this.config.keywordDensity,\n breakdown: input.breakdown,\n matchedKeywords: input.matchedKeywords,\n overusedKeywords: input.overusedKeywords,\n };\n if (rule.condition(context)) {\n totalPenalty += rule.penalty;\n if (rule.warning) {\n warnings.push(rule.warning);\n }\n }\n }\n\n return { totalPenalty, warnings };\n }\n}\n","import { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult, ATSBreakdown } from \"../../types/scoring\";\nimport { ResolvedATSConfig } from \"../../types/config\";\nimport { clamp, countFrequencies, tokenize, unique } from \"../../utils/text\";\nimport { normalizeSkills } from \"../../utils/skills\";\n\nconst REQUIRED_SKILL_WEIGHT = 0.7;\nconst OPTIONAL_SKILL_WEIGHT = 0.3;\nconst EXPERIENCE_YEARS_WEIGHT = 0.75;\nconst EXPERIENCE_ROLE_WEIGHT = 0.25;\n\ninterface ScoringArtifacts {\n matchedKeywords: string[];\n missingKeywords: string[];\n overusedKeywords: string[];\n}\n\nexport interface ScoreComputation extends ATSAnalysisResult {\n missingSkills: string[];\n missingExperienceYears: number;\n educationScore: number;\n}\n\nfunction scoreSkills(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; missing: string[] } {\n const profileRequired = config.profile?.mandatorySkills ?? [];\n const profileOptional = config.profile?.optionalSkills ?? [];\n\n const required = new Set(\n normalizeSkills([...job.requiredSkills, ...profileRequired], config.skillAliases)\n );\n const optional = new Set(\n normalizeSkills([...job.preferredSkills, ...profileOptional], config.skillAliases)\n );\n const resumeSkills = new Set(normalizeSkills(resume.skills, config.skillAliases));\n\n const matchedRequired = [...required].filter((skill) => resumeSkills.has(skill));\n const matchedOptional = [...optional].filter((skill) => resumeSkills.has(skill));\n\n const requiredCoverage = required.size === 0 ? 1 : matchedRequired.length / required.size;\n const optionalCoverage = optional.size === 0 ? 1 : matchedOptional.length / optional.size;\n\n const score = clamp(\n (requiredCoverage * REQUIRED_SKILL_WEIGHT + optionalCoverage * OPTIONAL_SKILL_WEIGHT) * 100,\n 0,\n 100\n );\n\n const missing = [...required].filter((skill) => !resumeSkills.has(skill));\n return { score, missing };\n}\n\nfunction scoreExperience(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number; missingYears: number } {\n const requiredYears = job.minExperienceYears ?? config.profile?.minExperience ?? 0;\n if (!requiredYears) {\n return { score: 100, missingYears: 0 };\n }\n const yearCoverage = clamp(resume.totalExperienceYears / requiredYears, 0, 2);\n const yearsComponent = clamp(yearCoverage, 0, 1) * EXPERIENCE_YEARS_WEIGHT;\n\n const jobRoleSet = new Set(job.roleKeywords.map((value) => value.toLowerCase()));\n const titleMatches = resume.jobTitles.filter((title) => jobRoleSet.has(title.toLowerCase()));\n const titleCoverage = jobRoleSet.size === 0 ? 1 : titleMatches.length / jobRoleSet.size;\n const roleComponent = clamp(titleCoverage, 0, 1) * EXPERIENCE_ROLE_WEIGHT;\n\n const score = clamp((yearsComponent + roleComponent) * 100, 0, 100);\n const missingYears = Math.max(requiredYears - resume.totalExperienceYears, 0);\n return { score, missingYears: Number(missingYears.toFixed(2)) };\n}\n\nfunction scoreKeywords(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): { score: number } & ScoringArtifacts {\n const jobKeywordSet = new Set(job.keywords.map((value) => value.toLowerCase()));\n if (jobKeywordSet.size === 0) {\n return { score: 100, matchedKeywords: [], missingKeywords: [], overusedKeywords: [] };\n }\n\n const resumeTokens = tokenize(resume.normalizedText);\n const resumeTokenSet = new Set(resumeTokens);\n const matchedKeywords = [...jobKeywordSet].filter((keyword) => resumeTokenSet.has(keyword));\n const missingKeywords = [...jobKeywordSet].filter((keyword) => !resumeTokenSet.has(keyword));\n\n const coverage = matchedKeywords.length / jobKeywordSet.size;\n const score = clamp(coverage * 100, 0, 100);\n\n const frequencies = countFrequencies(resumeTokens);\n const totalTokens = resumeTokens.length || 1;\n const overusedKeywords = matchedKeywords.filter((keyword) => {\n const density = (frequencies[keyword] ?? 0) / totalTokens;\n return density > config.keywordDensity.max;\n });\n\n return {\n score,\n matchedKeywords: unique(matchedKeywords),\n missingKeywords: unique(missingKeywords),\n overusedKeywords: unique(overusedKeywords),\n };\n}\n\nfunction scoreEducation(resume: ParsedResume, job: ParsedJobDescription): number {\n if (job.educationRequirements.length === 0) {\n return 100;\n }\n const resumeEducationText = resume.educationEntries.join(\" \");\n const normalizedEducation = resumeEducationText.toLowerCase();\n const matched = job.educationRequirements.filter((requirement) =>\n normalizedEducation.includes(requirement.toLowerCase())\n );\n if (matched.length === 0) {\n return 0;\n }\n return clamp((matched.length / job.educationRequirements.length) * 100, 0, 100);\n}\n\nexport function calculateScore(\n resume: ParsedResume,\n job: ParsedJobDescription,\n config: ResolvedATSConfig\n): ScoreComputation {\n const skillsResult = scoreSkills(resume, job, config);\n const experienceResult = scoreExperience(resume, job, config);\n const keywordResult = scoreKeywords(resume, job, config);\n const educationScore = scoreEducation(resume, job);\n\n const breakdown: ATSBreakdown = {\n skills: skillsResult.score,\n experience: experienceResult.score,\n keywords: keywordResult.score,\n education: educationScore,\n };\n\n const weightedScore =\n breakdown.skills * config.weights.skills +\n breakdown.experience * config.weights.experience +\n breakdown.keywords * config.weights.keywords +\n breakdown.education * config.weights.education;\n\n return {\n score: clamp(Number(weightedScore.toFixed(2)), 0, 100),\n breakdown,\n matchedKeywords: keywordResult.matchedKeywords,\n missingKeywords: keywordResult.missingKeywords,\n overusedKeywords: keywordResult.overusedKeywords,\n suggestions: [],\n warnings: [],\n missingSkills: skillsResult.missing,\n missingExperienceYears: experienceResult.missingYears,\n educationScore,\n };\n}\n","import { ATSProfile, SkillAliases } from \"../types/config\";\n\nexport const defaultSkillAliases: SkillAliases = {\n javascript: [\"js\", \"node\", \"node.js\", \"nodejs\"],\n typescript: [\"ts\"],\n react: [\"reactjs\", \"react.js\"],\n \"c++\": [\"cpp\"],\n \"c#\": [\"csharp\"],\n python: [\"py\"],\n sql: [\"postgres\", \"mysql\", \"sqlite\"],\n graphql: [\"gql\"],\n aws: [\"amazon web services\"],\n azure: [\"microsoft azure\"],\n gcp: [\"google cloud\", \"google cloud platform\"],\n docker: [\"containers\"],\n kubernetes: [\"k8s\"],\n html: [\"html5\"],\n css: [\"css3\"],\n};\n\nexport const softwareEngineerProfile: ATSProfile = {\n name: \"software-engineer\",\n mandatorySkills: [\"javascript\", \"typescript\", \"react\", \"node\"],\n optionalSkills: [\"graphql\", \"sql\", \"docker\"],\n minExperience: 3,\n};\n\nexport const dataScientistProfile: ATSProfile = {\n name: \"data-scientist\",\n mandatorySkills: [\"python\", \"sql\", \"statistics\"],\n optionalSkills: [\"pandas\", \"numpy\", \"pytorch\", \"tensorflow\"],\n minExperience: 2,\n};\n\nexport const productManagerProfile: ATSProfile = {\n name: \"product-manager\",\n mandatorySkills: [\"roadmap\", \"stakeholder management\", \"prioritization\"],\n optionalSkills: [\"a/b testing\", \"analytics\", \"sql\"],\n minExperience: 3,\n};\n\nexport const defaultProfiles: ATSProfile[] = [\n softwareEngineerProfile,\n dataScientistProfile,\n productManagerProfile,\n];\n","import {\n ATSConfig,\n ATSWeights,\n KeywordDensityConfig,\n NormalizedWeights,\n ResolvedATSConfig,\n SectionPenaltyConfig,\n} from \"../../types/config\";\nimport { defaultSkillAliases, softwareEngineerProfile } from \"../../profiles\";\n\nconst DEFAULT_WEIGHTS: ATSWeights = {\n skills: 0.3,\n experience: 0.3,\n keywords: 0.25,\n education: 0.15,\n};\n\nconst DEFAULT_KEYWORD_DENSITY: KeywordDensityConfig = {\n min: 0.0025,\n max: 0.04,\n overusePenalty: 5,\n};\n\nconst DEFAULT_SECTION_PENALTIES: Required<SectionPenaltyConfig> = {\n missingSummary: 4,\n missingExperience: 10,\n missingSkills: 8,\n missingEducation: 6,\n};\n\nfunction normalizeWeights(weights: ATSWeights): NormalizedWeights {\n const total = weights.skills + weights.experience + weights.keywords + weights.education;\n if (total === 0) {\n return { ...weights, normalizedTotal: 1 };\n }\n return {\n skills: weights.skills / total,\n experience: weights.experience / total,\n keywords: weights.keywords / total,\n education: weights.education / total,\n normalizedTotal: 1,\n };\n}\n\nexport function resolveConfig(config: ATSConfig = {}): ResolvedATSConfig {\n const weights: ATSWeights = {\n skills: config.weights?.skills ?? DEFAULT_WEIGHTS.skills,\n experience: config.weights?.experience ?? DEFAULT_WEIGHTS.experience,\n keywords: config.weights?.keywords ?? DEFAULT_WEIGHTS.keywords,\n education: config.weights?.education ?? DEFAULT_WEIGHTS.education,\n };\n\n const resolved: ResolvedATSConfig = {\n weights: normalizeWeights(weights),\n skillAliases: { ...defaultSkillAliases, ...(config.skillAliases ?? {}) },\n profile: config.profile ?? softwareEngineerProfile,\n rules: config.rules ?? [],\n keywordDensity: config.keywordDensity ?? DEFAULT_KEYWORD_DENSITY,\n sectionPenalties: {\n ...DEFAULT_SECTION_PENALTIES,\n ...(config.sectionPenalties ?? {}),\n },\n allowPartialMatches: config.allowPartialMatches ?? true,\n };\n\n return resolved;\n}\n","import { ParsedJobDescription, ParsedResume } from \"../../types/parser\";\nimport { ATSAnalysisResult } from \"../../types/scoring\";\nimport { ScoreComputation } from \"../scoring/scorer\";\n\ninterface SuggestionInput {\n resume: ParsedResume;\n job: ParsedJobDescription;\n score: ScoreComputation;\n ruleWarnings: string[];\n}\n\nfunction formatList(values: string[], max = 6): string {\n const uniqueValues = Array.from(new Set(values));\n const trimmed = uniqueValues.slice(0, max);\n return trimmed.join(\", \") + (uniqueValues.length > max ? \"...\" : \"\");\n}\n\nexport class SuggestionEngine {\n generate(input: SuggestionInput): Pick<ATSAnalysisResult, \"suggestions\" | \"warnings\"> {\n const suggestions: string[] = [];\n const warnings: string[] = [...input.ruleWarnings, ...input.resume.warnings];\n\n if (input.score.missingSkills.length > 0) {\n suggestions.push(\n `Highlight these required skills: ${formatList(input.score.missingSkills)}`\n );\n }\n\n if (input.score.missingKeywords.length > 0) {\n suggestions.push(\n `Incorporate job-specific keywords: ${formatList(input.score.missingKeywords)}`\n );\n }\n\n if (input.score.overusedKeywords.length > 0) {\n suggestions.push(\n `Avoid keyword stuffing for: ${formatList(input.score.overusedKeywords)}`\n );\n }\n\n if (input.score.missingExperienceYears > 0) {\n suggestions.push(\n `Clarify at least ${input.job.minExperienceYears ?? input.score.missingExperienceYears} years of relevant experience with quantified achievements.`\n );\n }\n\n if (input.job.educationRequirements.length > 0 && input.score.educationScore === 0) {\n suggestions.push(\n `State your education credentials matching: ${formatList(input.job.educationRequirements)}`\n );\n }\n\n if (input.resume.actionVerbs.length < 3) {\n suggestions.push(\n \"Strengthen bullet points with impact verbs (led, built, improved, delivered).\"\n );\n }\n\n return { suggestions, warnings };\n }\n}\n","import { parseJobDescription } from \"./core/parser/jd.parser\";\nimport { parseResume } from \"./core/parser/resume.parser\";\nimport { RuleEngine } from \"./core/rules/rule.engine\";\nimport { calculateScore } from \"./core/scoring/scorer\";\nimport { resolveConfig } from \"./core/scoring/weights\";\nimport { SuggestionEngine } from \"./core/suggestions/suggestion.engine\";\nimport { AnalyzeResumeInput, ATSAnalysisResult } from \"./types/scoring\";\nimport { ATSConfig } from \"./types/config\";\nimport { clamp } from \"./utils/text\";\nimport { defaultProfiles, defaultSkillAliases } from \"./profiles\";\n\nexport * from \"./types\";\nexport { defaultProfiles, defaultSkillAliases };\n\n/**\n * Analyze a resume against a job description using deterministic, explainable rules.\n */\nexport function analyzeResume(input: AnalyzeResumeInput): ATSAnalysisResult {\n const resolvedConfig = resolveConfig(input.config ?? ({} as ATSConfig));\n const parsedResume = parseResume(input.resumeText, resolvedConfig);\n const parsedJob = parseJobDescription(input.jobDescription, resolvedConfig);\n\n const scoring = calculateScore(parsedResume, parsedJob, resolvedConfig);\n const ruleEngine = new RuleEngine(resolvedConfig);\n const ruleResult = ruleEngine.evaluate({\n resume: parsedResume,\n job: parsedJob,\n breakdown: scoring.breakdown,\n matchedKeywords: scoring.matchedKeywords,\n overusedKeywords: scoring.overusedKeywords,\n });\n\n const suggestionEngine = new SuggestionEngine();\n const suggestionResult = suggestionEngine.generate({\n resume: parsedResume,\n job: parsedJob,\n score: scoring,\n ruleWarnings: ruleResult.warnings,\n });\n\n const finalScore = clamp(scoring.score - ruleResult.totalPenalty, 0, 100);\n\n return {\n score: finalScore,\n breakdown: scoring.breakdown,\n matchedKeywords: scoring.matchedKeywords,\n missingKeywords: scoring.missingKeywords,\n overusedKeywords: scoring.overusedKeywords,\n suggestions: suggestionResult.suggestions,\n warnings: suggestionResult.warnings,\n };\n}\n"]}
|