{"version":3,"file":"fieldHints-DoevG6Tp.cjs","sources":["../src/dashboard/utils/fieldHints.ts"],"sourcesContent":["/**\n * Reconocimiento del tipo de un campo por su NOMBRE.\n *\n * <b>Por qué es un módulo y no una lista por archivo.</b> `tableColumns` y `suggestChartType`\n * implementaban la misma idea —adivinar la naturaleza de un campo por cómo se llama— con su\n * propia lista, su propio `normalize` y el mismo defecto: comparaban por <b>substring</b>. Eso\n * hacía que `dias_sin_entrada` casara con `dia` y se tipara como FECHA (la celda pintaba\n * «1 ene 1970» para un conteo de días), que `total_registros` casara con `total` y saliera como\n * moneda, y que `rango` o `tamano` casaran con `ano` y pasaran por temporales.\n *\n * <b>Aquí se compara por PALABRA.</b> El nombre se parte por los separadores habituales\n * (`_`, `-`, camelCase) y la pista tiene que ser una de esas palabras completas. `dias_sin_entrada`\n * ya no es `dia`, y `fecha_emision` sigue siendo `fecha`.\n */\n\n/** Quita acentos y baja a minúsculas, para que `año` y `ano` sean lo mismo. */\nexport function normalizeFieldName(value: string): string {\n  return value.toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '');\n}\n\n/**\n * Las palabras que componen un nombre de campo.\n *\n * `STOCK_ACTUAL` → `['stock','actual']` · `fechaEmision` → `['fecha','emision']` ·\n * `dias_sin_entrada` → `['dias','sin','entrada']`.\n */\nexport function fieldWords(value: string): string[] {\n  return normalizeFieldName(value.replace(/([a-z0-9])([A-Z])/g, '$1 $2'))\n    .split(/[^a-z0-9]+/)\n    .filter(Boolean);\n}\n\n/** Si alguna de las pistas aparece como PALABRA completa del nombre del campo. */\nexport function matchesHint(fieldName: string, hints: readonly string[]): boolean {\n  const words = fieldWords(fieldName);\n  return hints.some(hint => words.includes(hint));\n}\n\n/**\n * Si un nombre de campo designa un IDENTIFICADOR y no un dato que se pueda graficar.\n *\n * <b>No vale `name.includes('id')`.</b> Ese predicado —que es el que había— descarta\n * `cantidad`, `unidad`, `validado` y `liquidez`, porque las cuatro contienen la secuencia\n * «id». En un ERP en español eso significa saltarse justamente la columna que se quería medir:\n * un sparkline sobre una serie de `cantidad` se quedaba sin datos, en silencio.\n *\n * Se reconoce `id` como palabra propia (`id`, `widget_id`, `ID`, `idCliente`) y los `uuid`/`guid`.\n */\nexport function isIdentifierField(fieldName: string): boolean {\n  const words = fieldWords(fieldName);\n  return words.some(w => w === 'id' || w === 'ids' || w === 'uuid' || w === 'guid');\n}\n"],"names":["normalizeFieldName","value","fieldWords","matchesHint","fieldName","hints","words","hint","isIdentifierField","w"],"mappings":"aAgBO,SAASA,EAAmBC,EAAuB,CACxD,OAAOA,EAAM,cAAc,UAAU,KAAK,EAAE,QAAQ,SAAU,EAAE,CAClE,CAQO,SAASC,EAAWD,EAAyB,CAClD,OAAOD,EAAmBC,EAAM,QAAQ,qBAAsB,OAAO,CAAC,EACnE,MAAM,YAAY,EAClB,OAAO,OAAO,CACnB,CAGO,SAASE,EAAYC,EAAmBC,EAAmC,CAChF,MAAMC,EAAQJ,EAAWE,CAAS,EAClC,OAAOC,EAAM,KAAKE,GAAQD,EAAM,SAASC,CAAI,CAAC,CAChD,CAYO,SAASC,EAAkBJ,EAA4B,CAE5D,OADcF,EAAWE,CAAS,EACrB,KAAKK,GAAKA,IAAM,MAAQA,IAAM,OAASA,IAAM,QAAUA,IAAM,MAAM,CAClF"}