diff --git a/.gitignore b/.gitignore index 438657a..b67f46b 100644 Binary files a/.gitignore and b/.gitignore differ diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js new file mode 100644 index 0000000..530d1ed --- /dev/null +++ b/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..4d2dedb --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/convertToSpecs.jsx.html b/coverage/convertToSpecs.jsx.html new file mode 100644 index 0000000..5be3d81 --- /dev/null +++ b/coverage/convertToSpecs.jsx.html @@ -0,0 +1,1162 @@ + + + + + + Code coverage report for convertToSpecs.jsx + + + + + + + + + +
+
+

All files convertToSpecs.jsx

+
+ +
+ 92.99% + Statements + 146/157 +
+ + +
+ 88.26% + Branches + 173/196 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 93.42% + Lines + 142/152 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360  +  +1x +5x +5x +5x +  +  +1x +4x +4x +4x +4x +4x +  +  +  +1x +35x +  +  +  +  +  +  +  +  +  +  +  +  +35x +  +  +35x +  +  +  +  +  +  +  +  +35x +  +  +  +35x +5x +  +  +35x +4x +  +  +  +  +35x +12x +12x +12x +12x +12x +5x +7x +1x +  +  +  +35x +6x +6x +6x +6x +6x +  +  +35x +1x +1x +  +  +35x +5x +5x +5x +  +  +35x +1x +1x +  +  +  +35x +2x +2x +  +  +35x +1x +1x +  +  +35x +1x +1x +  +  +35x +1x +  +  +35x +1x +  +  +  +35x +1x +1x +  +  +  +35x +  +  +  +  +35x +5x +  +30x +  +  +  +  +  +35x +2x +  +  +35x +  +  +  +  +2x +  +  +  +  +35x +  +35x +  +  +  +  +35x +  +  +  +  +35x +5x +  +  +  +35x +35x +  +  +35x +  +26x +26x +  +5x +5x +  +4x +4x +  +  +  +  +  +35x +5x +2x +  +5x +  +  +5x +  +  +  +5x +5x +5x +  +  +  +35x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +35x +4x +1x +  +4x +  +  +4x +1x +  +4x +1x +1x +1x +  +  +  +35x +  +  +  +35x +2x +  +  +  +35x +35x +  +  +  +  +35x +9x +  +  +  +  +  +7x +7x +  +  +9x +8x +8x +  +  +  +35x +35x +  +  +35x +35x +76x +76x +64x +59x +59x +  +  +35x +9x +  +9x +5x +  +  +9x +  +9x +9x +  +  +  +  +35x +  +  +18x +  +6x +  +  +  +35x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +35x +  +  +  +  +  +3x +  +  +  +35x +  +  +  +  +35x +  +  +  +  +  +35x +1x +  +  +35x +  +  +  +  +  +  +  +  +35x +  +  +  + 
import matchLaptopClass from './matchLaptopClass'
+ 
+const forceAppleSpecs = (specs, scores) => {
+  specs.processor = 'Apple M1 / M2 / M3'
+  specs.gpu = 'Apple Silicon GPU (M1/M2/M3)'
+  scores.graphics = 0
+}
+ 
+const forceChromeSpecs = (specs) => {
+  specs.processor = 'Intel Celeron / MediaTek'
+  specs.ram = '4 GB o 8 GB'
+  specs.gpu = 'Gráficos integrados básicos'
+  specs.storage = '64 GB eMMC o 128 GB SSD'
+  specs.rationale.push('ChromeOS está pensado para tareas básicas con hardware modesto.')
+}
+ 
+ 
+const convertToSpecs = (answers) => {
+  const specs = {
+    processor: '',
+    ram: '',
+    storage: '',
+    gpu: '',
+    touchscreen: false,
+    portability: '',
+    os: '',
+    battery: '',
+    rationale: [],
+    warnings: []
+  }
+ 
+  specs.budget = answers.budget
+ 
+ 
+  const scores = {
+    performance: 0,
+    graphics: 0,
+    multitasking: 0,
+    portability: 0,
+    battery: 0,
+    storage: 0
+  }
+ 
+  const uses = answers.mainUse === 'full_use'
+    ? ['basics', 'entertainment', 'gaming', 'work_school', 'creating', 'family']
+    : answers.mainUse || []
+ 
+  if (answers.system === 'mac') {
+    forceAppleSpecs(specs, scores)
+  }
+ 
+  if (answers.system === 'chrome') {
+    forceChromeSpecs(specs)
+  }
+ 
+ 
+  // ==== 1. Scoring según uso ====
+  if (uses.includes('gaming')) {
+    scores.performance += 3.5
+    scores.graphics += 4.5
+    scores.storage += 1
+    specs.rationale.push('Para gaming se requiere GPU dedicada y CPU potente.')
+    if (answers.gamesType === 'complex') {
+      scores.graphics += 3
+    } else if (answers.gamesType === 'simple') {
+      scores.graphics += 1
+    }
+  }
+ 
+  if (uses.includes('creating') || answers.photoVideo === 'pro') {
+    scores.performance += 3
+    scores.graphics += 2.5
+    scores.multitasking += 2
+    scores.storage += 2
+    specs.rationale.push('Creación de contenido profesional requiere potencia y espacio.')
+  }
+ 
+  if (answers.photoVideo === 'basic') {
+    scores.graphics += 1
+    scores.storage += 1
+  }
+ 
+  if (uses.includes('work_school') || answers.workload === 'heavy') {
+    scores.performance += 2.5
+    scores.multitasking += 2.5
+    specs.rationale.push('Trabajo exigente necesita buena CPU y multitarea.')
+  }
+ 
+  if (uses.includes('family')) {
+    scores.multitasking += 1
+    specs.rationale.push('Uso compartido en casa requiere buena capacidad multitarea.')
+  }
+ 
+ 
+  if (answers.webBrowsing === 'heavy') {
+    scores.multitasking += 1.5
+    specs.rationale.push('Muchas pestañas requieren buena RAM.')
+  }
+ 
+  if (answers.location === 'mobile') {
+    scores.portability += 3
+    specs.rationale.push('Necesitas algo ligero y fácil de transportar.')
+  }
+ 
+  if (answers.importance === 'touch') {
+    specs.touchscreen = true
+    specs.rationale.push('Requiere pantalla táctil.')
+  }
+ 
+  if (answers.importance === 'security') {
+    specs.rationale.push('Prioritás seguridad. Buscamos modelos con lector de huellas o reconocimiento facial si es posible.')
+  }
+ 
+  if (answers.importance === 'portability') {
+    specs.rationale.push('Buscás un equipo liviano. Se prioriza que pese menos de 1.5 kg y tenga una pantalla de 14" o menor.')
+  }
+ 
+ 
+  if (answers.battery === 'yes') {
+    scores.battery += 3
+    specs.rationale.push('Priorizás batería de larga duración.')
+  }
+ 
+  // ==== 2. Especificaciones recomendadas ====
+  specs.processor =
+    scores.performance >= 6 ? 'Intel i7 / Ryzen 7' :
+      scores.performance >= 4 ? 'Intel i5 / Ryzen 5' :
+        'Intel i3 / Ryzen 3 o Celeron'
+ 
+  if (answers.system === 'mac') {
+    specs.ram = scores.multitasking >= 4 ? '16 GB' : '8 GB'
+  } else {
+    specs.ram =
+      scores.multitasking >= 4 ? '16 GB' :
+        scores.multitasking >= 2 ? '12 GB' :
+          '8 GB'
+  }
+ 
+  if (answers.system === 'mac' && uses.includes('gaming')) {
+    specs.warnings.push('macOS no es compatible con la mayoría de juegos exigentes. Considerá Windows si es prioridad.')
+  }
+ 
+  if (answers.system === 'chrome' && (
+    answers.photoVideo === 'pro' ||
+    answers.workload === 'heavy' ||
+    uses.includes('gaming'))
+  ) {
+    specs.warnings.push('ChromeOS no es ideal para tareas pesadas o software profesional. Considerá Windows o macOS.')
+  }
+ 
+ 
+ 
+  specs.storage = scores.storage >= 2 ? '512 GB SSD' : '256 GB SSD'
+ 
+  Iif (specs.storage === '256 GB SSD' && uses.includes('creating')) {
+    specs.warnings.push('256 GB puede llenarse rápido con archivos de diseño o video. Considerá 512 GB o más.')
+  }
+ 
+ 
+  specs.gpu =
+    scores.graphics >= 4 ? 'NVIDIA RTX 3050 o superior' :
+      scores.graphics >= 2 ? 'Intel Iris Xe / Radeon Vega' :
+        'Gráficos integrados básicos'
+  // Override para macOS: siempre Apple Silicon
+  if (answers.system === 'mac') {
+    specs.gpu = 'Apple integrada (M1/M2/M3) o Intel HD (modelos antiguos)'
+  }
+ 
+ 
+  specs.portability = scores.portability >= 3 ? 'Alta (menos de 1.5kg, 14")' : 'Media o baja'
+  specs.battery = scores.battery >= 3 ? 'Alta (8h o más)' : 'Media (4-7h)'
+ 
+  // ==== 3. Sistema operativo filtrado ====
+  switch (answers.system) {
+    case 'windows':
+      specs.os = 'Windows 11'
+      break
+    case 'mac':
+      specs.os = 'macOS'
+      break
+    case 'chrome':
+      specs.os = 'ChromeOS'
+      break
+    default:
+      specs.os = 'Windows 11'
+  }
+ 
+  // ==== 4. Validaciones cruzadas ====
+  if (specs.os === 'macOS') {
+    if (uses.includes('gaming')) {
+      specs.warnings.push('macOS no es ideal para juegos exigentes ni es compatible con la mayoría de títulos AAA. Recomendamos Windows.')
+    }
+    Iif (uses.includes('gaming') && answers.system === 'chrome') {
+      specs.warnings.unshift('⚠️ Elegiste "juegos exigentes" pero seleccionaste ChromeOS, que no soporta juegos avanzados. Recomendamos Windows si querés jugar títulos como GTA, FIFA o similares.')
+    }
+    Iif (specs.gpu.includes('RTX')) {
+      specs.warnings.push('Mac no usa GPUs dedicadas tipo RTX, sus chips integrados (M1/M2/M3) tienen gráficas propias.')
+      specs.gpu = 'Apple Silicon GPU (M1/M2/M3)'
+    }
+    Eif (specs.processor.includes('i7') || specs.processor.includes('Ryzen')) {
+      specs.processor = 'Apple M1 / M2 / M3'
+      specs.rationale.push('En macOS se usan procesadores Apple Silicon, no Intel/AMD tradicionales.')
+    }
+  }
+ 
+  if (
+    specs.os === 'macOS' &&
+    answers.budget === 'low' &&
+    (
+      uses.includes('gaming') ||
+      uses.includes('creating') ||
+      uses.includes('work_school') ||
+      answers.workload === 'heavy' ||
+      answers.photoVideo === 'pro'
+    )
+  ) {
+    specs.warnings.unshift('⚠️ Querés hacer cosas muy exigentes en una Mac, pero con menos de $5,000 MXN. No es viable. Recomendamos subir el presupuesto o considerar una laptop con Windows.')
+  }
+ 
+ 
+  if (specs.os === 'ChromeOS') {
+    if (answers.workload === 'heavy') {
+      specs.warnings.push('ChromeOS no es ideal para multitarea exigente ni software pesado.')
+    }
+    Iif (answers.photoVideo === 'pro') {
+      specs.warnings.push('ChromeOS no soporta software profesional como Photoshop o Premiere. Considerá Windows o macOS.')
+    }
+    if (uses.includes('gaming') && answers.gamesType === 'complex') {
+      specs.warnings.push('ChromeOS no puede ejecutar juegos complejos como GTA o FIFA.')
+    }
+    if (specs.gpu.includes('RTX') || specs.processor.includes('i7')) {
+      specs.warnings.push('ChromeOS no usa hardware de alto rendimiento como RTX o i7. Recomendamos evitar este OS si necesitás potencia.')
+      specs.gpu = 'Gráficos integrados básicos'
+      specs.processor = 'Intel Celeron / MediaTek'
+    }
+  }
+ 
+  Iif (answers.budget === 'low' && (specs.processor.includes('i5') || specs.ram === '16 GB')) {
+    specs.warnings.push('Tu presupuesto bajo podría no alcanzar para estas specs. Considerá ajustar prioridades o aumentar presupuesto.')
+  }
+ 
+  if (specs.gpu.includes('RTX') && answers.budget === 'low') {
+    specs.warnings.push('Una GPU RTX requiere un presupuesto medio o alto. Podrías no encontrar algo accesible con esas specs.')
+  }
+ 
+  // ==== 5. RAM recomendada vs real ====
+  const idealRam = scores.multitasking >= 4 ? '16 GB' : scores.multitasking >= 2 ? '12 GB' : '8 GB'
+  Iif (specs.ram !== idealRam) {
+    specs.warnings.push(`Idealmente deberías tener ${idealRam} de RAM para tu uso.`)
+  }
+ 
+  // ==== 6. Validación de coherencia interna de specs ====
+  if (specs.gpu.includes('RTX')) {
+    if (
+      !specs.processor.includes('i5') &&
+      !specs.processor.includes('i7') &&
+      !specs.processor.includes('Ryzen 5') &&
+      !specs.processor.includes('Ryzen 7')
+    ) {
+      specs.processor = 'Intel i5 / Ryzen 5'
+      specs.rationale.push('Se ajustó el procesador porque una GPU RTX requiere al menos un i5 o Ryzen 5.')
+    }
+ 
+    if (specs.ram !== '16 GB') {
+      specs.ram = '16 GB'
+      specs.rationale.push('Se ajustó la RAM porque una GPU RTX necesita al menos 16 GB para funcionar correctamente.')
+    }
+  }
+ 
+  const bestModels = matchLaptopClass(specs)
+  specs.laptopClass = bestModels // 👈 ya es un array de modelos
+ 
+ 
+  const osFilter = specs.os.toLowerCase()
+  specs.laptopClass = bestModels.filter(m => {
+      const name = m.name.toLowerCase()
+      if (osFilter.includes('chrome') && !name.includes('chromebook')) return false
+      if (osFilter.includes('macos') && !name.includes('macbook')) return false
+      Iif (osFilter.includes('windows') && name.includes('macbook')) return false
+      return true
+    }) || []
+ 
+if (specs.laptopClass.length === 0) {
+  let fallbackMsg = '⚠️ No encontramos laptops con ';
+ 
+  if (specs.os === 'ChromeOS') fallbackMsg += 'ChromeOS ';
+  else if (specs.os === 'macOS') fallbackMsg += 'macOS ';
+  else EfallbackMsg += 'el sistema operativo deseado ';
+ 
+  fallbackMsg += 'para tus necesidades. Mostramos opciones similares con Windows.';
+ 
+  specs.warnings.push(fallbackMsg);
+  specs.laptopClass = bestModels;
+}
+ 
+ 
+  // Verificación si el modelo tiene menos RAM que la recomendada
+  if (
+    Array.isArray(bestModels) &&
+    specs.ram === '12 GB' &&
+    bestModels.some(m => m.specs.toLowerCase().includes('8 gb'))
+  ) {
+    specs.warnings.push('Uno de los modelos sugeridos tiene 8 GB de RAM, que puede ser justo si hacés mucha multitarea.')
+  }
+ 
+  // ==== 7. Advertencia crítica por combinación inviable ====
+  Iif (
+    specs.os === 'ChromeOS' &&
+    answers.budget === 'low' &&
+    (
+      uses.includes('gaming') ||
+      uses.includes('creating') ||
+      uses.includes('work_school') ||
+      answers.workload === 'heavy' ||
+      answers.photoVideo === 'pro'
+    )
+  ) {
+    specs.warnings.unshift('⚠️ Estás solicitando tareas exigentes (edición, juegos, multitarea) en un sistema muy limitado (ChromeOS con presupuesto bajo). No es viable cumplir esos requerimientos con esta combinación. Recomendamos considerar Windows con mayor inversión.')
+  }
+ 
+ 
+  if (answers.budget === 'low' && (
+    scores.performance >= 4 ||
+    scores.graphics >= 2 ||
+    scores.multitasking >= 4 ||
+    uses.includes('creating')
+  )) {
+    specs.warnings.push('⚠️ Tu presupuesto bajo puede limitar el rendimiento que necesitás. Considerá ajustar prioridades o aumentar presupuesto.')
+  }
+ 
+  // === VALIDACIÓN DE USO CONTRADICTORIO ===
+  const isBasicUseOnly = Array.isArray(answers.mainUse)
+    ? answers.mainUse.length === 1 && answers.mainUse[0] === 'entertainment'
+    : answers.mainUse === 'entertainment'
+ 
+  const isDemandingUser =
+    answers.workload === 'heavy' ||
+    answers.photoVideo === 'pro' ||
+    scores.performance >= 4 ||
+    scores.multitasking >= 4 ||
+    scores.graphics >= 2.5
+ 
+  if (isBasicUseOnly && isDemandingUser) {
+    specs.warnings.unshift('⚠️ Elegiste un uso simple como "ver videos", pero tus respuestas indican tareas exigentes como edición o multitarea pesada. Considerá ajustar tu selección inicial para mejorar la recomendación.')
+  }
+ 
+  specs.flags = {
+    prioritizePortability: answers.importance === 'portability',
+    prioritizeSecurity: answers.importance === 'security',
+    prioritizeGaming: uses.includes('gaming'),
+    prioritizeScreenQuality: answers.photoVideo === 'pro'
+  }
+ 
+ 
+ 
+  return specs
+}
+ 
+export default convertToSpecs
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..2b89fca --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,4 @@ +{"E:\\Job\\ComputerSelectorHelper\\src\\utils\\convertToSpecs.jsx": {"path":"E:\\Job\\ComputerSelectorHelper\\src\\utils\\convertToSpecs.jsx","statementMap":{"0":{"start":{"line":3,"column":24},"end":{"line":7,"column":null}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"2":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":9,"column":25},"end":{"line":15,"column":null}},"5":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"8":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"9":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"10":{"start":{"line":18,"column":23},"end":{"line":357,"column":null}},"11":{"start":{"line":19,"column":16},"end":{"line":30,"column":null}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"13":{"start":{"line":35,"column":17},"end":{"line":42,"column":null}},"14":{"start":{"line":44,"column":15},"end":{"line":46,"column":27}},"15":{"start":{"line":48,"column":2},"end":{"line":50,"column":null}},"16":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"17":{"start":{"line":52,"column":2},"end":{"line":54,"column":null}},"18":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"19":{"start":{"line":58,"column":2},"end":{"line":68,"column":null}},"20":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}},"21":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"22":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"23":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"24":{"start":{"line":63,"column":4},"end":{"line":67,"column":null}},"25":{"start":{"line":64,"column":6},"end":{"line":64,"column":null}},"26":{"start":{"line":65,"column":11},"end":{"line":67,"column":null}},"27":{"start":{"line":66,"column":6},"end":{"line":66,"column":null}},"28":{"start":{"line":70,"column":2},"end":{"line":76,"column":null}},"29":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"30":{"start":{"line":72,"column":4},"end":{"line":72,"column":null}},"31":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"32":{"start":{"line":74,"column":4},"end":{"line":74,"column":null}},"33":{"start":{"line":75,"column":4},"end":{"line":75,"column":null}},"34":{"start":{"line":78,"column":2},"end":{"line":81,"column":null}},"35":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"36":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"37":{"start":{"line":83,"column":2},"end":{"line":87,"column":null}},"38":{"start":{"line":84,"column":4},"end":{"line":84,"column":null}},"39":{"start":{"line":85,"column":4},"end":{"line":85,"column":null}},"40":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"41":{"start":{"line":89,"column":2},"end":{"line":92,"column":null}},"42":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"43":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"44":{"start":{"line":95,"column":2},"end":{"line":98,"column":null}},"45":{"start":{"line":96,"column":4},"end":{"line":96,"column":null}},"46":{"start":{"line":97,"column":4},"end":{"line":97,"column":null}},"47":{"start":{"line":100,"column":2},"end":{"line":103,"column":null}},"48":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"49":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"50":{"start":{"line":105,"column":2},"end":{"line":108,"column":null}},"51":{"start":{"line":106,"column":4},"end":{"line":106,"column":null}},"52":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"53":{"start":{"line":110,"column":2},"end":{"line":112,"column":null}},"54":{"start":{"line":111,"column":4},"end":{"line":111,"column":null}},"55":{"start":{"line":114,"column":2},"end":{"line":116,"column":null}},"56":{"start":{"line":115,"column":4},"end":{"line":115,"column":null}},"57":{"start":{"line":119,"column":2},"end":{"line":122,"column":null}},"58":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"59":{"start":{"line":121,"column":4},"end":{"line":121,"column":null}},"60":{"start":{"line":125,"column":2},"end":{"line":128,"column":null}},"61":{"start":{"line":130,"column":2},"end":{"line":137,"column":null}},"62":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"63":{"start":{"line":133,"column":4},"end":{"line":136,"column":null}},"64":{"start":{"line":139,"column":2},"end":{"line":141,"column":null}},"65":{"start":{"line":140,"column":4},"end":{"line":140,"column":null}},"66":{"start":{"line":143,"column":2},"end":{"line":149,"column":null}},"67":{"start":{"line":148,"column":4},"end":{"line":148,"column":null}},"68":{"start":{"line":153,"column":2},"end":{"line":153,"column":null}},"69":{"start":{"line":155,"column":2},"end":{"line":157,"column":null}},"70":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"71":{"start":{"line":160,"column":2},"end":{"line":163,"column":null}},"72":{"start":{"line":165,"column":2},"end":{"line":167,"column":null}},"73":{"start":{"line":166,"column":4},"end":{"line":166,"column":null}},"74":{"start":{"line":170,"column":2},"end":{"line":170,"column":null}},"75":{"start":{"line":171,"column":2},"end":{"line":171,"column":null}},"76":{"start":{"line":174,"column":2},"end":{"line":186,"column":null}},"77":{"start":{"line":176,"column":6},"end":{"line":176,"column":null}},"78":{"start":{"line":177,"column":6},"end":{"line":177,"column":null}},"79":{"start":{"line":179,"column":6},"end":{"line":179,"column":null}},"80":{"start":{"line":180,"column":6},"end":{"line":180,"column":null}},"81":{"start":{"line":182,"column":6},"end":{"line":182,"column":null}},"82":{"start":{"line":183,"column":6},"end":{"line":183,"column":null}},"83":{"start":{"line":185,"column":6},"end":{"line":185,"column":null}},"84":{"start":{"line":189,"column":2},"end":{"line":204,"column":null}},"85":{"start":{"line":190,"column":4},"end":{"line":192,"column":null}},"86":{"start":{"line":191,"column":6},"end":{"line":191,"column":null}},"87":{"start":{"line":193,"column":4},"end":{"line":195,"column":null}},"88":{"start":{"line":194,"column":6},"end":{"line":194,"column":null}},"89":{"start":{"line":196,"column":4},"end":{"line":199,"column":null}},"90":{"start":{"line":197,"column":6},"end":{"line":197,"column":null}},"91":{"start":{"line":198,"column":6},"end":{"line":198,"column":null}},"92":{"start":{"line":200,"column":4},"end":{"line":203,"column":null}},"93":{"start":{"line":201,"column":6},"end":{"line":201,"column":null}},"94":{"start":{"line":202,"column":6},"end":{"line":202,"column":null}},"95":{"start":{"line":206,"column":2},"end":{"line":218,"column":null}},"96":{"start":{"line":217,"column":4},"end":{"line":217,"column":null}},"97":{"start":{"line":221,"column":2},"end":{"line":236,"column":null}},"98":{"start":{"line":222,"column":4},"end":{"line":224,"column":null}},"99":{"start":{"line":223,"column":6},"end":{"line":223,"column":null}},"100":{"start":{"line":225,"column":4},"end":{"line":227,"column":null}},"101":{"start":{"line":226,"column":6},"end":{"line":226,"column":null}},"102":{"start":{"line":228,"column":4},"end":{"line":230,"column":null}},"103":{"start":{"line":229,"column":6},"end":{"line":229,"column":null}},"104":{"start":{"line":231,"column":4},"end":{"line":235,"column":null}},"105":{"start":{"line":232,"column":6},"end":{"line":232,"column":null}},"106":{"start":{"line":233,"column":6},"end":{"line":233,"column":null}},"107":{"start":{"line":234,"column":6},"end":{"line":234,"column":null}},"108":{"start":{"line":238,"column":2},"end":{"line":240,"column":null}},"109":{"start":{"line":239,"column":4},"end":{"line":239,"column":null}},"110":{"start":{"line":242,"column":2},"end":{"line":244,"column":null}},"111":{"start":{"line":243,"column":4},"end":{"line":243,"column":null}},"112":{"start":{"line":247,"column":19},"end":{"line":247,"column":null}},"113":{"start":{"line":248,"column":2},"end":{"line":250,"column":null}},"114":{"start":{"line":249,"column":4},"end":{"line":249,"column":null}},"115":{"start":{"line":253,"column":2},"end":{"line":268,"column":null}},"116":{"start":{"line":254,"column":4},"end":{"line":262,"column":null}},"117":{"start":{"line":260,"column":6},"end":{"line":260,"column":null}},"118":{"start":{"line":261,"column":6},"end":{"line":261,"column":null}},"119":{"start":{"line":264,"column":4},"end":{"line":267,"column":null}},"120":{"start":{"line":265,"column":6},"end":{"line":265,"column":null}},"121":{"start":{"line":266,"column":6},"end":{"line":266,"column":null}},"122":{"start":{"line":270,"column":8},"end":{"line":270,"column":null}},"123":{"start":{"line":271,"column":2},"end":{"line":271,"column":null}},"124":{"start":{"line":274,"column":19},"end":{"line":274,"column":null}},"125":{"start":{"line":275,"column":2},"end":{"line":281,"column":null}},"126":{"start":{"line":276,"column":19},"end":{"line":276,"column":null}},"127":{"start":{"line":277,"column":6},"end":{"line":277,"column":null}},"128":{"start":{"line":277,"column":71},"end":{"line":277,"column":null}},"129":{"start":{"line":278,"column":6},"end":{"line":278,"column":null}},"130":{"start":{"line":278,"column":67},"end":{"line":278,"column":null}},"131":{"start":{"line":279,"column":6},"end":{"line":279,"column":null}},"132":{"start":{"line":279,"column":68},"end":{"line":279,"column":null}},"133":{"start":{"line":280,"column":6},"end":{"line":280,"column":null}},"134":{"start":{"line":283,"column":0},"end":{"line":294,"column":null}},"135":{"start":{"line":284,"column":20},"end":{"line":284,"column":null}},"136":{"start":{"line":286,"column":2},"end":{"line":288,"column":null}},"137":{"start":{"line":286,"column":31},"end":{"line":286,"column":null}},"138":{"start":{"line":287,"column":7},"end":{"line":288,"column":null}},"139":{"start":{"line":287,"column":33},"end":{"line":287,"column":null}},"140":{"start":{"line":288,"column":7},"end":{"line":288,"column":null}},"141":{"start":{"line":290,"column":2},"end":{"line":290,"column":null}},"142":{"start":{"line":292,"column":2},"end":{"line":292,"column":null}},"143":{"start":{"line":293,"column":2},"end":{"line":293,"column":null}},"144":{"start":{"line":298,"column":2},"end":{"line":304,"column":null}},"145":{"start":{"line":301,"column":25},"end":{"line":301,"column":null}},"146":{"start":{"line":303,"column":4},"end":{"line":303,"column":null}},"147":{"start":{"line":307,"column":2},"end":{"line":319,"column":null}},"148":{"start":{"line":318,"column":4},"end":{"line":318,"column":null}},"149":{"start":{"line":322,"column":2},"end":{"line":329,"column":null}},"150":{"start":{"line":328,"column":4},"end":{"line":328,"column":null}},"151":{"start":{"line":332,"column":25},"end":{"line":334,"column":null}},"152":{"start":{"line":337,"column":4},"end":{"line":341,"column":null}},"153":{"start":{"line":343,"column":2},"end":{"line":345,"column":null}},"154":{"start":{"line":344,"column":4},"end":{"line":344,"column":null}},"155":{"start":{"line":347,"column":2},"end":{"line":352,"column":null}},"156":{"start":{"line":356,"column":2},"end":{"line":356,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":24},"end":{"line":3,"column":25}},"loc":{"start":{"line":3,"column":32},"end":{"line":7,"column":null}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":25},"end":{"line":9,"column":26}},"loc":{"start":{"line":9,"column":26},"end":{"line":15,"column":null}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":23},"end":{"line":18,"column":24}},"loc":{"start":{"line":18,"column":24},"end":{"line":357,"column":null}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":275,"column":40},"end":{"line":275,"column":null}},"loc":{"start":{"line":275,"column":40},"end":{"line":281,"column":10}},"line":275},"4":{"name":"(anonymous_4)","decl":{"start":{"line":301,"column":20},"end":{"line":301,"column":25}},"loc":{"start":{"line":301,"column":25},"end":{"line":301,"column":null}},"line":301}},"branchMap":{"0":{"loc":{"start":{"line":44,"column":15},"end":{"line":46,"column":27}},"type":"cond-expr","locations":[{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},{"start":{"line":46,"column":6},"end":{"line":46,"column":27}}],"line":44},"1":{"loc":{"start":{"line":46,"column":6},"end":{"line":46,"column":27}},"type":"binary-expr","locations":[{"start":{"line":46,"column":6},"end":{"line":46,"column":21}},{"start":{"line":46,"column":25},"end":{"line":46,"column":27}}],"line":46},"2":{"loc":{"start":{"line":48,"column":2},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":48},"3":{"loc":{"start":{"line":52,"column":2},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":52},"4":{"loc":{"start":{"line":58,"column":2},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":68,"column":null}},{"start":{},"end":{}}],"line":58},"5":{"loc":{"start":{"line":63,"column":4},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":67,"column":null}},{"start":{"line":65,"column":11},"end":{"line":67,"column":null}}],"line":63},"6":{"loc":{"start":{"line":65,"column":11},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":11},"end":{"line":67,"column":null}},{"start":{},"end":{}}],"line":65},"7":{"loc":{"start":{"line":70,"column":2},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":70},"8":{"loc":{"start":{"line":70,"column":6},"end":{"line":70,"column":65}},"type":"binary-expr","locations":[{"start":{"line":70,"column":6},"end":{"line":70,"column":35}},{"start":{"line":70,"column":35},"end":{"line":70,"column":65}}],"line":70},"9":{"loc":{"start":{"line":78,"column":2},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":78},"10":{"loc":{"start":{"line":83,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":2},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":83},"11":{"loc":{"start":{"line":83,"column":6},"end":{"line":83,"column":68}},"type":"binary-expr","locations":[{"start":{"line":83,"column":6},"end":{"line":83,"column":38}},{"start":{"line":83,"column":38},"end":{"line":83,"column":68}}],"line":83},"12":{"loc":{"start":{"line":89,"column":2},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":2},"end":{"line":92,"column":null}},{"start":{},"end":{}}],"line":89},"13":{"loc":{"start":{"line":95,"column":2},"end":{"line":98,"column":null}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":98,"column":null}},{"start":{},"end":{}}],"line":95},"14":{"loc":{"start":{"line":100,"column":2},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":103,"column":null}},{"start":{},"end":{}}],"line":100},"15":{"loc":{"start":{"line":105,"column":2},"end":{"line":108,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":108,"column":null}},{"start":{},"end":{}}],"line":105},"16":{"loc":{"start":{"line":110,"column":2},"end":{"line":112,"column":null}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":112,"column":null}},{"start":{},"end":{}}],"line":110},"17":{"loc":{"start":{"line":114,"column":2},"end":{"line":116,"column":null}},"type":"if","locations":[{"start":{"line":114,"column":2},"end":{"line":116,"column":null}},{"start":{},"end":{}}],"line":114},"18":{"loc":{"start":{"line":119,"column":2},"end":{"line":122,"column":null}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":122,"column":null}},{"start":{},"end":{}}],"line":119},"19":{"loc":{"start":{"line":126,"column":4},"end":{"line":128,"column":null}},"type":"cond-expr","locations":[{"start":{"line":126,"column":30},"end":{"line":126,"column":null}},{"start":{"line":127,"column":6},"end":{"line":128,"column":null}}],"line":126},"20":{"loc":{"start":{"line":127,"column":6},"end":{"line":128,"column":null}},"type":"cond-expr","locations":[{"start":{"line":127,"column":32},"end":{"line":127,"column":null}},{"start":{"line":128,"column":8},"end":{"line":128,"column":null}}],"line":127},"21":{"loc":{"start":{"line":130,"column":2},"end":{"line":137,"column":null}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":137,"column":null}},{"start":{"line":132,"column":9},"end":{"line":137,"column":null}}],"line":130},"22":{"loc":{"start":{"line":131,"column":16},"end":{"line":131,"column":null}},"type":"cond-expr","locations":[{"start":{"line":131,"column":43},"end":{"line":131,"column":53}},{"start":{"line":131,"column":53},"end":{"line":131,"column":null}}],"line":131},"23":{"loc":{"start":{"line":134,"column":6},"end":{"line":136,"column":null}},"type":"cond-expr","locations":[{"start":{"line":134,"column":33},"end":{"line":134,"column":null}},{"start":{"line":135,"column":8},"end":{"line":136,"column":null}}],"line":134},"24":{"loc":{"start":{"line":135,"column":8},"end":{"line":136,"column":null}},"type":"cond-expr","locations":[{"start":{"line":135,"column":35},"end":{"line":135,"column":null}},{"start":{"line":136,"column":10},"end":{"line":136,"column":null}}],"line":135},"25":{"loc":{"start":{"line":139,"column":2},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":2},"end":{"line":141,"column":null}},{"start":{},"end":{}}],"line":139},"26":{"loc":{"start":{"line":139,"column":6},"end":{"line":139,"column":59}},"type":"binary-expr","locations":[{"start":{"line":139,"column":6},"end":{"line":139,"column":34}},{"start":{"line":139,"column":34},"end":{"line":139,"column":59}}],"line":139},"27":{"loc":{"start":{"line":143,"column":2},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":143,"column":2},"end":{"line":149,"column":null}},{"start":{},"end":{}}],"line":143},"28":{"loc":{"start":{"line":143,"column":6},"end":{"line":146,"column":null}},"type":"binary-expr","locations":[{"start":{"line":143,"column":6},"end":{"line":143,"column":null}},{"start":{"line":144,"column":4},"end":{"line":144,"column":null}},{"start":{"line":145,"column":4},"end":{"line":145,"column":null}},{"start":{"line":146,"column":4},"end":{"line":146,"column":26}}],"line":143},"29":{"loc":{"start":{"line":153,"column":18},"end":{"line":153,"column":null}},"type":"cond-expr","locations":[{"start":{"line":153,"column":40},"end":{"line":153,"column":55}},{"start":{"line":153,"column":55},"end":{"line":153,"column":null}}],"line":153},"30":{"loc":{"start":{"line":155,"column":2},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":157,"column":null}},{"start":{},"end":{}}],"line":155},"31":{"loc":{"start":{"line":155,"column":6},"end":{"line":155,"column":67}},"type":"binary-expr","locations":[{"start":{"line":155,"column":6},"end":{"line":155,"column":40}},{"start":{"line":155,"column":40},"end":{"line":155,"column":67}}],"line":155},"32":{"loc":{"start":{"line":161,"column":4},"end":{"line":163,"column":null}},"type":"cond-expr","locations":[{"start":{"line":161,"column":27},"end":{"line":161,"column":null}},{"start":{"line":162,"column":6},"end":{"line":163,"column":null}}],"line":161},"33":{"loc":{"start":{"line":162,"column":6},"end":{"line":163,"column":null}},"type":"cond-expr","locations":[{"start":{"line":162,"column":29},"end":{"line":162,"column":null}},{"start":{"line":163,"column":8},"end":{"line":163,"column":null}}],"line":162},"34":{"loc":{"start":{"line":165,"column":2},"end":{"line":167,"column":null}},"type":"if","locations":[{"start":{"line":165,"column":2},"end":{"line":167,"column":null}},{"start":{},"end":{}}],"line":165},"35":{"loc":{"start":{"line":170,"column":22},"end":{"line":170,"column":null}},"type":"cond-expr","locations":[{"start":{"line":170,"column":48},"end":{"line":170,"column":79}},{"start":{"line":170,"column":79},"end":{"line":170,"column":null}}],"line":170},"36":{"loc":{"start":{"line":171,"column":18},"end":{"line":171,"column":null}},"type":"cond-expr","locations":[{"start":{"line":171,"column":40},"end":{"line":171,"column":60}},{"start":{"line":171,"column":60},"end":{"line":171,"column":null}}],"line":171},"37":{"loc":{"start":{"line":174,"column":2},"end":{"line":186,"column":null}},"type":"switch","locations":[{"start":{"line":175,"column":4},"end":{"line":177,"column":null}},{"start":{"line":178,"column":4},"end":{"line":180,"column":null}},{"start":{"line":181,"column":4},"end":{"line":183,"column":null}},{"start":{"line":184,"column":4},"end":{"line":185,"column":null}}],"line":174},"38":{"loc":{"start":{"line":189,"column":2},"end":{"line":204,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":2},"end":{"line":204,"column":null}},{"start":{},"end":{}}],"line":189},"39":{"loc":{"start":{"line":190,"column":4},"end":{"line":192,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":4},"end":{"line":192,"column":null}},{"start":{},"end":{}}],"line":190},"40":{"loc":{"start":{"line":193,"column":4},"end":{"line":195,"column":null}},"type":"if","locations":[{"start":{"line":193,"column":4},"end":{"line":195,"column":null}},{"start":{},"end":{}}],"line":193},"41":{"loc":{"start":{"line":193,"column":8},"end":{"line":193,"column":64}},"type":"binary-expr","locations":[{"start":{"line":193,"column":8},"end":{"line":193,"column":35}},{"start":{"line":193,"column":35},"end":{"line":193,"column":64}}],"line":193},"42":{"loc":{"start":{"line":196,"column":4},"end":{"line":199,"column":null}},"type":"if","locations":[{"start":{"line":196,"column":4},"end":{"line":199,"column":null}},{"start":{},"end":{}}],"line":196},"43":{"loc":{"start":{"line":200,"column":4},"end":{"line":203,"column":null}},"type":"if","locations":[{"start":{"line":200,"column":4},"end":{"line":203,"column":null}},{"start":{},"end":{}}],"line":200},"44":{"loc":{"start":{"line":200,"column":8},"end":{"line":200,"column":77}},"type":"binary-expr","locations":[{"start":{"line":200,"column":8},"end":{"line":200,"column":42}},{"start":{"line":200,"column":42},"end":{"line":200,"column":77}}],"line":200},"45":{"loc":{"start":{"line":206,"column":2},"end":{"line":218,"column":null}},"type":"if","locations":[{"start":{"line":206,"column":2},"end":{"line":218,"column":null}},{"start":{},"end":{}}],"line":206},"46":{"loc":{"start":{"line":207,"column":4},"end":{"line":214,"column":null}},"type":"binary-expr","locations":[{"start":{"line":207,"column":4},"end":{"line":207,"column":null}},{"start":{"line":208,"column":4},"end":{"line":208,"column":null}},{"start":{"line":210,"column":6},"end":{"line":210,"column":null}},{"start":{"line":211,"column":6},"end":{"line":211,"column":null}},{"start":{"line":212,"column":6},"end":{"line":212,"column":null}},{"start":{"line":213,"column":6},"end":{"line":213,"column":null}},{"start":{"line":214,"column":6},"end":{"line":214,"column":33}}],"line":207},"47":{"loc":{"start":{"line":221,"column":2},"end":{"line":236,"column":null}},"type":"if","locations":[{"start":{"line":221,"column":2},"end":{"line":236,"column":null}},{"start":{},"end":{}}],"line":221},"48":{"loc":{"start":{"line":222,"column":4},"end":{"line":224,"column":null}},"type":"if","locations":[{"start":{"line":222,"column":4},"end":{"line":224,"column":null}},{"start":{},"end":{}}],"line":222},"49":{"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":null}},"type":"if","locations":[{"start":{"line":225,"column":4},"end":{"line":227,"column":null}},{"start":{},"end":{}}],"line":225},"50":{"loc":{"start":{"line":228,"column":4},"end":{"line":230,"column":null}},"type":"if","locations":[{"start":{"line":228,"column":4},"end":{"line":230,"column":null}},{"start":{},"end":{}}],"line":228},"51":{"loc":{"start":{"line":228,"column":8},"end":{"line":228,"column":68}},"type":"binary-expr","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":35}},{"start":{"line":228,"column":35},"end":{"line":228,"column":68}}],"line":228},"52":{"loc":{"start":{"line":231,"column":4},"end":{"line":235,"column":null}},"type":"if","locations":[{"start":{"line":231,"column":4},"end":{"line":235,"column":null}},{"start":{},"end":{}}],"line":231},"53":{"loc":{"start":{"line":231,"column":8},"end":{"line":231,"column":69}},"type":"binary-expr","locations":[{"start":{"line":231,"column":8},"end":{"line":231,"column":37}},{"start":{"line":231,"column":37},"end":{"line":231,"column":69}}],"line":231},"54":{"loc":{"start":{"line":238,"column":2},"end":{"line":240,"column":null}},"type":"if","locations":[{"start":{"line":238,"column":2},"end":{"line":240,"column":null}},{"start":{},"end":{}}],"line":238},"55":{"loc":{"start":{"line":238,"column":6},"end":{"line":238,"column":93}},"type":"binary-expr","locations":[{"start":{"line":238,"column":6},"end":{"line":238,"column":35}},{"start":{"line":238,"column":35},"end":{"line":238,"column":69}},{"start":{"line":238,"column":69},"end":{"line":238,"column":89}}],"line":238},"56":{"loc":{"start":{"line":242,"column":2},"end":{"line":244,"column":null}},"type":"if","locations":[{"start":{"line":242,"column":2},"end":{"line":244,"column":null}},{"start":{},"end":{}}],"line":242},"57":{"loc":{"start":{"line":242,"column":6},"end":{"line":242,"column":61}},"type":"binary-expr","locations":[{"start":{"line":242,"column":6},"end":{"line":242,"column":35}},{"start":{"line":242,"column":35},"end":{"line":242,"column":61}}],"line":242},"58":{"loc":{"start":{"line":247,"column":19},"end":{"line":247,"column":null}},"type":"cond-expr","locations":[{"start":{"line":247,"column":46},"end":{"line":247,"column":56}},{"start":{"line":247,"column":56},"end":{"line":247,"column":null}}],"line":247},"59":{"loc":{"start":{"line":247,"column":56},"end":{"line":247,"column":null}},"type":"cond-expr","locations":[{"start":{"line":247,"column":83},"end":{"line":247,"column":93}},{"start":{"line":247,"column":93},"end":{"line":247,"column":null}}],"line":247},"60":{"loc":{"start":{"line":248,"column":2},"end":{"line":250,"column":null}},"type":"if","locations":[{"start":{"line":248,"column":2},"end":{"line":250,"column":null}},{"start":{},"end":{}}],"line":248},"61":{"loc":{"start":{"line":253,"column":2},"end":{"line":268,"column":null}},"type":"if","locations":[{"start":{"line":253,"column":2},"end":{"line":268,"column":null}},{"start":{},"end":{}}],"line":253},"62":{"loc":{"start":{"line":254,"column":4},"end":{"line":262,"column":null}},"type":"if","locations":[{"start":{"line":254,"column":4},"end":{"line":262,"column":null}},{"start":{},"end":{}}],"line":254},"63":{"loc":{"start":{"line":255,"column":6},"end":{"line":258,"column":null}},"type":"binary-expr","locations":[{"start":{"line":255,"column":6},"end":{"line":255,"column":null}},{"start":{"line":256,"column":6},"end":{"line":256,"column":null}},{"start":{"line":257,"column":6},"end":{"line":257,"column":null}},{"start":{"line":258,"column":6},"end":{"line":258,"column":null}}],"line":255},"64":{"loc":{"start":{"line":264,"column":4},"end":{"line":267,"column":null}},"type":"if","locations":[{"start":{"line":264,"column":4},"end":{"line":267,"column":null}},{"start":{},"end":{}}],"line":264},"65":{"loc":{"start":{"line":275,"column":22},"end":{"line":281,"column":12}},"type":"binary-expr","locations":[{"start":{"line":275,"column":22},"end":{"line":281,"column":10}},{"start":{"line":281,"column":10},"end":{"line":281,"column":12}}],"line":275},"66":{"loc":{"start":{"line":277,"column":6},"end":{"line":277,"column":null}},"type":"if","locations":[{"start":{"line":277,"column":6},"end":{"line":277,"column":null}},{"start":{},"end":{}}],"line":277},"67":{"loc":{"start":{"line":277,"column":10},"end":{"line":277,"column":71}},"type":"binary-expr","locations":[{"start":{"line":277,"column":10},"end":{"line":277,"column":41}},{"start":{"line":277,"column":41},"end":{"line":277,"column":71}}],"line":277},"68":{"loc":{"start":{"line":278,"column":6},"end":{"line":278,"column":null}},"type":"if","locations":[{"start":{"line":278,"column":6},"end":{"line":278,"column":null}},{"start":{},"end":{}}],"line":278},"69":{"loc":{"start":{"line":278,"column":10},"end":{"line":278,"column":67}},"type":"binary-expr","locations":[{"start":{"line":278,"column":10},"end":{"line":278,"column":40}},{"start":{"line":278,"column":40},"end":{"line":278,"column":67}}],"line":278},"70":{"loc":{"start":{"line":279,"column":6},"end":{"line":279,"column":null}},"type":"if","locations":[{"start":{"line":279,"column":6},"end":{"line":279,"column":null}},{"start":{},"end":{}}],"line":279},"71":{"loc":{"start":{"line":279,"column":10},"end":{"line":279,"column":68}},"type":"binary-expr","locations":[{"start":{"line":279,"column":10},"end":{"line":279,"column":42}},{"start":{"line":279,"column":42},"end":{"line":279,"column":68}}],"line":279},"72":{"loc":{"start":{"line":283,"column":0},"end":{"line":294,"column":null}},"type":"if","locations":[{"start":{"line":283,"column":0},"end":{"line":294,"column":null}},{"start":{},"end":{}}],"line":283},"73":{"loc":{"start":{"line":286,"column":2},"end":{"line":288,"column":null}},"type":"if","locations":[{"start":{"line":286,"column":2},"end":{"line":288,"column":null}},{"start":{"line":287,"column":7},"end":{"line":288,"column":null}}],"line":286},"74":{"loc":{"start":{"line":287,"column":7},"end":{"line":288,"column":null}},"type":"if","locations":[{"start":{"line":287,"column":7},"end":{"line":288,"column":null}},{"start":{"line":288,"column":7},"end":{"line":288,"column":null}}],"line":287},"75":{"loc":{"start":{"line":298,"column":2},"end":{"line":304,"column":null}},"type":"if","locations":[{"start":{"line":298,"column":2},"end":{"line":304,"column":null}},{"start":{},"end":{}}],"line":298},"76":{"loc":{"start":{"line":299,"column":4},"end":{"line":301,"column":null}},"type":"binary-expr","locations":[{"start":{"line":299,"column":4},"end":{"line":299,"column":null}},{"start":{"line":300,"column":4},"end":{"line":300,"column":null}},{"start":{"line":301,"column":4},"end":{"line":301,"column":null}}],"line":299},"77":{"loc":{"start":{"line":307,"column":2},"end":{"line":319,"column":null}},"type":"if","locations":[{"start":{"line":307,"column":2},"end":{"line":319,"column":null}},{"start":{},"end":{}}],"line":307},"78":{"loc":{"start":{"line":308,"column":4},"end":{"line":315,"column":null}},"type":"binary-expr","locations":[{"start":{"line":308,"column":4},"end":{"line":308,"column":null}},{"start":{"line":309,"column":4},"end":{"line":309,"column":null}},{"start":{"line":311,"column":6},"end":{"line":311,"column":null}},{"start":{"line":312,"column":6},"end":{"line":312,"column":null}},{"start":{"line":313,"column":6},"end":{"line":313,"column":null}},{"start":{"line":314,"column":6},"end":{"line":314,"column":null}},{"start":{"line":315,"column":6},"end":{"line":315,"column":33}}],"line":308},"79":{"loc":{"start":{"line":322,"column":2},"end":{"line":329,"column":null}},"type":"if","locations":[{"start":{"line":322,"column":2},"end":{"line":329,"column":null}},{"start":{},"end":{}}],"line":322},"80":{"loc":{"start":{"line":322,"column":6},"end":{"line":326,"column":null}},"type":"binary-expr","locations":[{"start":{"line":322,"column":6},"end":{"line":322,"column":null}},{"start":{"line":323,"column":4},"end":{"line":323,"column":null}},{"start":{"line":324,"column":4},"end":{"line":324,"column":null}},{"start":{"line":325,"column":4},"end":{"line":325,"column":null}},{"start":{"line":326,"column":4},"end":{"line":326,"column":28}}],"line":322},"81":{"loc":{"start":{"line":332,"column":25},"end":{"line":334,"column":null}},"type":"cond-expr","locations":[{"start":{"line":333,"column":6},"end":{"line":333,"column":null}},{"start":{"line":334,"column":6},"end":{"line":334,"column":null}}],"line":332},"82":{"loc":{"start":{"line":333,"column":6},"end":{"line":333,"column":null}},"type":"binary-expr","locations":[{"start":{"line":333,"column":6},"end":{"line":333,"column":38}},{"start":{"line":333,"column":38},"end":{"line":333,"column":null}}],"line":333},"83":{"loc":{"start":{"line":337,"column":4},"end":{"line":341,"column":null}},"type":"binary-expr","locations":[{"start":{"line":337,"column":4},"end":{"line":337,"column":null}},{"start":{"line":338,"column":4},"end":{"line":338,"column":null}},{"start":{"line":339,"column":4},"end":{"line":339,"column":null}},{"start":{"line":340,"column":4},"end":{"line":340,"column":null}},{"start":{"line":341,"column":4},"end":{"line":341,"column":null}}],"line":337},"84":{"loc":{"start":{"line":343,"column":2},"end":{"line":345,"column":null}},"type":"if","locations":[{"start":{"line":343,"column":2},"end":{"line":345,"column":null}},{"start":{},"end":{}}],"line":343},"85":{"loc":{"start":{"line":343,"column":6},"end":{"line":343,"column":41}},"type":"binary-expr","locations":[{"start":{"line":343,"column":6},"end":{"line":343,"column":24}},{"start":{"line":343,"column":24},"end":{"line":343,"column":41}}],"line":343}},"s":{"0":1,"1":5,"2":5,"3":5,"4":1,"5":4,"6":4,"7":4,"8":4,"9":4,"10":1,"11":35,"12":35,"13":35,"14":35,"15":35,"16":5,"17":35,"18":4,"19":35,"20":12,"21":12,"22":12,"23":12,"24":12,"25":5,"26":7,"27":1,"28":35,"29":6,"30":6,"31":6,"32":6,"33":6,"34":35,"35":1,"36":1,"37":35,"38":5,"39":5,"40":5,"41":35,"42":1,"43":1,"44":35,"45":2,"46":2,"47":35,"48":1,"49":1,"50":35,"51":1,"52":1,"53":35,"54":1,"55":35,"56":1,"57":35,"58":1,"59":1,"60":35,"61":35,"62":5,"63":30,"64":35,"65":2,"66":35,"67":2,"68":35,"69":35,"70":0,"71":35,"72":35,"73":5,"74":35,"75":35,"76":35,"77":26,"78":26,"79":5,"80":5,"81":4,"82":4,"83":0,"84":35,"85":5,"86":2,"87":5,"88":0,"89":5,"90":0,"91":0,"92":5,"93":5,"94":5,"95":35,"96":1,"97":35,"98":4,"99":1,"100":4,"101":0,"102":4,"103":1,"104":4,"105":1,"106":1,"107":1,"108":35,"109":0,"110":35,"111":2,"112":35,"113":35,"114":0,"115":35,"116":9,"117":7,"118":7,"119":9,"120":8,"121":8,"122":35,"123":35,"124":35,"125":35,"126":76,"127":76,"128":12,"129":64,"130":5,"131":59,"132":0,"133":59,"134":35,"135":9,"136":9,"137":4,"138":5,"139":5,"140":0,"141":9,"142":9,"143":9,"144":35,"145":18,"146":6,"147":35,"148":0,"149":35,"150":3,"151":35,"152":35,"153":35,"154":1,"155":35,"156":35},"f":{"0":5,"1":4,"2":35,"3":76,"4":18},"b":{"0":[1,34],"1":[34,0],"2":[5,30],"3":[4,31],"4":[12,23],"5":[5,7],"6":[1,6],"7":[6,29],"8":[35,32],"9":[1,34],"10":[5,30],"11":[35,32],"12":[1,34],"13":[2,33],"14":[1,34],"15":[1,34],"16":[1,34],"17":[1,34],"18":[1,34],"19":[2,33],"20":[1,32],"21":[5,30],"22":[0,5],"23":[2,28],"24":[7,21],"25":[2,33],"26":[35,5],"27":[2,33],"28":[35,4,4,3],"29":[6,29],"30":[0,35],"31":[35,29],"32":[12,23],"33":[4,19],"34":[5,30],"35":[1,34],"36":[1,34],"37":[26,5,4,0],"38":[5,30],"39":[2,3],"40":[0,5],"41":[5,2],"42":[0,5],"43":[5,0],"44":[5,5],"45":[1,34],"46":[35,5,1,0,0,0,0],"47":[4,31],"48":[1,3],"49":[0,4],"50":[1,3],"51":[4,1],"52":[1,3],"53":[4,3],"54":[0,35],"55":[35,4,4],"56":[2,33],"57":[35,9],"58":[2,33],"59":[7,26],"60":[0,35],"61":[9,26],"62":[7,2],"63":[9,9,7,7],"64":[8,1],"65":[35,0],"66":[12,64],"67":[76,12],"68":[5,59],"69":[64,5],"70":[0,59],"71":[59,59],"72":[9,26],"73":[4,5],"74":[5,0],"75":[6,29],"76":[35,35,6],"77":[0,35],"78":[35,4,0,0,0,0,0],"79":[3,32],"80":[35,4,4,1,1],"81":[34,1],"82":[34,32],"83":[35,31,29,27,27],"84":[1,34],"85":[35,1]},"meta":{"lastBranch":86,"lastFunction":5,"lastStatement":157,"seen":{"s:3:24:7:Infinity":0,"f:3:24:3:25":0,"s:4:2:4:Infinity":1,"s:5:2:5:Infinity":2,"s:6:2:6:Infinity":3,"s:9:25:15:Infinity":4,"f:9:25:9:26":1,"s:10:2:10:Infinity":5,"s:11:2:11:Infinity":6,"s:12:2:12:Infinity":7,"s:13:2:13:Infinity":8,"s:14:2:14:Infinity":9,"s:18:23:357:Infinity":10,"f:18:23:18:24":2,"s:19:16:30:Infinity":11,"s:32:2:32:Infinity":12,"s:35:17:42:Infinity":13,"s:44:15:46:27":14,"b:45:6:45:Infinity:46:6:46:27":0,"b:46:6:46:21:46:25:46:27":1,"b:48:2:50:Infinity:undefined:undefined:undefined:undefined":2,"s:48:2:50:Infinity":15,"s:49:4:49:Infinity":16,"b:52:2:54:Infinity:undefined:undefined:undefined:undefined":3,"s:52:2:54:Infinity":17,"s:53:4:53:Infinity":18,"b:58:2:68:Infinity:undefined:undefined:undefined:undefined":4,"s:58:2:68:Infinity":19,"s:59:4:59:Infinity":20,"s:60:4:60:Infinity":21,"s:61:4:61:Infinity":22,"s:62:4:62:Infinity":23,"b:63:4:67:Infinity:65:11:67:Infinity":5,"s:63:4:67:Infinity":24,"s:64:6:64:Infinity":25,"b:65:11:67:Infinity:undefined:undefined:undefined:undefined":6,"s:65:11:67:Infinity":26,"s:66:6:66:Infinity":27,"b:70:2:76:Infinity:undefined:undefined:undefined:undefined":7,"s:70:2:76:Infinity":28,"b:70:6:70:35:70:35:70:65":8,"s:71:4:71:Infinity":29,"s:72:4:72:Infinity":30,"s:73:4:73:Infinity":31,"s:74:4:74:Infinity":32,"s:75:4:75:Infinity":33,"b:78:2:81:Infinity:undefined:undefined:undefined:undefined":9,"s:78:2:81:Infinity":34,"s:79:4:79:Infinity":35,"s:80:4:80:Infinity":36,"b:83:2:87:Infinity:undefined:undefined:undefined:undefined":10,"s:83:2:87:Infinity":37,"b:83:6:83:38:83:38:83:68":11,"s:84:4:84:Infinity":38,"s:85:4:85:Infinity":39,"s:86:4:86:Infinity":40,"b:89:2:92:Infinity:undefined:undefined:undefined:undefined":12,"s:89:2:92:Infinity":41,"s:90:4:90:Infinity":42,"s:91:4:91:Infinity":43,"b:95:2:98:Infinity:undefined:undefined:undefined:undefined":13,"s:95:2:98:Infinity":44,"s:96:4:96:Infinity":45,"s:97:4:97:Infinity":46,"b:100:2:103:Infinity:undefined:undefined:undefined:undefined":14,"s:100:2:103:Infinity":47,"s:101:4:101:Infinity":48,"s:102:4:102:Infinity":49,"b:105:2:108:Infinity:undefined:undefined:undefined:undefined":15,"s:105:2:108:Infinity":50,"s:106:4:106:Infinity":51,"s:107:4:107:Infinity":52,"b:110:2:112:Infinity:undefined:undefined:undefined:undefined":16,"s:110:2:112:Infinity":53,"s:111:4:111:Infinity":54,"b:114:2:116:Infinity:undefined:undefined:undefined:undefined":17,"s:114:2:116:Infinity":55,"s:115:4:115:Infinity":56,"b:119:2:122:Infinity:undefined:undefined:undefined:undefined":18,"s:119:2:122:Infinity":57,"s:120:4:120:Infinity":58,"s:121:4:121:Infinity":59,"s:125:2:128:Infinity":60,"b:126:30:126:Infinity:127:6:128:Infinity":19,"b:127:32:127:Infinity:128:8:128:Infinity":20,"b:130:2:137:Infinity:132:9:137:Infinity":21,"s:130:2:137:Infinity":61,"s:131:4:131:Infinity":62,"b:131:43:131:53:131:53:131:Infinity":22,"s:133:4:136:Infinity":63,"b:134:33:134:Infinity:135:8:136:Infinity":23,"b:135:35:135:Infinity:136:10:136:Infinity":24,"b:139:2:141:Infinity:undefined:undefined:undefined:undefined":25,"s:139:2:141:Infinity":64,"b:139:6:139:34:139:34:139:59":26,"s:140:4:140:Infinity":65,"b:143:2:149:Infinity:undefined:undefined:undefined:undefined":27,"s:143:2:149:Infinity":66,"b:143:6:143:Infinity:144:4:144:Infinity:145:4:145:Infinity:146:4:146:26":28,"s:148:4:148:Infinity":67,"s:153:2:153:Infinity":68,"b:153:40:153:55:153:55:153:Infinity":29,"b:155:2:157:Infinity:undefined:undefined:undefined:undefined":30,"s:155:2:157:Infinity":69,"b:155:6:155:40:155:40:155:67":31,"s:156:4:156:Infinity":70,"s:160:2:163:Infinity":71,"b:161:27:161:Infinity:162:6:163:Infinity":32,"b:162:29:162:Infinity:163:8:163:Infinity":33,"b:165:2:167:Infinity:undefined:undefined:undefined:undefined":34,"s:165:2:167:Infinity":72,"s:166:4:166:Infinity":73,"s:170:2:170:Infinity":74,"b:170:48:170:79:170:79:170:Infinity":35,"s:171:2:171:Infinity":75,"b:171:40:171:60:171:60:171:Infinity":36,"b:175:4:177:Infinity:178:4:180:Infinity:181:4:183:Infinity:184:4:185:Infinity":37,"s:174:2:186:Infinity":76,"s:176:6:176:Infinity":77,"s:177:6:177:Infinity":78,"s:179:6:179:Infinity":79,"s:180:6:180:Infinity":80,"s:182:6:182:Infinity":81,"s:183:6:183:Infinity":82,"s:185:6:185:Infinity":83,"b:189:2:204:Infinity:undefined:undefined:undefined:undefined":38,"s:189:2:204:Infinity":84,"b:190:4:192:Infinity:undefined:undefined:undefined:undefined":39,"s:190:4:192:Infinity":85,"s:191:6:191:Infinity":86,"b:193:4:195:Infinity:undefined:undefined:undefined:undefined":40,"s:193:4:195:Infinity":87,"b:193:8:193:35:193:35:193:64":41,"s:194:6:194:Infinity":88,"b:196:4:199:Infinity:undefined:undefined:undefined:undefined":42,"s:196:4:199:Infinity":89,"s:197:6:197:Infinity":90,"s:198:6:198:Infinity":91,"b:200:4:203:Infinity:undefined:undefined:undefined:undefined":43,"s:200:4:203:Infinity":92,"b:200:8:200:42:200:42:200:77":44,"s:201:6:201:Infinity":93,"s:202:6:202:Infinity":94,"b:206:2:218:Infinity:undefined:undefined:undefined:undefined":45,"s:206:2:218:Infinity":95,"b:207:4:207:Infinity:208:4:208:Infinity:210:6:210:Infinity:211:6:211:Infinity:212:6:212:Infinity:213:6:213:Infinity:214:6:214:33":46,"s:217:4:217:Infinity":96,"b:221:2:236:Infinity:undefined:undefined:undefined:undefined":47,"s:221:2:236:Infinity":97,"b:222:4:224:Infinity:undefined:undefined:undefined:undefined":48,"s:222:4:224:Infinity":98,"s:223:6:223:Infinity":99,"b:225:4:227:Infinity:undefined:undefined:undefined:undefined":49,"s:225:4:227:Infinity":100,"s:226:6:226:Infinity":101,"b:228:4:230:Infinity:undefined:undefined:undefined:undefined":50,"s:228:4:230:Infinity":102,"b:228:8:228:35:228:35:228:68":51,"s:229:6:229:Infinity":103,"b:231:4:235:Infinity:undefined:undefined:undefined:undefined":52,"s:231:4:235:Infinity":104,"b:231:8:231:37:231:37:231:69":53,"s:232:6:232:Infinity":105,"s:233:6:233:Infinity":106,"s:234:6:234:Infinity":107,"b:238:2:240:Infinity:undefined:undefined:undefined:undefined":54,"s:238:2:240:Infinity":108,"b:238:6:238:35:238:35:238:69:238:69:238:89":55,"s:239:4:239:Infinity":109,"b:242:2:244:Infinity:undefined:undefined:undefined:undefined":56,"s:242:2:244:Infinity":110,"b:242:6:242:35:242:35:242:61":57,"s:243:4:243:Infinity":111,"s:247:19:247:Infinity":112,"b:247:46:247:56:247:56:247:Infinity":58,"b:247:83:247:93:247:93:247:Infinity":59,"b:248:2:250:Infinity:undefined:undefined:undefined:undefined":60,"s:248:2:250:Infinity":113,"s:249:4:249:Infinity":114,"b:253:2:268:Infinity:undefined:undefined:undefined:undefined":61,"s:253:2:268:Infinity":115,"b:254:4:262:Infinity:undefined:undefined:undefined:undefined":62,"s:254:4:262:Infinity":116,"b:255:6:255:Infinity:256:6:256:Infinity:257:6:257:Infinity:258:6:258:Infinity":63,"s:260:6:260:Infinity":117,"s:261:6:261:Infinity":118,"b:264:4:267:Infinity:undefined:undefined:undefined:undefined":64,"s:264:4:267:Infinity":119,"s:265:6:265:Infinity":120,"s:266:6:266:Infinity":121,"s:270:8:270:Infinity":122,"s:271:2:271:Infinity":123,"s:274:19:274:Infinity":124,"s:275:2:281:Infinity":125,"b:275:22:281:10:281:10:281:12":65,"f:275:40:275:Infinity":3,"s:276:19:276:Infinity":126,"b:277:6:277:Infinity:undefined:undefined:undefined:undefined":66,"s:277:6:277:Infinity":127,"b:277:10:277:41:277:41:277:71":67,"s:277:71:277:Infinity":128,"b:278:6:278:Infinity:undefined:undefined:undefined:undefined":68,"s:278:6:278:Infinity":129,"b:278:10:278:40:278:40:278:67":69,"s:278:67:278:Infinity":130,"b:279:6:279:Infinity:undefined:undefined:undefined:undefined":70,"s:279:6:279:Infinity":131,"b:279:10:279:42:279:42:279:68":71,"s:279:68:279:Infinity":132,"s:280:6:280:Infinity":133,"b:283:0:294:Infinity:undefined:undefined:undefined:undefined":72,"s:283:0:294:Infinity":134,"s:284:20:284:Infinity":135,"b:286:2:288:Infinity:287:7:288:Infinity":73,"s:286:2:288:Infinity":136,"s:286:31:286:Infinity":137,"b:287:7:288:Infinity:288:7:288:Infinity":74,"s:287:7:288:Infinity":138,"s:287:33:287:Infinity":139,"s:288:7:288:Infinity":140,"s:290:2:290:Infinity":141,"s:292:2:292:Infinity":142,"s:293:2:293:Infinity":143,"b:298:2:304:Infinity:undefined:undefined:undefined:undefined":75,"s:298:2:304:Infinity":144,"b:299:4:299:Infinity:300:4:300:Infinity:301:4:301:Infinity":76,"f:301:20:301:25":4,"s:301:25:301:Infinity":145,"s:303:4:303:Infinity":146,"b:307:2:319:Infinity:undefined:undefined:undefined:undefined":77,"s:307:2:319:Infinity":147,"b:308:4:308:Infinity:309:4:309:Infinity:311:6:311:Infinity:312:6:312:Infinity:313:6:313:Infinity:314:6:314:Infinity:315:6:315:33":78,"s:318:4:318:Infinity":148,"b:322:2:329:Infinity:undefined:undefined:undefined:undefined":79,"s:322:2:329:Infinity":149,"b:322:6:322:Infinity:323:4:323:Infinity:324:4:324:Infinity:325:4:325:Infinity:326:4:326:28":80,"s:328:4:328:Infinity":150,"s:332:25:334:Infinity":151,"b:333:6:333:Infinity:334:6:334:Infinity":81,"b:333:6:333:38:333:38:333:Infinity":82,"s:337:4:341:Infinity":152,"b:337:4:337:Infinity:338:4:338:Infinity:339:4:339:Infinity:340:4:340:Infinity:341:4:341:Infinity":83,"b:343:2:345:Infinity:undefined:undefined:undefined:undefined":84,"s:343:2:345:Infinity":153,"b:343:6:343:24:343:24:343:41":85,"s:344:4:344:Infinity":154,"s:347:2:352:Infinity":155,"s:356:2:356:Infinity":156}}} +,"E:\\Job\\ComputerSelectorHelper\\src\\utils\\laptopModels.js": {"path":"E:\\Job\\ComputerSelectorHelper\\src\\utils\\laptopModels.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":2,"column":75}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":75}},"2":{"start":{"line":4,"column":21},"end":{"line":269,"column":1}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":24},"end":{"line":1,"column":25}},"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":75}},"line":2}},"branchMap":{},"s":{"0":2,"1":46,"2":2},"f":{"0":46},"b":{},"meta":{"lastBranch":0,"lastFunction":1,"lastStatement":3,"seen":{"s:1:24:2:75":0,"f:1:24:1:25":0,"s:2:2:2:75":1,"s:4:21:269:1":2}}} +,"E:\\Job\\ComputerSelectorHelper\\src\\utils\\matchLaptopClass.jsx": {"path":"E:\\Job\\ComputerSelectorHelper\\src\\utils\\matchLaptopClass.jsx","statementMap":{"0":{"start":{"line":3,"column":18},"end":{"line":5,"column":null}},"1":{"start":{"line":4,"column":2},"end":{"line":5,"column":null}},"2":{"start":{"line":7,"column":19},"end":{"line":8,"column":null}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":11,"column":25},"end":{"line":92,"column":null}},"5":{"start":{"line":12,"column":27},"end":{"line":41,"column":null}},"6":{"start":{"line":13,"column":21},"end":{"line":13,"column":null}},"7":{"start":{"line":14,"column":20},"end":{"line":14,"column":null}},"8":{"start":{"line":15,"column":23},"end":{"line":15,"column":null}},"9":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"10":{"start":{"line":17,"column":61},"end":{"line":17,"column":null}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"12":{"start":{"line":18,"column":81},"end":{"line":18,"column":null}},"13":{"start":{"line":19,"column":4},"end":{"line":22,"column":null}},"14":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"15":{"start":{"line":20,"column":57},"end":{"line":20,"column":null}},"16":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"17":{"start":{"line":21,"column":137},"end":{"line":21,"column":null}},"18":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"19":{"start":{"line":24,"column":58},"end":{"line":24,"column":null}},"20":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"21":{"start":{"line":25,"column":79},"end":{"line":25,"column":null}},"22":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"23":{"start":{"line":26,"column":78},"end":{"line":26,"column":null}},"24":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"25":{"start":{"line":27,"column":64},"end":{"line":27,"column":null}},"26":{"start":{"line":28,"column":4},"end":{"line":31,"column":null}},"27":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"28":{"start":{"line":34,"column":18},"end":{"line":34,"column":null}},"29":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"30":{"start":{"line":36,"column":48},"end":{"line":36,"column":null}},"31":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"32":{"start":{"line":37,"column":52},"end":{"line":37,"column":null}},"33":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"34":{"start":{"line":38,"column":50},"end":{"line":38,"column":null}},"35":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"36":{"start":{"line":43,"column":23},"end":{"line":84,"column":null}},"37":{"start":{"line":44,"column":16},"end":{"line":44,"column":null}},"38":{"start":{"line":46,"column":23},"end":{"line":46,"column":null}},"39":{"start":{"line":47,"column":21},"end":{"line":47,"column":null}},"40":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"41":{"start":{"line":49,"column":68},"end":{"line":49,"column":null}},"42":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"43":{"start":{"line":50,"column":54},"end":{"line":50,"column":null}},"44":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"45":{"start":{"line":51,"column":60},"end":{"line":51,"column":null}},"46":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"47":{"start":{"line":52,"column":58},"end":{"line":52,"column":null}},"48":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"49":{"start":{"line":53,"column":49},"end":{"line":53,"column":null}},"50":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"51":{"start":{"line":54,"column":66},"end":{"line":54,"column":null}},"52":{"start":{"line":56,"column":4},"end":{"line":58,"column":null}},"53":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"54":{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},"55":{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},"56":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"57":{"start":{"line":65,"column":4},"end":{"line":75,"column":null}},"58":{"start":{"line":66,"column":6},"end":{"line":74,"column":null}},"59":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"60":{"start":{"line":79,"column":4},"end":{"line":81,"column":null}},"61":{"start":{"line":80,"column":6},"end":{"line":80,"column":null}},"62":{"start":{"line":83,"column":4},"end":{"line":83,"column":null}},"63":{"start":{"line":86,"column":22},"end":{"line":88,"column":17}},"64":{"start":{"line":87,"column":20},"end":{"line":87,"column":47}},"65":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":18},"end":{"line":3,"column":19}},"loc":{"start":{"line":4,"column":2},"end":{"line":5,"column":null}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":19},"end":{"line":7,"column":20}},"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":25},"end":{"line":11,"column":26}},"loc":{"start":{"line":11,"column":26},"end":{"line":92,"column":null}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":47},"end":{"line":12,"column":null}},"loc":{"start":{"line":12,"column":47},"end":{"line":41,"column":null}},"line":12},"4":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":44},"end":{"line":43,"column":null}},"loc":{"start":{"line":43,"column":44},"end":{"line":84,"column":null}},"line":43},"5":{"name":"(anonymous_5)","decl":{"start":{"line":87,"column":10},"end":{"line":87,"column":11}},"loc":{"start":{"line":87,"column":20},"end":{"line":87,"column":47}},"line":87}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},{"start":{},"end":{}}],"line":17},"1":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":61}},"type":"binary-expr","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":35}},{"start":{"line":17,"column":35},"end":{"line":17,"column":61}}],"line":17},"2":{"loc":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},{"start":{},"end":{}}],"line":18},"3":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":81}},"type":"binary-expr","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":35}},{"start":{"line":18,"column":35},"end":{"line":18,"column":81}}],"line":18},"4":{"loc":{"start":{"line":19,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":19},"5":{"loc":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},{"start":{},"end":{}}],"line":20},"6":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":21},"7":{"loc":{"start":{"line":21,"column":10},"end":{"line":21,"column":137}},"type":"binary-expr","locations":[{"start":{"line":21,"column":10},"end":{"line":21,"column":53}},{"start":{"line":21,"column":53},"end":{"line":21,"column":96}},{"start":{"line":21,"column":96},"end":{"line":21,"column":137}}],"line":21},"8":{"loc":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},{"start":{},"end":{}}],"line":24},"9":{"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":58}},"type":"binary-expr","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":32}},{"start":{"line":24,"column":32},"end":{"line":24,"column":58}}],"line":24},"10":{"loc":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":25},"11":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":79}},"type":"binary-expr","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":38}},{"start":{"line":25,"column":38},"end":{"line":25,"column":79}}],"line":25},"12":{"loc":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":26},"13":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":78}},"type":"binary-expr","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":51}},{"start":{"line":26,"column":51},"end":{"line":26,"column":78}}],"line":26},"14":{"loc":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":27},"15":{"loc":{"start":{"line":27,"column":8},"end":{"line":27,"column":64}},"type":"binary-expr","locations":[{"start":{"line":27,"column":8},"end":{"line":27,"column":33}},{"start":{"line":27,"column":33},"end":{"line":27,"column":64}}],"line":27},"16":{"loc":{"start":{"line":28,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":4},"end":{"line":31,"column":null}},{"start":{},"end":{}}],"line":28},"17":{"loc":{"start":{"line":29,"column":6},"end":{"line":30,"column":null}},"type":"binary-expr","locations":[{"start":{"line":29,"column":7},"end":{"line":29,"column":41}},{"start":{"line":29,"column":41},"end":{"line":29,"column":75}},{"start":{"line":30,"column":6},"end":{"line":30,"column":36}},{"start":{"line":30,"column":36},"end":{"line":30,"column":null}}],"line":29},"18":{"loc":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":36},"19":{"loc":{"start":{"line":36,"column":8},"end":{"line":36,"column":48}},"type":"binary-expr","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":34}},{"start":{"line":36,"column":34},"end":{"line":36,"column":48}}],"line":36},"20":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":37},"21":{"loc":{"start":{"line":37,"column":8},"end":{"line":37,"column":52}},"type":"binary-expr","locations":[{"start":{"line":37,"column":8},"end":{"line":37,"column":37}},{"start":{"line":37,"column":37},"end":{"line":37,"column":52}}],"line":37},"22":{"loc":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":38},"23":{"loc":{"start":{"line":38,"column":8},"end":{"line":38,"column":50}},"type":"binary-expr","locations":[{"start":{"line":38,"column":8},"end":{"line":38,"column":35}},{"start":{"line":38,"column":35},"end":{"line":38,"column":50}}],"line":38},"24":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":49},"25":{"loc":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":50},"26":{"loc":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},{"start":{},"end":{}}],"line":51},"27":{"loc":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},{"start":{},"end":{}}],"line":52},"28":{"loc":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":53},"29":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":54},"30":{"loc":{"start":{"line":56,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":56,"column":4},"end":{"line":58,"column":null}},{"start":{},"end":{}}],"line":56},"31":{"loc":{"start":{"line":56,"column":8},"end":{"line":56,"column":76}},"type":"binary-expr","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":46}},{"start":{"line":56,"column":46},"end":{"line":56,"column":76}}],"line":56},"32":{"loc":{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":59},"33":{"loc":{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":60},"34":{"loc":{"start":{"line":60,"column":10},"end":{"line":60,"column":91}},"type":"binary-expr","locations":[{"start":{"line":60,"column":10},"end":{"line":60,"column":38}},{"start":{"line":60,"column":38},"end":{"line":60,"column":66}},{"start":{"line":60,"column":66},"end":{"line":60,"column":91}}],"line":60},"35":{"loc":{"start":{"line":65,"column":4},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":75,"column":null}},{"start":{},"end":{}}],"line":65},"36":{"loc":{"start":{"line":66,"column":6},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":74,"column":null}},{"start":{},"end":{}}],"line":66},"37":{"loc":{"start":{"line":67,"column":8},"end":{"line":71,"column":null}},"type":"binary-expr","locations":[{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},{"start":{"line":71,"column":8},"end":{"line":71,"column":null}}],"line":67},"38":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":79},"39":{"loc":{"start":{"line":79,"column":8},"end":{"line":79,"column":89}},"type":"binary-expr","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":43}},{"start":{"line":79,"column":43},"end":{"line":79,"column":89}}],"line":79},"40":{"loc":{"start":{"line":90,"column":9},"end":{"line":90,"column":null}},"type":"cond-expr","locations":[{"start":{"line":90,"column":30},"end":{"line":90,"column":44}},{"start":{"line":90,"column":44},"end":{"line":90,"column":null}}],"line":90}},"s":{"0":2,"1":1200,"2":2,"3":794,"4":2,"5":57,"6":1311,"7":1311,"8":1311,"9":1311,"10":49,"11":1262,"12":16,"13":1246,"14":184,"15":160,"16":24,"17":8,"18":1078,"19":0,"20":1078,"21":0,"22":1078,"23":208,"24":870,"25":56,"26":814,"27":20,"28":794,"29":794,"30":49,"31":745,"32":427,"33":318,"34":18,"35":300,"36":57,"37":300,"38":300,"39":300,"40":300,"41":0,"42":300,"43":139,"44":300,"45":0,"46":300,"47":100,"48":300,"49":0,"50":300,"51":0,"52":300,"53":4,"54":300,"55":7,"56":7,"57":300,"58":15,"59":4,"60":300,"61":0,"62":300,"63":57,"64":529,"65":57},"f":{"0":1200,"1":794,"2":57,"3":1311,"4":300,"5":529},"b":{"0":[49,1262],"1":[1311,161],"2":[16,1246],"3":[1262,112],"4":[184,1062],"5":[160,24],"6":[8,16],"7":[24,16,8],"8":[0,1078],"9":[1078,16],"10":[0,1078],"11":[1078,0],"12":[208,870],"13":[1078,292],"14":[56,814],"15":[870,116],"16":[20,794],"17":[814,779,35,25],"18":[49,745],"19":[794,59],"20":[427,318],"21":[745,653],"22":[18,300],"23":[318,82],"24":[0,300],"25":[139,161],"26":[0,300],"27":[100,200],"28":[0,300],"29":[0,300],"30":[4,296],"31":[300,8],"32":[7,293],"33":[7,0],"34":[7,0,0],"35":[15,285],"36":[4,11],"37":[15,14,11,11,11],"38":[0,300],"39":[300,8],"40":[40,17]},"meta":{"lastBranch":41,"lastFunction":6,"lastStatement":66,"seen":{"s:3:18:5:Infinity":0,"f:3:18:3:19":0,"s:4:2:5:Infinity":1,"s:7:19:8:Infinity":2,"f:7:19:7:20":1,"s:8:2:8:Infinity":3,"s:11:25:92:Infinity":4,"f:11:25:11:26":2,"s:12:27:41:Infinity":5,"f:12:47:12:Infinity":3,"s:13:21:13:Infinity":6,"s:14:20:14:Infinity":7,"s:15:23:15:Infinity":8,"b:17:4:17:Infinity:undefined:undefined:undefined:undefined":0,"s:17:4:17:Infinity":9,"b:17:8:17:35:17:35:17:61":1,"s:17:61:17:Infinity":10,"b:18:4:18:Infinity:undefined:undefined:undefined:undefined":2,"s:18:4:18:Infinity":11,"b:18:8:18:35:18:35:18:81":3,"s:18:81:18:Infinity":12,"b:19:4:22:Infinity:undefined:undefined:undefined:undefined":4,"s:19:4:22:Infinity":13,"b:20:6:20:Infinity:undefined:undefined:undefined:undefined":5,"s:20:6:20:Infinity":14,"s:20:57:20:Infinity":15,"b:21:6:21:Infinity:undefined:undefined:undefined:undefined":6,"s:21:6:21:Infinity":16,"b:21:10:21:53:21:53:21:96:21:96:21:137":7,"s:21:137:21:Infinity":17,"b:24:4:24:Infinity:undefined:undefined:undefined:undefined":8,"s:24:4:24:Infinity":18,"b:24:8:24:32:24:32:24:58":9,"s:24:58:24:Infinity":19,"b:25:4:25:Infinity:undefined:undefined:undefined:undefined":10,"s:25:4:25:Infinity":20,"b:25:8:25:38:25:38:25:79":11,"s:25:79:25:Infinity":21,"b:26:4:26:Infinity:undefined:undefined:undefined:undefined":12,"s:26:4:26:Infinity":22,"b:26:8:26:51:26:51:26:78":13,"s:26:78:26:Infinity":23,"b:27:4:27:Infinity:undefined:undefined:undefined:undefined":14,"s:27:4:27:Infinity":24,"b:27:8:27:33:27:33:27:64":15,"s:27:64:27:Infinity":25,"b:28:4:31:Infinity:undefined:undefined:undefined:undefined":16,"s:28:4:31:Infinity":26,"b:29:7:29:41:29:41:29:75:30:6:30:36:30:36:30:Infinity":17,"s:31:6:31:Infinity":27,"s:34:18:34:Infinity":28,"b:36:4:36:Infinity:undefined:undefined:undefined:undefined":18,"s:36:4:36:Infinity":29,"b:36:8:36:34:36:34:36:48":19,"s:36:48:36:Infinity":30,"b:37:4:37:Infinity:undefined:undefined:undefined:undefined":20,"s:37:4:37:Infinity":31,"b:37:8:37:37:37:37:37:52":21,"s:37:52:37:Infinity":32,"b:38:4:38:Infinity:undefined:undefined:undefined:undefined":22,"s:38:4:38:Infinity":33,"b:38:8:38:35:38:35:38:50":23,"s:38:50:38:Infinity":34,"s:40:4:40:Infinity":35,"s:43:23:84:Infinity":36,"f:43:44:43:Infinity":4,"s:44:16:44:Infinity":37,"s:46:23:46:Infinity":38,"s:47:21:47:Infinity":39,"b:49:4:49:Infinity:undefined:undefined:undefined:undefined":24,"s:49:4:49:Infinity":40,"s:49:68:49:Infinity":41,"b:50:4:50:Infinity:undefined:undefined:undefined:undefined":25,"s:50:4:50:Infinity":42,"s:50:54:50:Infinity":43,"b:51:4:51:Infinity:undefined:undefined:undefined:undefined":26,"s:51:4:51:Infinity":44,"s:51:60:51:Infinity":45,"b:52:4:52:Infinity:undefined:undefined:undefined:undefined":27,"s:52:4:52:Infinity":46,"s:52:58:52:Infinity":47,"b:53:4:53:Infinity:undefined:undefined:undefined:undefined":28,"s:53:4:53:Infinity":48,"s:53:49:53:Infinity":49,"b:54:4:54:Infinity:undefined:undefined:undefined:undefined":29,"s:54:4:54:Infinity":50,"s:54:66:54:Infinity":51,"b:56:4:58:Infinity:undefined:undefined:undefined:undefined":30,"s:56:4:58:Infinity":52,"b:56:8:56:46:56:46:56:76":31,"s:57:6:57:Infinity":53,"b:59:4:63:Infinity:undefined:undefined:undefined:undefined":32,"s:59:4:63:Infinity":54,"b:60:6:62:Infinity:undefined:undefined:undefined:undefined":33,"s:60:6:62:Infinity":55,"b:60:10:60:38:60:38:60:66:60:66:60:91":34,"s:61:8:61:Infinity":56,"b:65:4:75:Infinity:undefined:undefined:undefined:undefined":35,"s:65:4:75:Infinity":57,"b:66:6:74:Infinity:undefined:undefined:undefined:undefined":36,"s:66:6:74:Infinity":58,"b:67:8:67:Infinity:68:8:68:Infinity:69:8:69:Infinity:70:8:70:Infinity:71:8:71:Infinity":37,"s:73:8:73:Infinity":59,"b:79:4:81:Infinity:undefined:undefined:undefined:undefined":38,"s:79:4:81:Infinity":60,"b:79:8:79:43:79:43:79:89":39,"s:80:6:80:Infinity":61,"s:83:4:83:Infinity":62,"s:86:22:88:17":63,"f:87:10:87:11":5,"s:87:20:87:47":64,"s:90:2:90:Infinity":65,"b:90:30:90:44:90:44:90:Infinity":40}}} +} diff --git a/coverage/favicon.png b/coverage/favicon.png new file mode 100644 index 0000000..c1525b8 Binary files /dev/null and b/coverage/favicon.png differ diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 0000000..5219826 --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 92.03% + Statements + 208/226 +
+ + +
+ 88.07% + Branches + 251/285 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 94.6% + Lines + 193/204 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
convertToSpecs.jsx +
+
92.99%146/15788.26%173/196100%5/593.42%142/152
laptopModels.js +
+
100%3/3100%0/0100%1/1100%3/3
matchLaptopClass.jsx +
+
89.39%59/6687.64%78/89100%6/697.95%48/49
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/laptopModels.js.html b/coverage/laptopModels.js.html new file mode 100644 index 0000000..5d22185 --- /dev/null +++ b/coverage/laptopModels.js.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for laptopModels.js + + + + + + + + + +
+
+

All files laptopModels.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +2722x +46x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const buildGoogleLink = (name) =>
+  `https://www.google.com/search?q=${encodeURIComponent(name + ' laptop')}`
+ 
+const laptopModels = [
+  {
+    id: "hp-stream-14",
+    name: "HP Stream 14",
+    use: "Estudiantes básicos, movilidad",
+    specs: "Intel Celeron N4120, 4 GB RAM, 64 GB SSD, 14” HD",
+    gpu: "Intel integrada",
+    price: "$4,199 MXN",
+    portability: "Alta",
+    image:
+      "https://www.notebookcheck.net/fileadmin/Notebooks/HP/Stream_14-ax002ng/2.jpg",
+    link: buildGoogleLink("HP Stream 14"),
+  },
+  {
+    id: "acer-aspire-go",
+    name: "Acer Aspire Go AG15",
+    use: "Uso general, estudiantes",
+    specs: "Intel Core i3, 8 GB RAM, 256 GB SSD, 15.6” FHD",
+    gpu: "Intel integrada",
+    price: "$5,999 MXN",
+    portability: "Media",
+    image:
+      "https://laptoping.com/specs/wp-content/uploads/2024/06/Acer-Aspire-Go-15-Slim-AG15-31P-3947.jpg",
+    link: buildGoogleLink("acer-aspire-go"),
+  },
+  {
+    id: "hp-victus-rtx3050",
+    name: "HP Victus RTX 3050",
+    use: "Gaming medio, tareas pesadas",
+    specs: "Intel i5 12450H, 32 GB RAM, 512 GB SSD, RTX 3050",
+    gpu: "RTX 3050",
+    price: "$14,999 MXN",
+    portability: "Media",
+    image:
+      "https://m.media-amazon.com/images/I/71XwPLUaKsL._AC_SL1500_.jpg",
+    link: buildGoogleLink("hp-victus-rtx3050"),
+  },
+  {
+    id: "macbook-air-m1",
+    name: "Apple MacBook Air M1",
+    use: "Creativos, portabilidad, estudiantes",
+    specs: "Apple M1, 8 GB RAM, 256 GB SSD, 13.3” Retina",
+    gpu: "M1",
+    price: "$13,999 MXN",
+    portability: "Alta",
+    image:
+      "https://th.bing.com/th/id/OIP.Q4muQjrfyxVhOB5PMwAF6gHaE8?cb=iwp2&rs=1&pid=ImgDetMainhttps://thangpro.vn/uploads/source/laptop/macbook/mac-air-m1/img-7707.jpg",
+    link: buildGoogleLink("macbook-air-m1"),
+  },
+  {
+    id: "asus-tuf-a15",
+    name: "ASUS TUF Gaming A15",
+    use: "Gaming alto, edición multimedia",
+    specs: "Ryzen 7, 8 GB RAM, 512 GB SSD, RTX 3050",
+    gpu: "RTX 3050",
+    price: "$16,339 MXN",
+    portability: "Media",
+    image:
+      "https://laptopmedia.com/wp-content/uploads/2021/01/2-40.jpg",
+    link: buildGoogleLink("asus-tuf-a15"),
+  },
+  {
+    id: "lenovo-chromebook-3",
+    name: "Lenovo Chromebook 3",
+    use: "Tareas básicas, navegación, Google Docs",
+    specs: "Intel Celeron N4020, 4 GB RAM, 64 GB eMMC, 14” HD",
+    gpu: "Intel integrada",
+    price: "$3,499 MXN",
+    portability: "Alta",
+    image:
+      "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6447/6447138_sd.jpg",
+    link: buildGoogleLink("lenovo-chromebook-3"),
+  },
+  {
+    id: "macbook-air-m2",
+    name: "Apple MacBook Air M2",
+    use: "Profesionales móviles, diseño, universidad",
+    specs: "Apple M2, 8 GB RAM, 256 GB SSD, 13.6” Retina",
+    gpu: "M2",
+    price: "$23,999 MXN",
+    portability: "Alta",
+    image:
+      "https://cdn.shopify.com/s/files/1/1706/9177/products/macbook-air-m2-midnight-custom-mac-bd_b82010cb-9405-4654-a165-9576a249e4e0.jpg",
+    link: buildGoogleLink("macbook-air-m2"),
+  },
+ 
+  {
+    id: "lenovo-gamer-rtx4070",
+    name: "Lenovo Legion RTX 4070",
+    use: "Gaming extremo, arquitectura, animación",
+    specs: "Intel i9, 32 GB RAM, 1TB SSD, RTX 4070",
+    gpu: "RTX 4070",
+    price: "$38,999 MXN",
+    portability: "Baja",
+    image:
+      "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6534/6534466ld.jpg",
+    link: buildGoogleLink("lenovo-gamer-rtx4070"),
+  },
+  {
+    id: "msi-gamer-rtx2060",
+    name: "MSI GF63 RTX 2060",
+    use: "Gaming clásico, edición semiprofesional",
+    specs: "Intel i5 10th Gen, 16 GB RAM, 512 GB SSD, RTX 2060",
+    gpu: "RTX 2060",
+    price: "$17,499 MXN",
+    portability: "Media",
+    image:
+      "https://i0.wp.com/phukienmaytinh.com.vn/wp-content/uploads/2020/02/MSI-GF63-3.jpg",
+    link: buildGoogleLink("msi-gamer-rtx2060"),
+  },
+  {
+    id: "huawei-matebook-d16-i5",
+    name: "Huawei MateBook D16",
+    use: "Trabajo exigente, multimedia, estudiantes",
+    specs: "Intel Core i5 13420H, 16 GB RAM, 1 TB SSD, 16\" FHD",
+    gpu: "Intel Iris Xe",
+    price: "$14,399 MXN",
+    portability: "Media",
+    image: "https://www.presse-citron.net/app/uploads/2021/05/DSC01401_DxO_PC.jpg",
+    link: buildGoogleLink("Huawei MateBook D16"),
+  },
+  {
+    id: "hp-pavilion-i7-1355u",
+    name: "HP Pavilion i7-1355U",
+    use: "Profesionales, multitarea avanzada, productividad",
+    specs: "Intel Core i7-1355U, 32 GB RAM, 1 TB SSD, 15.6\" FHD",
+    gpu: "Intel Iris Xe",
+    price: "$15,722 MXN",
+    portability: "Media",
+    image: "https://m.media-amazon.com/images/I/613hm2YD6mL._AC_.jpg",
+    link: buildGoogleLink("HP Pavilion i7-1355U"),
+  },
+  {
+    id: "msi-sword-16-i7",
+    name: "MSI Sword 16 HX",
+    use: "Gaming, edición profesional, exigencia gráfica",
+    specs: "Intel Core i7, 16 GB RAM, 1 TB SSD, 16\" FHD",
+    gpu: "RTX 4060",
+    price: "$33,999 MXN",
+    portability: "Media",
+    image: "https://storage-asset.msi.com/global/picture/image/feature/nb/2023_RPLS/sword16-hx-b14v/msi-sword16-display-new.png",
+    link: buildGoogleLink("MSI Sword 16 HX"),
+  },
+  {
+    id: "generic-intel-14",
+    name: "Laptop 14 Intel",
+    use: "Tareas básicas, ofimática, estudiantes",
+    specs: "Intel genérica, 8 GB RAM, 256 GB SSD, 14\" FHD",
+    gpu: "Intel integrada",
+    price: "$4,800 MXN",
+    portability: "Alta",
+    image: "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6425/6425056_rd.jpg",
+    link: buildGoogleLink("Laptop 14 Intel 256gb"),
+  },
+    {
+    id: "macbook-air-m4-512",
+    name: "MacBook Air M4 (512 GB)",
+    use: "Profesionales móviles, diseño, rendimiento alto",
+    specs: "Apple M4, 8 GB RAM, 512 GB SSD, 13” Retina",
+    gpu: "Apple Silicon",
+    price: "$30,950 MXN",
+    portability: "Alta",
+    image: "https://ipadizate.com/hero/2023/01/MacBook-Air-M2-Chip-Purple-Feature.jpg", 
+    link: buildGoogleLink("MacBook Air M4 512 GB")
+  },
+  {
+    id: "acer-nitro-5-rtx4060",
+    name: "Acer Nitro 5 RTX 4060",
+    use: "Gaming exigente, edición profesional",
+    specs: "Intel Core i7-13620H, 16 GB RAM, 512 GB SSD, RTX 4060",
+    gpu: "RTX 4060",
+    price: "$20,642 MXN",
+    portability: "Media",
+    image: "https://www.notebookcheck.com/fileadmin/_processed_/9/2/csm_Acer_Nitro_5_RTX_4060_guenstigstes_gaming_notebook_deal_db9eae21d8.jpg",
+    link: buildGoogleLink("Acer Nitro 5 RTX 4060")
+  },
+  {
+    id: "hp-15-fd0999nr",
+    name: "HP 15-fd0999nr",
+    use: "Ofimática avanzada, estudiantes, productividad",
+    specs: "Intel Core i5-1235U, 16 GB RAM, 512 GB SSD, 15.6” FHD",
+    gpu: "Intel Iris Xe",
+    price: "$9,797 MXN",
+    portability: "Media",
+    image: "https://lidernotebooks.com.ar/wp-content/uploads/2024/10/HP-15-fd0999NR-Core-i5_0004_Capa-7.jpg",
+    link: buildGoogleLink("HP 15-fd0999nr")
+  },
+  {
+    id: "msi-gf63-gtx1650",
+    name: "MSI GF63 GTX 1650",
+    use: "Gaming básico, diseño ligero",
+    specs: "Intel Core i5-11400H, 8 GB RAM, 256 GB SSD, GTX 1650",
+    gpu: "GTX 1650",
+    price: "$11,999 MXN",
+    portability: "Media",
+    image: "https://laptop360.net/wp-content/uploads/2022/09/MSI-Gaming-GF63-Thin-11UC-3-1536x1152.jpg",
+    link: buildGoogleLink("MSI GF63 GTX 1650")
+  },
+  {
+    id: "lenovo-yoga-slim-7-ultra5",
+    name: "Lenovo Yoga Slim 7",
+    use: "Profesionales, estudiantes de ingeniería",
+    specs: "Intel Ultra 5 125H, 16 GB RAM, 1 TB SSD, 14” FHD",
+    gpu: "Intel integrada",
+    price: "$18,999 MXN",
+    portability: "Alta",
+    image: "https://cdn.mos.cms.futurecdn.net/4C7JXvghGrpY52MtBiN2cB.jpg",
+    link: buildGoogleLink("Lenovo Yoga Slim 7")
+  },
+  {
+  id: "machcreator-15n-i7",
+  name: "Laptop Machcreator 15N",
+  use: "Multitarea, trabajo profesional, estudiantes avanzados",
+  specs: "Intel Core i7 13620H, 16 GB RAM, 512 GB SSD, 15.6” FHD",
+  gpu: "Intel UHD Graphics",
+  price: "$14,553 MXN",
+  portability: "Media",
+  image: "https://global.machenike.com/cdn/shop/files/11_818b6222-59ce-4193-a68b-bbc8e043b8ef.jpg",
+  link: buildGoogleLink("Laptop Machcreator 15N i7"),
+},
+{
+  id: "machenike-l16pro-rtx4060",
+  name: "Machenike L16 Pro",
+  use: "Gaming exigente, edición profesional, multitarea avanzada",
+  specs: "Ryzen 7 7735H, 16 GB RAM DDR5, 1 TB SSD, 16” 2.5K 165Hz",
+  gpu: "Nvidia GeForce RTX 4060",
+  price: "$34,954 MXN",
+  portability: "Baja",
+  image: "https://http2.mlstatic.com/D_NQ_NP_875287-MLU73599603547_122023-O.webp", 
+  link: buildGoogleLink("Machenike L16 Pro RTX 4060"),
+},
+{
+  id: "samsung-galaxy-book4-360",
+  name: "Samsung Galaxy Book4 360",
+  use: "Multimedia, productividad, uso general, estudiantes",
+  specs: "Intel Core 7 Series 1, 16 GB RAM LPDDR5, 512 GB SSD, 15.6” FHD táctil",
+  gpu: "Intel Graphics integrada",
+  price: "$22,999 MXN",
+  portability: "Alta",
+  image: "https://media-ik.croma.com/prod/https://media.croma.com/image/upload/v1708516453/Croma%20Assets/Computers%20Peripherals/Laptop/Images/305055_4_bsd9ja.png",
+  link: buildGoogleLink("Samsung Galaxy Book4 360"),
+},
+{
+  id: "topgro-n5-i3-mx230",
+  name: "Topgro N5",
+  use: "Ofimática, uso general, multimedia básica",
+  specs: "Intel Core i3-1005G1, 16 GB RAM DDR4, 512 GB SSD, NVIDIA GeForce MX230, 15.6” FHD",
+  gpu: "NVIDIA GeForce MX230 (2 GB GDDR5)",
+  price: "$6,935 MXN",
+  portability: "Media",
+  image: "https://m.media-amazon.com/images/I/71gXrO3lsqL._AC_.jpg", 
+  link: buildGoogleLink("Topgro N5 i3 MX230"),
+},
+{
+  id: "vsap-n4020-14",
+  name: "VSAP Intel Celeron N4020",
+  use: "Ofimática, navegación, estudiantes",
+  specs: "Intel Celeron N4020, 8 GB RAM DDR4, 512 GB SSD, 14.1\" FHD",
+  gpu: "Intel UHD Graphics 600",
+  price: "$3,695 MXN",
+  portability: "Alta",
+  image: "https://static.wixstatic.com/media/c8ef56_df2decbc5ac442c28c399e2c9a2ee5e2~mv2.webp", 
+  link: buildGoogleLink("VSAP Intel Celeron N4020"),
+},
+ 
+];
+ 
+export default laptopModels;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/matchLaptopClass.jsx.html b/coverage/matchLaptopClass.jsx.html new file mode 100644 index 0000000..d345696 --- /dev/null +++ b/coverage/matchLaptopClass.jsx.html @@ -0,0 +1,367 @@ + + + + + + Code coverage report for matchLaptopClass.jsx + + + + + + + + + +
+
+

All files matchLaptopClass.jsx

+
+ +
+ 89.39% + Statements + 59/66 +
+ + +
+ 87.64% + Branches + 78/89 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 97.95% + Lines + 48/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95  +  +2x +1200x +  +  +2x +794x +  +  +2x +57x +1311x +1311x +1311x +  +1311x +1262x +1246x +184x +24x +  +  +1078x +1078x +1078x +870x +814x +  +  +20x +  +  +794x +  +794x +745x +318x +  +300x +  +  +57x +300x +  +300x +300x +  +300x +300x +300x +300x +300x +300x +  +300x +4x +  +300x +7x +7x +  +  +  +300x +15x +  +  +  +  +  +  +4x +  +  +  +  +  +300x +  +  +  +300x +  +  +57x +529x +  +  +57x +  +  +  +  + 
import laptopModels from './laptopModels'
+ 
+const normalize = (text) =>
+  text.toLowerCase()
+    .replace(/(intel|amd|apple|core|ryzen|graphics|nvidia|geforce|radeon|gpu)|\s+/gi, '')
+ 
+const parsePrice = (priceString) =>
+  parseInt(priceString.replace(/[^\d]/g, ''), 10)
+ 
+ 
+const matchLaptopClass = (specs) => {
+  const compatibleModels = laptopModels.filter(model => {
+    const modelGPU = model.gpu.toLowerCase()
+    const modelOS = model.use.toLowerCase()
+    const modelSpecs = model.specs.toLowerCase()
+ 
+    if (specs.os === 'ChromeOS' && modelGPU.includes('rtx')) return false
+    if (specs.os === 'ChromeOS' && specs.processor.toLowerCase().includes('i7')) return false
+    if (specs.os === 'macOS') {
+      if (!model.name.toLowerCase().includes('macbook')) return false
+      if (!model.gpu.toLowerCase().includes('m1') && !model.gpu.toLowerCase().includes('m2') && !model.gpu.toLowerCase().includes('m3')) return false
+    }
+ 
+    Iif (specs.os === 'macOS' && modelGPU.includes('rtx')) return false
+    Iif (modelOS.includes('chrome') && specs.gpu.toLowerCase().includes('rtx')) return false
+    if (specs.gpu.toLowerCase().includes('rtx') && !modelGPU.includes('rtx')) return false
+    if (specs.ram === '16 GB' && !modelSpecs.includes('16 gb')) return false
+    if (
+      (specs.processor.includes('i7') || specs.processor.includes('ryzen 7')) &&
+      !modelSpecs.includes('i7') && !modelSpecs.includes('ryzen 7')
+    ) return false
+ 
+    // ✅ Presupuesto
+    const price = parsePrice(model.price)
+ 
+    if (specs.budget === 'low' && price > 6000) return false
+    if (specs.budget === 'medium' && price > 13000) return false
+    if (specs.budget === 'high' && price < 13000) return false
+ 
+    return true
+  })
+ 
+  const scoredModels = compatibleModels.map(model => {
+    let score = 0
+ 
+    const modelSpecs = model.specs.toLowerCase()
+    const modelGPU = model.gpu.toLowerCase()
+ 
+    Iif (normalize(modelSpecs).includes(normalize(specs.processor))) score += 2
+    if (modelSpecs.includes(specs.ram.toLowerCase())) score += 2
+    Iif (normalize(modelGPU).includes(normalize(specs.gpu))) score += 2
+    if (modelSpecs.includes(specs.storage.toLowerCase())) score += 1
+    Iif (model.portability === specs.portability) score += 1
+    Iif (model.use.toLowerCase().includes(specs.os.toLowerCase())) score += 1
+ 
+    if (specs.flags?.prioritizePortability && model.portability === 'Alta') {
+      score += 1.5
+    }
+    if (specs.flags?.prioritizeGaming) {
+      Eif (modelGPU.includes('rtx') || modelGPU.includes('gtx') || modelGPU.includes('mx')) {
+        score += 1.5
+      }
+    }
+ 
+    if (specs.flags?.prioritizeScreenQuality) {
+      if (
+        modelSpecs.includes('2.5k') ||
+        modelSpecs.includes('retina') ||
+        modelSpecs.includes('qhd') ||
+        modelSpecs.includes('2560') ||
+        modelSpecs.includes('amoled')
+      ) {
+        score += 1.5
+      }
+    }
+ 
+ 
+ 
+    Iif (specs.flags?.prioritizeSecurity && model.specs.toLowerCase().includes('huella')) {
+      score += 1.5
+    }
+ 
+    return { ...model, matchScore: score }
+  })
+ 
+  const bestMatches = scoredModels
+    .sort((a, b) => b.matchScore - a.matchScore)
+    .slice(0, 3) // 👈 Cambia 3 por cuántas quieres mostrar
+ 
+  return bestMatches.length ? bestMatches : [{ name: "Clase genérica", specs: "" }]
+ 
+}
+ 
+export default matchLaptopClass
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000..6ed6831 Binary files /dev/null and b/coverage/sort-arrow-sprite.png differ diff --git a/coverage/sorter.js b/coverage/sorter.js new file mode 100644 index 0000000..4ed70ae --- /dev/null +++ b/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/docs/FEATURE_COMPARE.md b/docs/FEATURE_COMPARE.md new file mode 100644 index 0000000..2285a2a --- /dev/null +++ b/docs/FEATURE_COMPARE.md @@ -0,0 +1,158 @@ +# Feature: Módulo de Comparación de Laptops + +**Fecha:** 2026-05-10 +**Ruta:** `/compare` + +--- + +## Descripción + +Nuevo módulo que permite seleccionar hasta **3 laptops** del catálogo y compararlas lado a lado en una tabla de especificaciones, con resaltado automático del mejor valor en cada fila. + +--- + +## Flujo de usuario + +``` +Landing / Resultados + └── Click "Comparar" en la nav + └── /compare + ├── Buscar / filtrar modelos + ├── Click en cards para seleccionar (max 3) + └── Tabla comparativa aparece automáticamente + └── Botón "Compartir comparación" +``` + +--- + +## Características implementadas + +### Selector de modelos +- Grid de tarjetas con imagen, nombre y precio +- Filtro por sistema operativo (Windows / macOS / ChromeOS) +- Búsqueda por nombre, specs o GPU en tiempo real +- Ordenamiento por: precio, RAM, GPU tier o nombre +- Hasta 3 modelos seleccionables (cards extra quedan deshabilitadas) +- Feedback visual: borde azul + fondo azul claro al seleccionar + +### Tabla comparativa +- Se muestra automáticamente al seleccionar 2 o más modelos +- Scroll horizontal en mobile +- Fila "Quitar" con botón `×` por modelo +- Filas comparadas: + | Fila | Lógica de highlight | + |------|-------------------| + | 💰 Precio | Verde = menor precio | + | 🧠 RAM | Verde = más GB | + | 💾 Almacenamiento | Verde = más GB/TB | + | 🎮 GPU | Verde = mayor tier | + | ⚙️ Procesador | Sin highlight (textual) | + | 🖥️ Pantalla | Sin highlight (textual + tipo) | + | 💻 Sistema | Sin highlight | + | 🎒 Portabilidad | Sin highlight | + | ✅ Ideal para | Sin highlight | + | 🔗 Ver | Link a búsqueda en Google | + +### Compartir comparación +- URL: `/compare?models=id1,id2,id3` +- Botón "Compartir comparación" copia la URL al clipboard +- Al abrir el link, los modelos se pre-seleccionan automáticamente +- La selección actualiza el URL en tiempo real via `history.replaceState` + +### Navegación +- Nuevo ítem "Comparar" en la barra de nav global (`AppNav`) +- Botón "Volver" retorna a la página anterior (`navigate(-1)`) + +--- + +## Archivos creados + +| Archivo | Descripción | +|---------|-------------| +| `src/pages/Compare/Compare.jsx` | Componente principal de la página | +| `src/pages/Compare/Compare.css` | Estilos: grid, tabla, filtros, badges | +| `src/utils/parseSpecs.js` | Parser de spec strings → campos numéricos | + +## Archivos modificados + +| Archivo | Cambio | +|---------|--------| +| `src/routes/AppRoutes.jsx` | Agregada ruta `/compare` | +| `src/App.jsx` | Agregada `