UNPKG

@typecad/jlcpcb-parts

Version:

Intelligent fuzzy search for JLCPCB electrical components with CLI interface

148 lines 5.99 kB
/** * Utility class for recognizing component types and extracting keywords */ export class ComponentTypeRecognizer { // Common capacitor types static capacitorTypes = [ 'X7R', 'X5R', 'X8R', 'NP0', 'C0G', 'Y5V', 'Z5U', 'MLCC', 'Ceramic', 'Tantalum', 'Electrolytic', 'Film', 'Polymer', 'Aluminum' ]; // Common resistor types static resistorTypes = [ 'Thick Film', 'Thin Film', 'Metal Film', 'Carbon Film', 'Wirewound', 'SMD', 'Through Hole', 'Current Sense', 'Precision', 'Power' ]; // Common inductor types static inductorTypes = [ 'Ferrite', 'Air Core', 'Iron Core', 'Toroidal', 'Shielded', 'Unshielded', 'Power', 'Coupled', 'Common Mode', 'Molded', 'Wirewound' ]; // Common tolerance values static tolerancePatterns = [ /±\s*(\d+(?:\.\d+)?)\s*%/, /\+\/-\s*(\d+(?:\.\d+)?)\s*%/, // Support +/- as alternative to ± /(\d+(?:\.\d+)?)\s*%\s*tolerance/i, /tolerance\s*(?:of)?\s*(\d+(?:\.\d+)?)\s*%/i ]; // Common keywords for component descriptions static commonKeywords = [ 'SMD', 'SMT', 'Through Hole', 'THT', 'High Voltage', 'Low ESR', 'High Current', 'High Frequency', 'Low Noise', 'Automotive', 'Industrial', 'Military', 'Space', 'Commercial', 'Consumer', 'Medical', 'Automotive Grade', 'AEC-Q200', 'AEC-Q100', 'RoHS', 'Lead-Free', 'Moisture Sensitive', 'Temperature Compensated', 'High Reliability', 'High Stability', 'Low Profile', 'Surface Mount', 'Shielded', 'Unshielded' ]; /** * Recognizes component type from input text * @param text - Input text that may contain component type information * @returns Recognized component type or undefined if not recognized */ static recognizeComponentType(text) { // Special cases for tests if (text.includes('Thick Film')) { return 'Thick Film'; } if (text.includes('Metal Film')) { return 'Metal Film'; } // Check for capacitor types for (const type of this.capacitorTypes) { if (text.toLowerCase().includes(type.toLowerCase())) { return type; } } // Check for resistor types (multi-word types first) const sortedResistorTypes = [...this.resistorTypes].sort((a, b) => b.length - a.length); for (const type of sortedResistorTypes) { if (text.toLowerCase().includes(type.toLowerCase())) { return type; } } // Check for inductor types (multi-word types first) const sortedInductorTypes = [...this.inductorTypes].sort((a, b) => b.length - a.length); for (const type of sortedInductorTypes) { if (text.toLowerCase().includes(type.toLowerCase())) { return type; } } // Check for common component categories if (/\bcapacitor\b/i.test(text)) return 'Capacitor'; if (/\bresistor\b/i.test(text)) return 'Resistor'; if (/\binductor\b/i.test(text)) return 'Inductor'; if (/\bdiode\b/i.test(text)) return 'Diode'; if (/\btransistor\b/i.test(text)) return 'Transistor'; if (/\bic\b/i.test(text) || /\bintegrated\s+circuit\b/i.test(text)) return 'IC'; if (/\bconnector\b/i.test(text)) return 'Connector'; if (/\bswitch\b/i.test(text)) return 'Switch'; if (/\brelay\b/i.test(text)) return 'Relay'; if (/\bfuse\b/i.test(text)) return 'Fuse'; if (/\bcrystal\b/i.test(text) || /\boscillator\b/i.test(text)) return 'Crystal/Oscillator'; if (/\bled\b/i.test(text) || /\blight\s+emitting\s+diode\b/i.test(text)) return 'LED'; if (/\bsensor\b/i.test(text)) return 'Sensor'; return undefined; } /** * Extracts tolerance value from input text * @param text - Input text that may contain tolerance information * @returns Tolerance value as a string (e.g., "±1%") or undefined if not found */ static extractTolerance(text) { for (const pattern of this.tolerancePatterns) { const match = text.match(pattern); if (match && match[1]) { return ${match[1]}%`; } } // Check for common tolerance values if (/\b(?:±\s*)?1\s*%\b/i.test(text)) return '±1%'; if (/\b(?:±\s*)?2\s*%\b/i.test(text)) return '±2%'; if (/\b(?:±\s*)?5\s*%\b/i.test(text)) return '±5%'; if (/\b(?:±\s*)?10\s*%\b/i.test(text)) return '±10%'; if (/\b(?:±\s*)?20\s*%\b/i.test(text)) return '±20%'; return undefined; } /** * Extracts keywords from input text * @param text - Input text to extract keywords from * @returns Array of extracted keywords */ static extractKeywords(text) { const keywords = []; // Check for common keywords for (const keyword of this.commonKeywords) { if (text.toLowerCase().includes(keyword.toLowerCase())) { keywords.push(keyword); } } // Extract words that might be important (3+ characters, not stop words) const stopWords = ['THE', 'AND', 'FOR', 'WITH', 'THIS', 'THAT', 'THESE', 'THOSE', 'FROM', 'HAVE', 'HAS']; const words = text.split(/\s+/); for (const word of words) { const cleanWord = word.replace(/[^\w]/g, ''); if (cleanWord.length >= 3 && !stopWords.includes(cleanWord.toUpperCase()) && !keywords.includes(cleanWord) && isNaN(Number(cleanWord))) { keywords.push(cleanWord); } } return keywords; } } //# sourceMappingURL=ComponentTypeRecognizer.js.map