{"_id":"@aranzatech/react-native-card-secure-view","_rev":"3-79e5be4b7f79821f79349bc0191d153f","name":"@aranzatech/react-native-card-secure-view","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@aranzatech/react-native-card-secure-view","version":"0.1.0","keywords":["react-native","ios","turbomodule","new-architecture","secure-view","card","pan","cvv","hmac","aranzatech"],"author":{"name":"AranzaTech"},"license":"MIT","_id":"@aranzatech/react-native-card-secure-view@0.1.0","maintainers":[{"name":"_aranza","email":"aapa96@outlook.com"}],"homepage":"https://github.com/aranzatech/react-native-card-secure-view#readme","bugs":{"url":"https://github.com/aranzatech/react-native-card-secure-view/issues"},"dist":{"shasum":"caf54df6a1c537a3720c7c7631e24c7d5fc2112f","tarball":"https://registry.npmjs.org/@aranzatech/react-native-card-secure-view/-/react-native-card-secure-view-0.1.0.tgz","fileCount":47,"integrity":"sha512-B3PSfCBQu7F9SCnlkpUUYkYtCJEXjEiOY/V5mC3vwm0cmFEpRanz2iT+8zPCXMTpROXp3W5t9r0ejk0mOQf9/Q==","signatures":[{"sig":"MEUCIFv0fuTyjQXHtBydWSpoMJl/J0Bi7O485spcVKodS/pOAiEAvrM0zZ/5Hn4+QlPg69HmF9Dm6tpCED+R/5r8SaMzatc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83471},"main":"./lib/module/index.js","types":"./lib/typescript/index.d.ts","engines":{"node":">= 22.11.0"},"exports":{".":{"types":"./lib/typescript/index.d.ts","source":"./src/index.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"6ef77780c280c7638e22d5a3d94fb5265322cf27","scripts":{"ci":"npm run lint && npm run typecheck && npm run test:ci && npm run build","lint":"eslint .","test":"jest","build":"bob build","start":"echo 'Librería sin app propia; usa la app de ejemplo del reto.'","prepare":"bob build","test:ci":"jest --runInBand --watchman=false","typecheck":"tsc --noEmit"},"_npmUser":{"name":"_aranza","email":"aapa96@outlook.com"},"repository":{"url":"git+https://github.com/aranzatech/react-native-card-secure-view.git","type":"git"},"_npmVersion":"10.9.8","description":"Vista segura nativa iOS para datos sensibles de tarjetas — TurboModule con validación HMAC, protección anti-captura y timeout de sesión","directories":{},"_nodeVersion":"22.23.1","codegenConfig":{"ios":{"modulesProvider":{"NativeCardSecureView":"RCTNativeCardSecureView"}},"name":"NativeCardSecureViewSpec","type":"modules","android":{"javaPackageName":"com.aranzatech.cardsecureview"},"jsSrcsDir":"src"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","react":"19.2.3","eslint":"^8.19.0","prettier":"2.8.8","typescript":"^5.8.3","@types/jest":"^29.5.13","@types/react":"^19.2.0","react-native":"0.86.0","react-native-builder-bob":"^0.40.13","@react-native/jest-preset":"^0.86.0","@react-native/babel-preset":"0.86.0","@react-native/eslint-config":"0.86.0","@react-native/typescript-config":"0.86.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-card-secure-view_0.1.0_1784517922817_0.28100840757074086","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]}},"0.1.1":{"name":"@aranzatech/react-native-card-secure-view","version":"0.1.1","keywords":["react-native","ios","turbomodule","new-architecture","secure-view","card","pan","cvv","hmac","aranzatech"],"author":{"name":"AranzaTech"},"license":"MIT","_id":"@aranzatech/react-native-card-secure-view@0.1.1","maintainers":[{"name":"_aranza","email":"aapa96@outlook.com"}],"homepage":"https://github.com/aranzatech/react-native-card-secure-view#readme","bugs":{"url":"https://github.com/aranzatech/react-native-card-secure-view/issues"},"dist":{"shasum":"bbad80d76ec4cd53abfbbb9e5d3a57c101f43fdb","tarball":"https://registry.npmjs.org/@aranzatech/react-native-card-secure-view/-/react-native-card-secure-view-0.1.1.tgz","fileCount":47,"integrity":"sha512-H6pKynJZqDYktkbLzMNdmULgDMttoqh/bADFTqZXlX5jHACeGa/1fuxv11KzHNPZyYAVgMivPQStmc3T2N/zGQ==","signatures":[{"sig":"MEYCIQCJqPEbBAjqtTHl5xtNaJ0b+wYchtbIZ483ChuNeHyLHQIhAJyKbqJIYvJfQSLbR3XpUCpy8dn92mTrGGO0hJ/LwtQI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83813},"main":"./lib/module/index.js","types":"./lib/typescript/index.d.ts","engines":{"node":">= 22.11.0"},"exports":{".":{"types":"./lib/typescript/index.d.ts","source":"./src/index.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"a89c92450797f954f57b3c051634407be10fb23e","scripts":{"ci":"npm run lint && npm run typecheck && npm run test:ci && npm run build","lint":"eslint .","test":"jest","build":"bob build","start":"echo 'Librería sin app propia; usa la app de ejemplo del reto.'","prepare":"bob build","test:ci":"jest --runInBand --watchman=false","typecheck":"tsc --noEmit"},"_npmUser":{"name":"_aranza","email":"aapa96@outlook.com"},"repository":{"url":"git+https://github.com/aranzatech/react-native-card-secure-view.git","type":"git"},"_npmVersion":"10.9.8","description":"Vista segura nativa iOS para datos sensibles de tarjetas — TurboModule con validación HMAC, protección anti-captura y timeout de sesión","directories":{},"_nodeVersion":"22.23.1","codegenConfig":{"ios":{"modulesProvider":{"NativeCardSecureView":"RCTNativeCardSecureView"}},"name":"NativeCardSecureViewSpec","type":"modules","android":{"javaPackageName":"com.aranzatech.cardsecureview"},"jsSrcsDir":"src"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","react":"19.2.3","eslint":"^8.19.0","prettier":"2.8.8","typescript":"^5.8.3","@types/jest":"^29.5.13","@types/react":"^19.2.0","react-native":"0.86.0","react-native-builder-bob":"^0.40.13","@react-native/jest-preset":"^0.86.0","@react-native/babel-preset":"0.86.0","@react-native/eslint-config":"0.86.0","@react-native/typescript-config":"0.86.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-card-secure-view_0.1.1_1784528335987_0.34621928299137616","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]}},"0.1.2":{"name":"@aranzatech/react-native-card-secure-view","version":"0.1.2","description":"Vista segura nativa iOS para datos sensibles de tarjetas — TurboModule con validación HMAC, protección anti-captura y timeout de sesión","license":"MIT","author":{"name":"AranzaTech"},"keywords":["react-native","ios","turbomodule","new-architecture","secure-view","card","pan","cvv","hmac","aranzatech"],"repository":{"type":"git","url":"git+https://github.com/aranzatech/react-native-card-secure-view.git"},"bugs":{"url":"https://github.com/aranzatech/react-native-card-secure-view/issues"},"homepage":"https://github.com/aranzatech/react-native-card-secure-view#readme","publishConfig":{"access":"public"},"main":"./lib/module/index.js","types":"./lib/typescript/index.d.ts","exports":{".":{"source":"./src/index.ts","types":"./lib/typescript/index.d.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"scripts":{"build":"bob build","ci":"npm run lint && npm run typecheck && npm run test:ci && npm run build","lint":"eslint .","prepare":"bob build","start":"echo 'Librería sin app propia; usa la app de ejemplo del reto.'","test":"jest","test:ci":"jest --runInBand --watchman=false","typecheck":"tsc --noEmit"},"peerDependencies":{"react":"*","react-native":"*"},"devDependencies":{"@react-native/babel-preset":"0.86.0","@react-native/eslint-config":"0.86.0","@react-native/jest-preset":"^0.86.0","@react-native/typescript-config":"0.86.0","@types/jest":"^29.5.13","@types/react":"^19.2.0","eslint":"^8.19.0","jest":"^29.6.3","prettier":"2.8.8","react":"19.2.3","react-native":"0.86.0","react-native-builder-bob":"^0.40.13","typescript":"^5.8.3"},"engines":{"node":">= 22.11.0"},"codegenConfig":{"name":"NativeCardSecureViewSpec","type":"modules","jsSrcsDir":"src","android":{"javaPackageName":"com.aranzatech.cardsecureview"},"ios":{"modulesProvider":{"NativeCardSecureView":"RCTNativeCardSecureView"}}},"react-native-builder-bob":{"source":"src","output":"lib","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"_id":"@aranzatech/react-native-card-secure-view@0.1.2","gitHead":"56bd6b92cda7af738a79f1b60a70a549474a6375","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-ooiYiquJZ0FyZWQaEZtV3qA2pU6vTo2a4oIo3D0Xvu8+RNgiPTvxj+46svuo9CU5wl96QcLwMYTr5YJP6Ryw8Q==","shasum":"5943c6667354b63628bf69c531c9fc5131f473a5","tarball":"https://registry.npmjs.org/@aranzatech/react-native-card-secure-view/-/react-native-card-secure-view-0.1.2.tgz","fileCount":47,"unpackedSize":84536,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC3In0yODNJydboPD3I+g20OtkRqQKigXoUAM6aTRKtoAiBwXG+AEER61CY13p74WWdKjxT+0S9F1pUnCy/VaiFfyg=="}]},"_npmUser":{"name":"_aranza","email":"aapa96@outlook.com"},"directories":{},"maintainers":[{"name":"_aranza","email":"aapa96@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-card-secure-view_0.1.2_1784532939823_0.27388744144932664"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-20T03:25:22.665Z","modified":"2026-07-20T07:35:40.128Z","0.1.0":"2026-07-20T03:25:23.183Z","0.1.1":"2026-07-20T06:18:56.105Z","0.1.2":"2026-07-20T07:35:39.965Z"},"bugs":{"url":"https://github.com/aranzatech/react-native-card-secure-view/issues"},"author":{"name":"AranzaTech"},"license":"MIT","homepage":"https://github.com/aranzatech/react-native-card-secure-view#readme","keywords":["react-native","ios","turbomodule","new-architecture","secure-view","card","pan","cvv","hmac","aranzatech"],"repository":{"type":"git","url":"git+https://github.com/aranzatech/react-native-card-secure-view.git"},"description":"Vista segura nativa iOS para datos sensibles de tarjetas — TurboModule con validación HMAC, protección anti-captura y timeout de sesión","maintainers":[{"name":"_aranza","email":"aapa96@outlook.com"}],"readme":"# @aranzatech/react-native-card-secure-view\n\nVista segura nativa iOS para mostrar datos sensibles de una tarjeta (PAN, CVV, vencimiento, titular) desde React Native. El PAN y el CVV se crean, conservan y renderizan exclusivamente en Swift: nunca cruzan el bridge hacia JavaScript.\n\nLa librería expone un TurboModule (New Architecture) que valida un token HMAC de vida corta antes de presentar la vista, y emite eventos de solo metadatos hacia JS.\n\n## Características\n\n- **Frontera de datos sensibles**: PAN y CVV viven únicamente en el paquete Swift `CardSecureViewKit`; el contrato JS no tiene ningún método que los devuelva.\n- **Validación de token**: HMAC-SHA256 (CryptoKit) con verificación de firma en tiempo constante, match de `cardId`, TTL máximo de 60 s, clock skew y expiración, distinguiendo `TOKEN_INVALID` de `TOKEN_EXPIRED`.\n- **Protecciones de sesión**: timeout configurable (30–60 s), escudo de privacidad en background, ocultamiento durante grabación o duplicación de pantalla, cierre al detectar screenshot, limpieza de contenido antes del dismissal y bloqueo de aperturas simultáneas.\n- **Sin logs sensibles**: el código no contiene sentencias de logging.\n- **Eventos tipados**: `opened`, `cardDataShown`, `validationError`, `closed` — solo `cardId`, códigos y motivos.\n\n## Requisitos\n\n- React Native >= 0.80 con New Architecture habilitada (usa Codegen y `CodegenTypes.EventEmitter`).\n- iOS 15+.\n- Android no está implementado todavía; `isSecureViewAvailable()` devuelve `false` fuera de iOS.\n\n## Instalación\n\n```sh\nnpm install @aranzatech/react-native-card-secure-view\ncd ios && bundle exec pod install\n```\n\nEl módulo se registra por autolinking; no se requiere configuración manual.\n\n## Uso\n\n```tsx\nimport {\n  isSecureViewAvailable,\n  openSecureCardView,\n  onSecureViewClosed,\n  onValidationError,\n} from '@aranzatech/react-native-card-secure-view';\n\n// Suscripción a eventos (por ejemplo, en un useEffect)\nconst closedSubscription = onSecureViewClosed(({cardId, reason}) => {\n  // reason: USER_DISMISS | TIMEOUT | CAPTURE_DETECTED | BACKGROUND_TIMEOUT | VALIDATION_ERROR\n});\nconst errorSubscription = onValidationError(({code, message}) => {\n  // code: TOKEN_INVALID | TOKEN_EXPIRED | CARD_NOT_FOUND | VIEW_ALREADY_PRESENTED\n});\n\n// Abrir la vista segura (emite el token demo y presenta la UI nativa)\nawait openSecureCardView('card_001');\n\n// Limpieza\nclosedSubscription.remove();\nerrorSubscription.remove();\n```\n\nSi prefieres controlar el token por separado:\n\n```ts\nimport {\n  createSecureToken,\n  openSecureView,\n} from '@aranzatech/react-native-card-secure-view';\n\nconst token = await createSecureToken('card_001');\nawait openSecureView('card_001', token);\n```\n\n## API\n\n| Función | Descripción |\n| --- | --- |\n| `isSecureViewAvailable()` | `true` si el módulo nativo existe en la plataforma actual. |\n| `createSecureToken(cardId)` | Emite un token demo HMAC de vida corta para la tarjeta. |\n| `openSecureView(cardId, secureToken)` | Valida el token en Swift y presenta la vista segura. |\n| `openSecureCardView(cardId)` | Conveniencia: emite el token y abre la vista en un paso. |\n| `onSecureViewOpened(listener)` | La sesión nativa fue presentada. |\n| `onCardDataShown(listener)` | El contenido fue revelado dentro de UIKit. |\n| `onValidationError(listener)` | El token o la solicitud no superó la validación. |\n| `onSecureViewClosed(listener)` | La sesión terminó; incluye el motivo. |\n\nTodas las suscripciones devuelven un `EventSubscription` con `.remove()`.\n\n## Arquitectura\n\n```text\nsrc/\n├── NativeCardSecureView.ts   # contrato TurboModule (Codegen)\n└── index.ts                  # API pública tipada\nios/\n├── RCTNativeCardSecureView.{h,mm}      # TurboModule ObjC++ (adaptador delgado)\n├── NativeCardSecureViewAdapter.swift   # traducción de llamadas y eventos\n└── CardSecureViewKit/                  # Swift Package independiente\n    └── Sources/CardSecureViewKit/\n        ├── Domain/          # SensitiveCardData, SecureTokenClaims\n        ├── Application/     # puertos de validación y datos\n        ├── Infrastructure/  # HMAC, codec, repositorio mock\n        ├── Presentation/    # vista segura UIKit y protecciones\n        └── Public/          # coordinador, configuración, eventos\n```\n\n`CardSecureViewKit` es también un Swift Package autónomo (sin dependencia de React Native): puede consumirse por SPM desde una app iOS nativa. El podspec compila las mismas fuentes para el flujo CocoaPods/autolinking de React Native.\n\n## Seguridad — alcance demo\n\nEl emisor de tokens (`DemoSecureTokenIssuer`) y el repositorio de tarjetas mock existen para demostración. En producción el token debe emitirlo un backend, los secretos no deben distribuirse en la app y los datos deben provenir de un servicio seguro. iOS informa una captura de pantalla después de realizada; con APIs públicas no es posible impedirla de forma garantizada, por lo que la librería responde ocultando el contenido y cerrando la sesión.\n\n## Desarrollo\n\n```sh\nnpm install\nnpm run ci          # lint + typecheck + jest + build\n\ncd ios/CardSecureViewKit\nxcodebuild -scheme CardSecureViewKit \\\n  -destination 'platform=iOS Simulator,name=iPhone 16' test\n```\n\n## Publicación\n\nEl workflow `publish.yml` publica en npm y crea el GitHub Release al pushear un tag `vX.Y.Z` que coincida con la versión del `package.json`. Requiere el secret `NPM_TOKEN` en el repositorio.\n\n## Licencia\n\nMIT\n","readmeFilename":"README.md"}