{"_id":"@currentfear/react-web-politica-enmascaramiento-amovil","_rev":"6-75a164615ac3b17d1155b8d1649c8537","name":"@currentfear/react-web-politica-enmascaramiento-amovil","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.0.0","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.0.0","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"dist":{"shasum":"dbdf2def5aec7364bd261c5635dcd81cb4013150","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.0.0.tgz","fileCount":24,"integrity":"sha512-M6NV+ikEwYyJNKQlr8dwtuQpTa5n4Y2qiNFuqTmK4n8BPYngQUeZVdeWAJmnXg/lTljUnB64zHchzSztvsj7MQ==","signatures":[{"sig":"MEQCICk8RJukpFpDYFOLcMchCVgbVCDKbRpF5dbhfXFH++rLAiBQUVwI/zm/ckmx1Rn0cVgFaWenCZ05KYSipJHHHK5+Jw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85819},"main":"dist/main.js","type":"module","types":"dist/main.d.ts","gitHead":"c051ccce501135d4207d4ebe7dc5f69a8abe22a8","scripts":{"dev":"vite","lint":"eslint .","build":"tsc --p ./tsconfig-build.json && vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"repository":{"url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git","type":"git"},"_npmVersion":"10.5.1","description":"Libreria de React para visualizar y renderizar diferentes tipos de enmascaramiento de datos siguiendo politicas de privacidad.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.0.0","dependencies":{"unique-names-generator":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"glob":"^13.0.0","vite":"^7.2.4","react":"^19.2.0","eslint":"^9.39.1","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.5","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.46.4","@vitejs/plugin-react":"^5.1.1","eslint-plugin-react-hooks":"^7.0.1","vite-plugin-lib-inject-css":"^2.2.2","eslint-plugin-react-refresh":"^0.4.24"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.0.0_1766974341736_0.7445162836885817","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.0.1","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.0.1","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"dist":{"shasum":"3e88d037896912919608c4ee11798bdaaa3c0ed1","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.0.1.tgz","fileCount":24,"integrity":"sha512-hlDLZSivlsDOkVgMqM17Avrd9UU3Qg+keEIPxQZyN7ChgFqPsK6DeRVdAnwPbhLQdSZ6zKDlwsTy5EhJiqYhZg==","signatures":[{"sig":"MEYCIQDrA4QjDM1nE9Ib6luciHntQOoyNtBgNJr57/szqZ+KMwIhAPieyb7MyNhJoApjNRU0M9+Sc+OAE3jfcg+l4Whsukss","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86999},"main":"dist/main.js","type":"module","types":"dist/main.d.ts","gitHead":"e3e8e618da8ee181ffbcdbfb0ff3134bf247d441","scripts":{"dev":"vite","lint":"eslint .","build":"tsc --p ./tsconfig-build.json && vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"repository":{"url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git","type":"git"},"_npmVersion":"10.5.1","description":"Libreria de React para visualizar y renderizar diferentes tipos de enmascaramiento de datos siguiendo politicas de privacidad.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.0.0","dependencies":{"unique-names-generator":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"glob":"^13.0.0","vite":"^7.2.4","react":"^19.2.0","eslint":"^9.39.1","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.5","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.46.4","@vitejs/plugin-react":"^5.1.1","eslint-plugin-react-hooks":"^7.0.1","vite-plugin-lib-inject-css":"^2.2.2","eslint-plugin-react-refresh":"^0.4.24"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.0.1_1766974948392_0.7178076947538858","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.0.2","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.0.2","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"dist":{"shasum":"6e30284c3c37cba5d33b580098a489abc0eb011f","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.0.2.tgz","fileCount":5,"integrity":"sha512-Q6FhYXAdz4tShvG1nyLK/FCpDlIOoDc72lFt7LzjXaX/wsl25TGMBjHX6gWbfBmDAAhnPGvuLZ9l8CfyuluY5A==","signatures":[{"sig":"MEUCIQC4sOP3tGI4KyDm5/V50O9YVuUxfQQEHPDRLCD83lO31wIgQEl0tuc4UtxS7Bsa1htxtjeEV+VfREhq8xmPuMjVpAY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81625},"main":"dist/main.js","type":"module","types":"dist/main.d.ts","gitHead":"e3e8e618da8ee181ffbcdbfb0ff3134bf247d441","scripts":{"dev":"vite","lint":"eslint .","build":"tsc --p ./tsconfig-build.json && vite build && vite build --config vite.config.cdn.ts","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"repository":{"url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git","type":"git"},"_npmVersion":"10.5.1","description":"Libreria de React para visualizar y renderizar diferentes tipos de enmascaramiento de datos siguiendo politicas de privacidad.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.0.0","dependencies":{"unique-names-generator":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"glob":"^13.0.0","vite":"^7.2.4","react":"^19.2.0","eslint":"^9.39.1","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.5","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.46.4","@vitejs/plugin-react":"^5.1.1","eslint-plugin-react-hooks":"^7.0.1","vite-plugin-lib-inject-css":"^2.2.2","eslint-plugin-react-refresh":"^0.4.24"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.0.2_1766975352763_0.17006234750625993","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.1.0","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.1.0","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"dist":{"shasum":"82fcb160e77807312ce4c8a1796ea70e8a783252","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.1.0.tgz","fileCount":5,"integrity":"sha512-VS2dLBFcKnTwLANbqY/E/pScf8c+/TF6JKct/GwKczpZGCiCPPuqFptw38q5lfoPUNCPnLngU/t2T5/92+1PXg==","signatures":[{"sig":"MEUCICiT3ue/rjpH2u/S9XtjUSL6hsW4weryNIXFSpeJSrLVAiEA/Zuh0va/gGpkRHfEXnMAJt4HQKEy5NI0pECuUsJuS7U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81489},"main":"dist/main.js","type":"module","types":"dist/main.d.ts","gitHead":"ab55a354003802bcf5a7043058d79a93a315aff6","scripts":{"dev":"vite","lint":"eslint .","build":"tsc --p ./tsconfig-build.json && vite build && vite build --config vite.config.cdn.ts","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"repository":{"url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git","type":"git"},"_npmVersion":"10.9.0","description":"Componente React con soporte TypeScript para aplicar y visualizar técnicas de enmascaramiento de datos. Compatible con React 18 y 19.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","dependencies":{"unique-names-generator":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"glob":"^13.0.0","vite":"^7.2.4","react":"^19.2.0","eslint":"^9.39.1","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.5","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.46.4","@vitejs/plugin-react":"^5.1.1","eslint-plugin-react-hooks":"^7.0.1","vite-plugin-lib-inject-css":"^2.2.2","eslint-plugin-react-refresh":"^0.4.24"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.1.0_1772499620942_0.32948626979772566","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.2.0","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.2.0","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"dist":{"shasum":"8567a7e1994441acbd35bfe8fc97c78cd6c623a5","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.2.0.tgz","fileCount":5,"integrity":"sha512-xynGK4AwV0wvj6oRAWnDNixZClzs74hZ9COqobsW2J7IENseYjsFLD5njmj0QAx2KOe5PQjK5BW54FLxsCE3jg==","signatures":[{"sig":"MEUCIQDKn8vzs7NTCRh+aTsAySDHcRuZf7zB6puA3aNe3r4lxAIgTaPrP7phvdwxq9OfSf3eZ4DPFyJH13E5rzMA75AhY18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85537},"main":"dist/main.js","type":"module","types":"dist/main.d.ts","gitHead":"c03772042c195f42c4c9f7ac2e308c491d0adc37","scripts":{"dev":"vite","lint":"eslint .","build":"tsc --p ./tsconfig-build.json && vite build && vite build --config vite.config.cdn.ts","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"repository":{"url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git","type":"git"},"_npmVersion":"10.9.0","description":"Componente React con soporte TypeScript para aplicar y visualizar técnicas de enmascaramiento de datos. Compatible con React 18 y 19.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","dependencies":{"unique-names-generator":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"glob":"^13.0.0","vite":"^7.2.4","react":"^19.2.0","eslint":"^9.39.1","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.5","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.46.4","@vitejs/plugin-react":"^5.1.1","eslint-plugin-react-hooks":"^7.0.1","vite-plugin-lib-inject-css":"^2.2.2","eslint-plugin-react-refresh":"^0.4.24"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.2.0_1773177939195_0.16208222086746327","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@currentfear/react-web-politica-enmascaramiento-amovil","version":"1.3.0","type":"module","main":"dist/main.js","types":"dist/lib/main.d.ts","sideEffects":["**/*.css"],"scripts":{"dev":"vite","build":"tsc --p ./tsconfig-build.json && vite build && vite build --config vite.config.cdn.ts","lint":"eslint .","preview":"vite preview","prepublishOnly":"npm run build"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"devDependencies":{"@eslint/js":"^9.39.1","@types/node":"^24.10.1","@types/react":"^19.2.5","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1","eslint":"^9.39.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.24","glob":"^13.0.0","globals":"^16.5.0","react":"^19.2.0","react-dom":"^19.2.0","typescript":"~5.9.3","typescript-eslint":"^8.46.4","vite":"^7.2.4","vite-plugin-dts":"^4.5.4","vite-plugin-lib-inject-css":"^2.2.2"},"dependencies":{"unique-names-generator":"^4.7.1"},"repository":{"type":"git","url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git"},"keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"_id":"@currentfear/react-web-politica-enmascaramiento-amovil@1.3.0","gitHead":"0c6e86009a5e4a682de9898cc8a92730f00bbaf1","description":"Componente React con soporte TypeScript para aplicar y visualizar técnicas de enmascaramiento de datos. Compatible con React 18 y 19.","bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","_nodeVersion":"24.0.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-9B+mSDbqvBiM4xXanQmsC1M2Wp/6dau4aHN8pnQmojNgyA5fAOvV09wyxA5+qrvCONbCX0Om8F7WKPL6aPd3AA==","shasum":"c96169c11e86f95f1338cc457c95c712df3c4890","tarball":"https://registry.npmjs.org/@currentfear/react-web-politica-enmascaramiento-amovil/-/react-web-politica-enmascaramiento-amovil-1.3.0.tgz","fileCount":26,"unpackedSize":167420,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICYe5zTwBGRMvwjlMyXkTjR8ZBeumq8a3Tbpl7myeDV6AiA7CCJuDeBpmd/5fga+rco/MDaUbylobtH/Aiy4szoLUA=="}]},"_npmUser":{"name":"currentfear","email":"david.gomez@amovil.co"},"directories":{},"maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-web-politica-enmascaramiento-amovil_1.3.0_1776201021076_0.8360156900517564"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-29T02:12:21.658Z","modified":"2026-04-14T21:10:21.344Z","1.0.0":"2025-12-29T02:12:21.929Z","1.0.1":"2025-12-29T02:22:28.531Z","1.0.2":"2025-12-29T02:29:12.914Z","1.1.0":"2026-03-03T01:00:21.137Z","1.2.0":"2026-03-10T21:25:39.375Z","1.3.0":"2026-04-14T21:10:21.236Z"},"bugs":{"url":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil/issues"},"homepage":"https://github.com/currentfear/react-web-politica-enmascaramiento-amovil#readme","keywords":["react","data-masking","privacy","enmascaramiento","typescript"],"repository":{"type":"git","url":"git+https://github.com/currentfear/react-web-politica-enmascaramiento-amovil.git"},"description":"Componente React con soporte TypeScript para aplicar y visualizar técnicas de enmascaramiento de datos. Compatible con React 18 y 19.","maintainers":[{"name":"currentfear","email":"david.gomez@amovil.co"}],"readme":"# @currentfear/react-web-politica-enmascaramiento-amovil\n\nComponente React con soporte TypeScript para aplicar y visualizar técnicas de enmascaramiento de datos. Compatible con React 18 y 19.\n\n---\n\n## Instalación\n\n```bash\nnpm install @currentfear/react-web-politica-enmascaramiento-amovil\n```\n\nReact y ReactDOM son peer dependencies y deben estar instalados en el proyecto.\n\n---\n\n## Uso básico\n\n```tsx\nimport { DataMasking } from '@currentfear/react-web-politica-enmascaramiento-amovil';\n\nfunction App() {\n  return (\n    <DataMasking\n      type=\"sustitucion\"\n      data={{ type: 'sustitucion', original: 'Juan Pérez' }}\n    />\n  );\n}\n```\n\n---\n\n## Props del componente\n\n| Prop | Tipo | Por defecto | Descripción |\n|------|------|-------------|-------------|\n| `type` | `MaskingType` | — | Tipo de enmascaramiento a aplicar |\n| `data` | `MaskingData` | — | Datos de entrada para el enmascaramiento |\n| `className` | `string` | — | Clase CSS adicional aplicada al contenedor |\n| `showOriginal` | `boolean` | `false` | Muestra el valor original junto al enmascarado |\n| `showLabel` | `boolean` | `true` | Muestra la etiqueta del tipo de enmascaramiento |\n| `maskCount` | `number` | — | Cantidad fija de caracteres de máscara. Si se combina con `maskWordsStart`/`maskWordsEnd`, aplica por palabra |\n| `maskChar` | `string` | `'*'` | Carácter usado para enmascarar |\n| `maskWordsStart` | `number` | `0` | Cantidad de palabras a enmascarar desde el inicio del valor |\n| `maskWordsEnd` | `number` | `0` | Cantidad de palabras a enmascarar desde el final del valor |\n| `nullValue` | `string` | — | Texto a mostrar cuando `original` es nulo, undefined o cadena vacía |\n| `constantValue` | `string` | — | Si se define, renderiza este valor directamente sin aplicar ningún enmascaramiento |\n\n---\n\n## Tipos de enmascaramiento\n\n### sustitucion\n\nReemplaza el valor original por un nombre ficticio determinista. El resultado es siempre el mismo para el mismo valor de entrada.\n\nCampos soportados en `SustitucionData`:\n\n| Campo | Tipo | Por defecto | Descripción |\n|------|------|-------------|-------------|\n| `original` | `string` | — | Valor original a enmascarar |\n| `suffix` | `string` | — | Sufijo opcional para nombres de empresa, por ejemplo `S.A.` o `S.A.S.` |\n\n```tsx\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: 'Ana Gómez', suffix: 'S.A.S.' }}\n/>\n```\n\nSi se define `suffix`, se agrega al valor generado. Ejemplo: `Laura Martínez S.A.S.`\n\n---\n\n### permutacion\n\nIntercambia el valor con otro registro. Si se omite `swappedWith`, genera un valor ficticio.\n\nCampos soportados en `PermutacionData`:\n\n| Campo | Tipo | Por defecto | Descripción |\n|------|------|-------------|-------------|\n| `original` | `string` | — | Valor original a enmascarar |\n| `swappedWith` | `string` | — | Valor alternativo a usar directamente |\n| `suffix` | `string` | — | Sufijo opcional. Solo aplica cuando la librería genera un valor ficticio y no cuando se usa `swappedWith` |\n\n```tsx\n<DataMasking\n  type=\"permutacion\"\n  data={{\n    type: 'permutacion',\n    original: 'Carlos Ruiz',\n    swappedWith: 'Luis Martínez', // opcional\n    suffix: 'S.A.', // opcional, aplica cuando se genera un valor ficticio\n  }}\n/>\n```\n\n---\n\n### cifrado\n\nCodifica el valor en Base64.\n\n```tsx\n<DataMasking\n  type=\"cifrado\"\n  data={{\n    type: 'cifrado',\n    original: '1023456789',\n    algorithm: 'Base64', // opcional, solo informativo\n  }}\n/>\n```\n\n---\n\n### enmascaramiento-parcial\n\nOculta una parte del valor mostrando solo los últimos `N` caracteres.\n\n```tsx\n<DataMasking\n  type=\"enmascaramiento-parcial\"\n  data={{\n    type: 'enmascaramiento-parcial',\n    original: '3001234567',\n    visibleChars: 4,  // por defecto 4\n    maskChar: '*',    // por defecto '*'\n  }}\n/>\n// Resultado: ******4567\n```\n\nCampos soportados en `EnmascaramientoParcialData`:\n\n| Campo | Tipo | Por defecto | Descripción |\n|------|------|-------------|-------------|\n| `visibleChars` | `number` | `4` | Cantidad de caracteres visibles al final cuando el valor es texto |\n| `maskChar` | `string` | `'*'` | Carácter usado para enmascarar |\n| `valueType` | `'text' \\| 'email'` | `'text'` | Si es `email`, oculta el usuario y conserva el dominio. Si el correo no tiene dominio válido, usa `dominio-ficticio.test` |\n\nComportamiento:\n\n- Si `valueType` es `'text'`, la librería deja visibles los últimos `visibleChars` caracteres del valor completo.\n- Si `valueType` es `'email'`, la librería enmascara la parte antes de `@` y conserva el dominio.\n- Si el correo no tiene un formato válido, el resultado será `****@dominio-ficticio.test`.\n\nEjemplo para correo:\n\n```tsx\n<DataMasking\n  type=\"enmascaramiento-parcial\"\n  data={{\n    type: 'enmascaramiento-parcial',\n    original: 'usuario@gmail.com',\n    valueType: 'email',\n  }}\n/>\n// Resultado: *******@gmail.com\n```\n\n---\n\n### envejecimiento-fechas\n\nDesplaza una fecha aplicando un offset en días.\n\n```tsx\n<DataMasking\n  type=\"envejecimiento-fechas\"\n  data={{\n    type: 'envejecimiento-fechas',\n    original: '2024-06-15',\n    originalDate: '2024-06-15', // formato YYYY-MM-DD\n    offsetDays: -180,           // por defecto -180\n  }}\n/>\n```\n\n---\n\n### tokenizacion\n\nReemplaza el valor por un token único y consistente derivado del original.\n\n```tsx\n<DataMasking\n  type=\"tokenizacion\"\n  data={{\n    type: 'tokenizacion',\n    original: 'usuario@ejemplo.com',\n    tokenPrefix: 'TKN', // por defecto 'TKN'\n  }}\n/>\n// Resultado: TKN-A1B2-C3D4\n```\n\n---\n\n### datos-sinteticos\n\nGenera un valor sintético completamente nuevo, diferente al original.\n\nCampos soportados en `DatosSinteticosData`:\n\n| Campo | Tipo | Por defecto | Descripción |\n|------|------|-------------|-------------|\n| `original` | `string` | — | Valor original a usar como base determinista |\n| `suffix` | `string` | — | Sufijo opcional para nombres de empresa, por ejemplo `S.A.` o `S.A.S.` |\n\n```tsx\n<DataMasking\n  type=\"datos-sinteticos\"\n  data={{ type: 'datos-sinteticos', original: 'Pedro Sánchez', suffix: 'S.A.S.' }}\n/>\n```\n\n---\n\n## Props avanzadas\n\n### Controlar la cantidad de caracteres de máscara\n\n```tsx\n// Muestra siempre 6 asteriscos independientemente del valor\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: 'Juan Pérez' }}\n  maskCount={6}\n  maskChar=\"*\"\n/>\n// Resultado en pantalla: ******\n```\n\n---\n\n### Enmascarar palabras al inicio o al final\n\n```tsx\n// Enmascara la primera palabra del resultado generado\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: 'María López García' }}\n  maskWordsStart={1}\n  maskCount={4}\n/>\n// Si el valor generado fuera \"Laura Martínez\":\n// Resultado: **** Martínez\n\n// Enmascara la última palabra\n<DataMasking\n  type=\"permutacion\"\n  data={{ type: 'permutacion', original: 'Carlos Díaz' }}\n  maskWordsEnd={1}\n  maskCount={5}\n/>\n// Resultado: Carlos *****\n\n// Enmascara inicio y final simultáneamente\n<DataMasking\n  type=\"datos-sinteticos\"\n  data={{ type: 'datos-sinteticos', original: 'Ana Beatriz Torres' }}\n  maskWordsStart={1}\n  maskWordsEnd={1}\n  maskChar=\"#\"\n  maskCount={3}\n/>\n// Resultado: ### Beatriz ###\n```\n\n---\n\n### Manejar valores nulos o vacíos\n\n```tsx\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: '' }}\n  nullValue=\"Sin dato\"\n/>\n// Resultado: Sin dato\n```\n\n```tsx\n// Funciona también con original undefined o null en runtime\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: datosDelApi?.nombre ?? '' }}\n  nullValue=\"—\"\n/>\n```\n\n---\n\n### Valor constante (sin enmascaramiento)\n\nÚtil cuando se quiere mostrar un valor fijo sin importar los datos de entrada, por ejemplo para registros que por configuración siempre deben mostrar un texto específico.\n\n```tsx\n<DataMasking\n  type=\"sustitucion\"\n  data={{ type: 'sustitucion', original: 'Juan Pérez' }}\n  constantValue=\"CONFIDENCIAL\"\n/>\n// Resultado: CONFIDENCIAL\n```\n\n---\n\n## Generadores directamente\n\nSi se necesita el valor enmascarado sin renderizar un componente:\n\n- Todas las funciones `generate*` aceptan un segundo parámetro opcional `displayOptions`:\n  `maskCount`, `maskChar`, `maskWordsStart`, `maskWordsEnd`, `nullValue`, `constantValue`.\n\n```tsx\nimport {\n  generateSustitucion,\n  generateEnmascaramientoParcial,\n  generateTokenizacion,\n} from '@currentfear/react-web-politica-enmascaramiento-amovil';\n\nconst nombre = generateSustitucion({ type: 'sustitucion', original: 'Juan Pérez' });\n// 'Laura Martínez' (determinista)\n\nconst empresa = generateSustitucion({\n  type: 'sustitucion',\n  original: 'Acme',\n  suffix: 'S.A.S.',\n}, {\n  maskWordsStart: 1,\n  maskCount: 4,\n});\n// '**** Martínez S.A.S.'\n\nconst cc = generateEnmascaramientoParcial({\n  type: 'enmascaramiento-parcial',\n  original: '1023456789',\n  visibleChars: 4,\n});\n// '******6789'\n\nconst correo = generateEnmascaramientoParcial({\n  type: 'enmascaramiento-parcial',\n  original: 'usuario@gmail.com',\n  valueType: 'email',\n});\n// '*******@gmail.com'\n\nconst { token } = generateTokenizacion({\n  type: 'tokenizacion',\n  original: 'usuario@ejemplo.com',\n});\n// 'TKN-A1B2-C3D4'\n\nconst tokenData = generateTokenizacion({\n  type: 'tokenizacion',\n  original: 'usuario@ejemplo.com',\n}, {\n  maskCount: 6,\n});\n// tokenData.masked = '******'\n// tokenData.token = 'TKN-A1B2-C3D4'\n```\n\nReglas importantes:\n\n- `suffix` está disponible en `SustitucionData`, `PermutacionData` y `DatosSinteticosData`.\n- En `PermutacionData`, `suffix` solo aplica cuando no se envía `swappedWith`.\n- `valueType: 'email'` solo aplica en `EnmascaramientoParcialData`.\n- Las mismas opciones de visualización del componente (`maskCount`, `maskChar`, `maskWordsStart`, `maskWordsEnd`, `nullValue`, `constantValue`) se pueden usar también en funciones generadoras mediante el segundo parámetro.\n- En funciones que retornan objetos (`generateTokenizacion`, `generateEnvejecimientoFechas`, `generateDatosSinteticos`), las opciones solo modifican la propiedad `masked`; los campos auxiliares (`token`, `maskedDate`, `syntheticValue`) conservan su valor original generado.\n\n---\n\n## Ejemplo completo\n\n```tsx\nimport { DataMasking } from '@currentfear/react-web-politica-enmascaramiento-amovil';\n\ninterface UsuarioProps {\n  nombre: string | null;\n  cedula: string;\n  correo: string;\n}\n\nfunction TarjetaUsuario({ nombre, cedula, correo }: UsuarioProps) {\n  return (\n    <div>\n      <DataMasking\n        type=\"sustitucion\"\n        data={{ type: 'sustitucion', original: nombre ?? '' }}\n        nullValue=\"Sin nombre\"\n        maskWordsEnd={1}\n        maskCount={4}\n      />\n      <DataMasking\n        type=\"enmascaramiento-parcial\"\n        data={{ type: 'enmascaramiento-parcial', original: cedula, visibleChars: 4 }}\n        showLabel={false}\n      />\n      <DataMasking\n        type=\"tokenizacion\"\n        data={{ type: 'tokenizacion', original: correo, tokenPrefix: 'USR' }}\n      />\n    </div>\n  );\n}\n```\n\n---\n\n## Licencia\n\nMIT\n","readmeFilename":"README.md"}