{"_id":"usetargethandler","_rev":"40-6cc5e6f2b2152daf527a2d42ea2f4614","name":"usetargethandler","dist-tags":{"latest":"1.4.5"},"versions":{"1.0.0":{"name":"usetargethandler","version":"1.0.0","keywords":["react","hook","api","axios","http","request"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.0","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTarget#readme","bugs":{"url":"https://github.com/GianfrancoD/useTarget/issues"},"dist":{"shasum":"4a49ae3fa6fa44dbd575c987998200081d16af38","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.0.tgz","fileCount":18,"integrity":"sha512-jhfpUQB53mqJli6E3oY2yMsVhm8SATeNjL95yGllgmHGhs1ZRYdFn+yM5sl+FLxh/kDAt3xOM7UHFQ/+wm6RbA==","signatures":[{"sig":"MEUCIQDsyzQa34YtunuknM34afxwWm8pD0ZhgtZ55y8iQnaPCgIgSyb+yLBfpqwBtxHW8y1P0U6yAiaoPUksmW6LZCTLpdM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33196},"gitHead":"94b42348ccabf0d672bb8c68913584e67d18a4d4","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTarget.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.0_1721416523056_0.09845998980383408","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"usetargethandler","version":"1.0.2","keywords":["react","hook","api","axios","http","request"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.2","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTarget#readme","bugs":{"url":"https://github.com/GianfrancoD/useTarget/issues"},"dist":{"shasum":"e3900078c807b1e91ddd2a9c01164ebbfee7b58c","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.2.tgz","fileCount":18,"integrity":"sha512-nfwbjEj83RVG0jvtI2cxtpJ/Pc9o2NZXgKbCaYwmRWguVpepB/2B0ccVDQyBmSZjtonbGOeU6YktAoQPUixWEw==","signatures":[{"sig":"MEQCIFkqbtlc71YTrHguq17jAL/NkCAUZHbZdXkYUI+An5JeAiBbGcTOY+eUyJAbVAaw82rwuEKyMFAHpeOAuurJlPBwjw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33347},"main":"src/index.js","gitHead":"0837b1ab0559988f8002e90588a4b0590cc09cd5","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTarget.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.2_1721502227726_0.05034374705838496","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"usetargethandler","version":"1.0.4","keywords":["react","hook","api","axios","http","request"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.4","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTarget#readme","bugs":{"url":"https://github.com/GianfrancoD/useTarget/issues"},"dist":{"shasum":"aa9e281c4e700244829a81814bae439a9130b814","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.4.tgz","fileCount":18,"integrity":"sha512-DDnH40WNboDBQT3qZ2ISPZScoeDJYUZAE8tngtHPUKnKrCflTz7kWvlmFch7Q9n3SBrrTlselHk4Gq954SnKkQ==","signatures":[{"sig":"MEQCIC7BtLp21oLEIWt9ufx8oilngdFUkpCKaBaqCY0dyqGaAiAOTPd6WbZW67Cuz0Kmoo7MaOc8w6tixmubvenV1N60Cg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33431},"main":"src/index.js","exports":{"import":"./src/main.jsx","require":"./src/index.js"},"gitHead":"f12e9f60d6937305a97cc97a627088984029fc48","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTarget.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.4_1721503152647_0.9455144763563499","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"usetargethandler","version":"1.0.5","keywords":["react","hook","api","axios","http","request"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.5","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"3e21dd73cafa15ac0135ddee9d53ab1005e1f4af","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.5.tgz","fileCount":18,"integrity":"sha512-4oQE7qoIZlF1IgrvP9mNkGxQOfRgsoFkWa01dj0km9W1wCBBHDQqV21K24ViXAEfTz6jBsAUZ4hljIwUgDsreA==","signatures":[{"sig":"MEYCIQCP4xAIUG76Lzz7VJdDVtI7Zf0aTyXhmpRPixzmc9UE5gIhAN5fuaqTBQJIrZyVMLrhWuM+jiU+qKVQB2zhlYcdSPpz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33459},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"3bd0420cc38856a3429ec66e035f4ed2bf4c82f4","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.5_1721506538965_0.1631495507904488","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"usetargethandler","version":"1.0.6","keywords":["react","hook","api","axios","http","request"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.6","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"e828b9503ad75dd8ffe5adfdfdcdd1b786cd3431","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.6.tgz","fileCount":18,"integrity":"sha512-wJS8UAlSb5HAQOGHz0xYKxspBaRgId2Q39nHL1G7mkv94lTJhZY7o2QkCFDdefKEstR+0uIZ3rrApfCh44aHcA==","signatures":[{"sig":"MEQCID3/65eJr3AMCAknREXsdQE8dMGLg+7lDWcayg17oDEHAiB1gtnArvJIIrPYK2bvOkMv0PAkWHUve6uqxd1UQJlG6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33458},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"40c6ecfd6b1b0980eb6ac42f3fffa205ef474a63","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.6_1721508531272_0.663113711638539","host":"s3://npm-registry-packages"}},"1.0.7":{"name":"usetargethandler","version":"1.0.7","keywords":["react","hook","api","axios","http","request","web development","react form","frontend","form state","form validation","package","api integration"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.7","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"81939a612556d721537468cfe18381b69f5a2bd3","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.7.tgz","fileCount":18,"integrity":"sha512-kIDrfztEcn6TZeL0ho/h/qkBdIUroVqtEB/llxCu/YdkeY2psqzSWQJZX1c458QB9nPIh+qXoZDW9N0/LKGWYg==","signatures":[{"sig":"MEYCIQCBK8UQo0/edtV3Rp5UuRCXmZRg7yPRwR3TN7/B84I8cQIhAI7VLG3RXHb/+wp0NGDyGPX4o+RMLI42Dpa9l9S5oUnC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33451},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"0b07b9db62ce6044c6458be194a099a8adfc5fb2","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.7_1721510615426_0.0770205566041613","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"usetargethandler","version":"1.0.8","keywords":["react","hook","api","axios","http","request","web development","react form","frontend","form state","form validation","package","api integration"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.8","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"88aa4f6b3b2968c4ba2750af3e13bd74a272f6e5","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.8.tgz","fileCount":18,"integrity":"sha512-rAMr489eUhvLqTsAL1eI1BfoJYBg/M22znWNQjOwkRU+DbYd7lwXnDFbCamyXS6gZORs4POMcLHy5jCLgwaGKw==","signatures":[{"sig":"MEQCICORPZV4ALurv4pwhDlmaKdSRuoxEqQzvkeTKff2uJE/AiAZy/XOJZ8Bp9EWteMWg4eclp9QrFr9pvo3KHZvBSllQg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33128},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"d8854160637beb327041f360c33069b87fdc5b3b","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.8_1721511858624_0.47257576053820727","host":"s3://npm-registry-packages"}},"1.0.10":{"name":"usetargethandler","version":"1.0.10","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.10","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"fb96a034aaf74d55049bd091e21238665a51275e","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.10.tgz","fileCount":22,"integrity":"sha512-diaUpyDMqzNYHcy/czkRMwnitdA2UBoLkiQR8S8i7vk7dETraxnHZ27pMjgaUQmRUcx36I+yBUXB1lhdc/O73w==","signatures":[{"sig":"MEUCIQDAmOXROHWzB7yKEMEPqTYObe0lny5XPwzDkfSB7+cIxwIgMoV4Gkngl6uWC4RTwjGwbfauyLHRuczHaeqzfhw8GtY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39937},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"3ee723fd30dc73ebc9efaaa69b8ff730d206427c","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.10_1721794328125_0.21214874642103787","host":"s3://npm-registry-packages"}},"1.0.11":{"name":"usetargethandler","version":"1.0.11","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.11","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"e7bc5a63e6a57619d1870a21c5e8d1be3cdcc5dc","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.11.tgz","fileCount":22,"integrity":"sha512-zckZrJc9BimsOxT8ghzWjDXKCLLqEq5/RBGB/KkrJNbBYnhllyxWzhhQesin7k9+KMhyTI7zrlDehXVH7ECRiQ==","signatures":[{"sig":"MEUCIEtmFrvMPcncL8z3B7ASvUe9BATuPnSQSBCIp+NifkwwAiEA2w1TWHN26ExHsIDVRAYB3OXMGD1wR1bYp8hC7iMNSGs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40284},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"cd3760e4e287e51f87c05265b3a8b66610148f40","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.11_1721843858313_0.027020371264621756","host":"s3://npm-registry-packages"}},"1.0.12":{"name":"usetargethandler","version":"1.0.12","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.12","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"5ac5d0daf6bf07270ddb986ee0c8c5cf100be2b9","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.12.tgz","fileCount":22,"integrity":"sha512-1ti2270OWplskFN5xwVfYGuNgBswDHczvr+NaI5xMlET5XXkuwmSr95Oq779z0HUm1MFMj9W3pZ/RWGRJoNIeQ==","signatures":[{"sig":"MEYCIQCvbCXbU15lVHEPd3Y0yw0R21N0HpU1xktznCaS2RzChQIhAMFaiOWPHcIbPeCaMvME9OcD0rwZWtgvwEEHGxBGCk5w","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40043},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"defa84ea80ae1824a8142dd5e7df438fa1ca895e","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.12_1721846607788_0.7418370266032792","host":"s3://npm-registry-packages"}},"1.0.13":{"name":"usetargethandler","version":"1.0.13","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.13","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"75220d808c39f007ac740ade6735992bd6b57039","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.13.tgz","fileCount":22,"integrity":"sha512-S0IMlekXhqC0oKk6HUGDadFohjrMgdmkuBuRdQERGmI/xlzXGkdSZDwTSXLMWCoQ7J21dnPlAh6bYz4ePQabJQ==","signatures":[{"sig":"MEYCIQDcWGkO5z+75wJClXkYasuYA9Ml7TlJkI6FubqVbwfbrwIhAJOTO+Z7gn2wJ52LCKCIw9hAMQqVg2PKkCUTRZIe7NCB","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40018},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"1f046eefb49bd00c9bf90057725fdc0c81a531ab","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.13_1721864364870_0.9601682674008161","host":"s3://npm-registry-packages"}},"1.0.14":{"name":"usetargethandler","version":"1.0.14","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.14","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"0885b22e6bec885c601116cdfe9fe7e044046a76","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.14.tgz","fileCount":22,"integrity":"sha512-nfDqNAcPxq4nL8hCvceC08U7K4IAVUqXGNYscD/1JQnlVkfBqhIze+pgJskm9tbF/dK1NM9DxOCCmiBTLm2IwQ==","signatures":[{"sig":"MEQCICvhApDESl3DANsC0VHAMOmYenWBBcZHs6jC7C8CTg5hAiAYc4WIPugQ3JxiX7DfyaV7a841JQVN2VAGZK6LcmFJgg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40117},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"5f780be9fda6da456c5ca7811ca3e5a1957f06da","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.14_1721866190037_0.6666380611884033","host":"s3://npm-registry-packages"}},"1.0.15":{"name":"usetargethandler","version":"1.0.15","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.15","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"d92db76ad5817d1be2b64a88d62dcfdfd2ddb40d","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.15.tgz","fileCount":22,"integrity":"sha512-t42uyLkbbGKmIZNNFpvu1s254bHDVlLyJ87ZCnmzci13AzvS+P48JJH/Rm8J8BdbqkKmdIIU1/VKSv0VwRX+SA==","signatures":[{"sig":"MEQCIHaXF2LF+fraHvI1iLp5jLUi2QOjAX5+EsnlgW7RI5h1AiBx9qPW915lsV8cyH5PDyK45ElVOGkkTiegn04MhrDj1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40018},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/index.tsx","require":"./src/index.tsx"}},"gitHead":"f112e4697bc7a6674df17743546ce10c17a90105","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.15_1721873378478_0.4340840639451078","host":"s3://npm-registry-packages"}},"1.0.16":{"name":"usetargethandler","version":"1.0.16","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.16","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"5b83e7831b9fe412eef63c69f5f310c202732522","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.16.tgz","fileCount":22,"integrity":"sha512-jfSeVVPJYOSLnbWdgliqK9FyDe3wntBJg5nF5M50KH5WmuDD3eauzb7WHu9ITp3C7z5ODk3AADh02ft3ve/Itg==","signatures":[{"sig":"MEQCIG93+oMNz7BnPzys8yUC1bh1mROhYLqaqByTgR4esa1GAiAyJLI1aFy4rLqkJPF1gnlbVQdw0xK9GWaPoTPOEoXlhQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40297},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"6ad1cf2f98867bc443c137aecbd3b91dbe215cfd","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.16_1721879833328_0.7639754377788095","host":"s3://npm-registry-packages"}},"1.0.17":{"name":"usetargethandler","version":"1.0.17","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.17","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"083650d2cf98c52c3a1559652d5e6a286ba2255d","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.17.tgz","fileCount":23,"integrity":"sha512-5iy3qfQnESSm63TeAAVVZjizYhRne+dJIGaOhDcLfGP/ULsDjVpqOElif3bf1o+t5PFPUs3XhvvkdA8j7mJbUg==","signatures":[{"sig":"MEUCIDwRwR6U+p+/A6g+obt5qImMpBlFX80Q/BjImeRZIczMAiEAz1Ebnm7/2xldbouNXvYOLqBu15Cu5OnheLcSnueXF7g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40418},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"types":"./src/main.d.ts","import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"139fb396374a951a1b6d37bbf8017951b87b3ba1","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.17_1721881141427_0.10496225302003848","host":"s3://npm-registry-packages"}},"1.0.18":{"name":"usetargethandler","version":"1.0.18","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.18","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"c3245518bf7680b31d89f9695f272123c5cd1985","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.18.tgz","fileCount":23,"integrity":"sha512-hbkEw6VP5w8uUMbXixQUP9BMztqxtku3lBi3tIKIToQyFOh+OMFMqv/OESVYFZJclrRQkr+m4c3Nemr9tPr3Kw==","signatures":[{"sig":"MEUCIFf25jbow/e+NMrRWBesdX241wfK/iiONsNEqxRFz6qEAiEA01Hc+TYyqoK1/RgjY4JdOXRBsfmIjEc9Cl5BXZpO3tg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40414},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./tsx":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"6658dcc6222ea95455ec453b18c166202a90b2d6","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.18_1721882140649_0.5646035660962085","host":"s3://npm-registry-packages"}},"1.0.19":{"name":"usetargethandler","version":"1.0.19","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.19","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"2f030c4e8a193335a94fc84909de24c4e2cfb15d","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.19.tgz","fileCount":21,"integrity":"sha512-uNKZh32hyBTaDnOmYVtevqh99xC4uJ9SZpdJxYbcq/MFr3uDc9hYZ6UAxDO0XN510bEII1C9KfvCmn5LgzQdmg==","signatures":[{"sig":"MEYCIQDnw50dDTHNgnrFwTtxxtt9BLY/PTaX4jcuOIFDJguEnQIhAP2bpqmja6pHebDVtpn5dX3U9gYxq4nmZOU8RqIrctfY","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37698},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./ts":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"ebf933b6dc3b444725daa4cf1b81ad309d5b18f8","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4","@types/react":"^18.3.3"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.19_1721885617184_0.9813525436067561","host":"s3://npm-registry-packages"}},"1.0.20":{"name":"usetargethandler","version":"1.0.20","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.20","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"085bef70f2ef1f97017c2e1aea4ce5169cf7524c","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.20.tgz","fileCount":21,"integrity":"sha512-9TwLRZftH+LoPg/UDj/aohSIfC5pIzm4mYdJ618gfeCcs1cpfjWVlJmggeMCz2El/XUJcxbKA3WXR+xeHq078A==","signatures":[{"sig":"MEUCIDa9XPq3mW+KnanwIdCA5UctzgMU1dlwF11he3pOLVYvAiEAoxwntPZHM90jjPPHSz0+fFXhcsZdKZmzzmvYqjCpM94=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37609},"main":"src/index.ts","exports":{".":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"baf4f7e827653362652cf17322b869b5caf5122d","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4","@types/react":"^18.3.3"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.20_1721886440005_0.05949376267823547","host":"s3://npm-registry-packages"}},"1.0.21":{"name":"usetargethandler","version":"1.0.21","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.21","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"154497066664fbe1ac4c30162eb845bfb556ac30","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.21.tgz","fileCount":21,"integrity":"sha512-1kMEESBkzYoYwyW+YBdY/PJwXvn2DeSWWp99n+Un8Ac35du09EauSF4Z0qx9Ehb1+Gm2CAUtPTLvZb4VeZHZJw==","signatures":[{"sig":"MEYCIQDPYJokIeCS+1zRM/RlpyLowaU5jVfMbOcTp9DHGdGGLAIhAOqBHpWZc3kgt07e4e4K6v47kYxRadWC+b8RED2ftvzJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37608},"main":"src/main.ts","exports":{".":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"d993b4f10eee3b211f07620faad5acd73b9ef52b","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4","@types/react":"^18.3.3"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.21_1721886732125_0.1539609223110323","host":"s3://npm-registry-packages"}},"1.0.22":{"name":"usetargethandler","version":"1.0.22","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.22","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"df060698bdc2de4675a987a577476a4d666b0579","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.22.tgz","fileCount":21,"integrity":"sha512-ncj15kz062WlThQG73xVU5WJhxx7b65LxHHn6JzRugZSbXIO0pcSOzFJmi+C6nj79l4rsHvXumg+GC4hTk06iA==","signatures":[{"sig":"MEQCIHHknCYdi8jzpoy2OwQyQvVz7xrtYAkiUVeZ3BJdlSkrAiAmnmsP571bHH43/GbHZDrM6ALMYOkl9MBfUDiAiHjknw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37724},"main":"src/main.ts","index":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./ts":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"cc261a92f72b3182e549229431d07972b123a8d8","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4","@types/react":"^18.3.3"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.22_1721887207679_0.16954057501542863","host":"s3://npm-registry-packages"}},"1.0.23":{"name":"usetargethandler","version":"1.0.23","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.23","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"d36587635478a7aa9129df133241a35815f2a5d6","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.23.tgz","fileCount":21,"integrity":"sha512-8yECbo5qS/13nZFTAQvgFQ9gENKc8jGVahkF2mZQbpkaF1M5cqagaVigZujr0wQrpO1iWHGZydmbq7DxcrVJpw==","signatures":[{"sig":"MEUCIF1Q59mdYbeYGKjn6U8K0sDMIgabJ7lcwmarwIBVR3IbAiEA22X3SCsvI3ZX4a+4yx881Iutot/OLBURShf1VxSWkME=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37738},"main":"src/main.ts","index":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./ts":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"9adf534cc4564428fc52f9cafcad5dd66b2542c3","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.23_1721955387354_0.33017999785304664","host":"s3://npm-registry-packages"}},"1.0.24":{"name":"usetargethandler","version":"1.0.24","keywords":["react","hook","form","form state","form validation","web development","frontend","typescript","javascript","state management","form handling","react hook form","form builder","frontend library","typescript library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.24","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"018ec369ea9298df27520a7f4bbafce6b252b14b","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.24.tgz","fileCount":21,"integrity":"sha512-evkADBZ6Q/RQBzkEaKiFS6LggqeprDUPQQTgMRBK+Yb7kVVPckfL9+UT1mlg4yBuTUZiQMMf7tWSAmYlEzmxoQ==","signatures":[{"sig":"MEUCIAyxOTzhqTxUwxqprBWNL3H3TEvKJSH2VuFhURcJKwd1AiEAwY5EAQelWCbo3gAoPAWCSyQpiyXI5oYHTXROepoI1Mk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":37712},"index":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"},"./ts":{"import":"./src/main.ts","require":"./src/main.ts"}},"gitHead":"056714731bd67f11b7ad91e9388eb6172bbbfa6c","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/react":"^18.3.3","react-scripts":"5.0.1","@types/react-dom":"^18.3.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.24_1721955671941_0.0659608427606524","host":"s3://npm-registry-packages"}},"1.0.25":{"name":"usetargethandler","version":"1.0.25","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.25","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"fd1eab625f288d7938d585aa32d694b0ca5b479f","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.25.tgz","fileCount":18,"integrity":"sha512-sMc+PbahIIuPok9ZdDBopleEh9qwrlzTSUtl7OL5aReCKqie90sk1lvWo32/3jEgu8WewL6KcDdQG9uyrjRbPw==","signatures":[{"sig":"MEQCIDRqs4qlgekSZYECOn4mKAFBbdGDZuQ2FCbVKBmr4VPMAiAvIMv8H9xhlszjYSPWQeJVTVVPbHf+C0FQTBckPD+Z1A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35118},"index":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"ff44b81f7559f597e3008ca716879ff9b1862835","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"web-vitals":"^2.1.4"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.25_1721958420180_0.22458471964346938","host":"s3://npm-registry-packages"}},"1.0.26":{"name":"usetargethandler","version":"1.0.26","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.26","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"eecb33da7cb012906304ec4cc134dac1e4591218","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.26.tgz","fileCount":18,"integrity":"sha512-wkrfoC7gA7X9NDLhwedMJqFEm/NbfmVvqSPoK6vavheI+3WsRHQEQa5BX7GgX2ODswsdXclEf9d2hfXHN3qOPQ==","signatures":[{"sig":"MEUCIQDPcnP33lE0opEZr/gYPetTcXsS4oFu/jfkOgTDqNQMZwIgQZCsHRstTrMVqbroVQme5TYNMOW68VbZscItUPXlzCY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35592},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"f1c2fd663343dc32c81d393b3f4a1bf3f7888571","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.26_1721967079411_0.11578824647916264","host":"s3://npm-registry-packages"}},"1.0.27":{"name":"usetargethandler","version":"1.0.27","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.0.27","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"503a208ef42e0dd941f27cff6650db56126d1e09","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.0.27.tgz","fileCount":19,"integrity":"sha512-gh9m909SuUhega4IFPAiIKT/N5h0U2khbgiR4X85kMb9nWgyPysJL0aHNzwAAQopVoyJeHFvOsgSJpiY1Sj+GA==","signatures":[{"sig":"MEUCIQDCuHGR+86nyThFYXqNXsJDFvS5Tk32sjXZbJRoWRPT2QIgfAhR4sngujY5cPQp3q5WQVWMMtkmBf4nlsAQXu86x0g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41457},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"b9656431364e476c22fb8e30ce50a3daf0e49fb8","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.0.27_1722309738383_0.5212897749259409","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"usetargethandler","version":"1.1.0","keywords":["react","custom hook","form management","form state management","form validation","web development","frontend development","javascript","state management","form handling","react hook form","dynamic forms","frontend library","validation rules","conditional validation","asynchronous validation","form submission","input handling","local storage","session storage","user input validation","form error handling","responsive forms","controlled components","uncontrolled components","form"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.1.0","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"52ef5e2c958e97d4a425cfaa403966dab38c2a63","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.1.0.tgz","fileCount":19,"integrity":"sha512-Br5Y99lIqYqUsvQDdS/OSccvPR3b2imMRnOk9tFPOBqFDdoq/i92wCDRnfIczzzzGWAFO04fUyltGH4YQUjiVA==","signatures":[{"sig":"MEQCIHIJQODBL21/kA56ZYT0cetikvX5qmxAqvOjLTAylPBUAiAKCSbQ0B25nXOaInMT6swxrWrgtekmEeYbYhVcpDakbw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":49139},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"dcfcfcd6e24f2ede8050c5483b2dacf334ac560b","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.1.0_1722661403681_0.3586063492488176","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"usetargethandler","version":"1.2.0","keywords":["react","custom hook","form management","form state management","form validation","web development","frontend development","javascript","state management","form handling","react hook form","dynamic forms","frontend library","validation rules","conditional validation","asynchronous validation","form submission","input handling","local storage","session storage","user input validation","form error handling","responsive forms","controlled components","uncontrolled components","form"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.0","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"b8798840df96033b295efd3651b1575eeb9f67b7","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.0.tgz","fileCount":19,"integrity":"sha512-OMUyqG/zg3bQATwGRrx514z0okxilrdoMi4Mj/+/L7vs7yqD/bHrYn1xTylm5TTp0NTrkjS7fTa0DW+oS4BvBA==","signatures":[{"sig":"MEUCIE/BDdVU8SPEZzNOsEs/tmdetbEBHB41RdB2GvisO4EXAiEAr1yrVlZKZhJqNXs6q9lFf90tMnHQrtF1jHlUOAMnC1g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":51244},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"2afe641786e8d36f6ff0c48c4cd8e9b0f120d615","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.0_1722726853085_0.17422067389756135","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"usetargethandler","version":"1.2.1","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.1","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"a6f2e1b416e4bace99e8c0749b8013e3c69aa63e","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.1.tgz","fileCount":19,"integrity":"sha512-lUiYcMIO9MDjONxSAB5Ah7ev4sL68E2rDfhMRmn4ptpBE94y5nxEpPIfVxQWsml28+IxER1aVtnXxzX55cPQOA==","signatures":[{"sig":"MEQCID8alY89FlCfW+080tyPioOulHzZwcLN2JgppOsRPcGWAiBPrC5bA9YNlJZ2wk2dBVfaJVizkuOoB17sJZjcKv0RxQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":64379},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"8e0be72a18008758f7cb171300bfb8d4d2bde4a7","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"axios":"^1.7.3","react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.1_1722983483115_0.4195256953528175","host":"s3://npm-registry-packages"}},"1.2.2":{"name":"usetargethandler","version":"1.2.2","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.2","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"c52870d83e4e43528172f23e568e1ef27d86b7bf","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.2.tgz","fileCount":19,"integrity":"sha512-klScZ1aD2UXS6yMa2J09BoCaBof0QNpUjF6ooqcG4qo/Waf2m47SZjy1oZOeSvDGsE5ep8ArZtrV9bu1FKUzTg==","signatures":[{"sig":"MEUCIQDpdzvzdKsRkxvryhjoRECrf6eY3CKuRs3U7M/u5dW6DgIgOKQ79BuiwkAMH3/Yk5zW+DHnbsAWklw+Lg3YIdYKDsQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":63745},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"b622d5f2fa1cb8d75b0a07b00580f835966718f4","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"axios":"^1.7.3","react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.2_1723003166318_0.3772535790229359","host":"s3://npm-registry-packages"}},"1.2.3":{"name":"usetargethandler","version":"1.2.3","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.3","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"11ab4123126ca222c7174e2cd776a04ff44a101e","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.3.tgz","fileCount":19,"integrity":"sha512-/Ted/lDZBEr8oAQ/IKNNC11dx8maQdGaybmTDWd4XsS6WBn70l8qmLRxtr6c3XZ9/d/8Ne+b35MCtNZXhQIOrg==","signatures":[{"sig":"MEUCICrFNg4q6T0H9A2uKQqdXM7R7vfppcKp4SrVfPI/uGLqAiEAjJ5TzYUCzF1Q+dcM341TvPBPEEi7V06HQUXKEigMCPA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":65271},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"1a982bb27468cf16812c9a96d7a03c21525b788c","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"axios":"^1.7.3","react":"^18.3.1","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.3_1723165964739_0.4689213707797075","host":"s3://npm-registry-packages"}},"1.2.4":{"name":"usetargethandler","version":"1.2.4","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.4","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"fe1f3355b317495293a7b3b5044677bb8a02c427","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.4.tgz","fileCount":19,"integrity":"sha512-MbjLzuPon1FPizXg3S3yWrtTRuslZo3rCHC7vHFtjU43mLGkIyDK/eklPThpB/ndPNZkCWi2zev3REvwftDsKQ==","signatures":[{"sig":"MEUCIDup+/MK1O+muFqkj/lVHoMf6RSitEaxnYut/kVZdEXWAiEAqrLW+s5WDQd7L7HkRFDYN2O6GKQgIPtYmoH16cQWMTo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":69956},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"794df676c9cd511c13960604717b3a48a9b6b245","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.4_1723272221506_0.7773582722351315","host":"s3://npm-registry-packages"}},"1.2.5":{"name":"usetargethandler","version":"1.2.5","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.2.5","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"1b40be93dea645a6de62fa9374290b98636c5a5a","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.2.5.tgz","fileCount":19,"integrity":"sha512-EoXA6krTo4EFFAN9eYW1r3izQ2GSEr8MYvaKj7B5dzBrl7wzAjXjHLuLMj6aEGRRRCOniIDV/5MzSO4E89P0xw==","signatures":[{"sig":"MEUCIQDH41B+r/b4FHwdylLWM1g36wFOuA86/vOWRwvfHlxBQAIgFXfCO3JvpCxpIixyOaRGr7WEEUH4xt9/tZuZ6G7qcCM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70274},"main":"src/index.js","exports":{".":{"import":"./src/index.js","require":"./src/index.js"}},"gitHead":"7c81047374b964811273eca868e2125ab6096e9c","private":false,"scripts":{"test":"react-scripts test","build":"react-scripts build","eject":"react-scripts eject","start":"react-scripts start"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","web-vitals":"^2.1.4","react-scripts":"5.0.1","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.2.5_1723693572048_0.9143056822979783","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"usetargethandler","version":"1.4.0","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.4.0","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"2068cbce24f9bc9da1f1a9ccd12c94616465b044","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.0.tgz","fileCount":16,"integrity":"sha512-TMd070osZKNDUlSimUAOV3aXabilOo1TS5k2Qazfz/IlyLt9dO0Fk8yvhVfqfwdAWqopFONUvI1mHSpeLQtlzg==","signatures":[{"sig":"MEYCIQDbHzzdFFwAT2+t+QDn1dEXKpFaDRFW55mlnPN72v+5SAIhAJA+UF9zP63d/ODSUMvlPG+v7WiRDpXdEv2DyCRcpUOB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78901},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"e2d501ad92b8ceb84be2732d6d4c36bef9cf7dba","private":false,"scripts":{"test":"react-scripts test","build":"tsc --project tsconfig.build.json","clean":"rm -rf dist","eject":"react-scripts eject","start":"react-scripts start","build:demo":"react-scripts build","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"zod":"^3.23.8","dompurify":"^3.3.0","usehttprequest":"^1.0.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.1.12","axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","typescript":"^5.0.0","web-vitals":"^2.1.4","@types/node":"^20.0.0","@types/react":"^18.0.0","react-scripts":"5.0.1","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.4.0_1761021026144_0.29374808867172253","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"usetargethandler","version":"1.4.1","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.4.1","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"456e2660adb19f71bc33fc829cd10b6e6f992e5d","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.1.tgz","fileCount":16,"integrity":"sha512-AYrVMT+yFDDFuBvArAlUbY55OkcuWZep7U9oa+DpwS9Ji9fCczSfjUj6tkB2EbcMDNA5CBKrzyKPk81H5vPlOQ==","signatures":[{"sig":"MEQCID0SvHHfIeEsSLrjZzs1ngWBqxTZPZ5DCi4RlKXp6qeWAiB7u/hWNMzssTgYdfRfMkyeOTG3avmmJS4fMnXWAjj8Tg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78915},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"1e388aaf8a9ae82937818bf5c093a15a39749b28","private":false,"scripts":{"test":"react-scripts test","build":"tsc --project tsconfig.build.json","clean":"rm -rf dist","eject":"react-scripts eject","start":"react-scripts start","build:demo":"react-scripts build","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"zod":"^3.23.8","dompurify":"^3.3.0","usehttprequest":"^1.0.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.1.12","axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","typescript":"^5.0.0","web-vitals":"^2.1.4","@types/node":"^20.0.0","@types/react":"^18.0.0","react-scripts":"5.0.1","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.4.1_1761022975651_0.07399566064145846","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"usetargethandler","version":"1.4.2","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.4.2","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"7be8ec2291757ff7ea4e2786c9daf40e0668e45e","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.2.tgz","fileCount":10,"integrity":"sha512-vXYHcd9fs92Cm9Xgd7Pbis+u0Ay9NzlE5fOOE+cuIh2mU3n4zH8saskjZsUAVBRAv123D+rXtnFHrF0DrwoVFQ==","signatures":[{"sig":"MEQCIHI8zqLrYb9w0/c3wv6KBxffiY30H081SGWiPLY9kMAAAiBiMb0J6uN+0ioM5tKlH4cuVMRKF6V6ZrqEKmd4TgTQ3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65724},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"e164f075ec12caeb004fc94fb972ee7b7290bb84","private":false,"scripts":{"test":"react-scripts test","build":"tsc --project tsconfig.build.json","clean":"rm -rf dist","eject":"react-scripts eject","start":"react-scripts start","build:demo":"react-scripts build","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"zod":"^3.23.8","dompurify":"^3.3.0","usehttprequest":"^1.0.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.1.12","axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","typescript":"^5.0.0","web-vitals":"^2.1.4","@types/node":"^20.0.0","@types/react":"^18.0.0","react-scripts":"5.0.1","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.4.2_1761023654360_0.20449992675325923","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"usetargethandler","version":"1.4.3","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.4.3","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"5b50ca3bfe64252019014bdf30aa07ea84fe46d3","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.3.tgz","fileCount":12,"integrity":"sha512-7naL+x7wuUmDnP1bUUEV1ldGqQsC3dtEYPwamoiyvcCFn/FFKasAk4Znaip2eVX+lR2YnRvUoKRxxGLsVFRmgQ==","signatures":[{"sig":"MEUCIQCyBpbOBt61S/BqfOUVDHHpziKH/cCnnT69LEvWH/0q4gIgLUEktWyKRPAq8oqjNG1XOf9bX1ySYAkvdo7NE/jXXX0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67538},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"fb5173c26014193d19324e1ad638b76081796c41","private":false,"scripts":{"test":"react-scripts test","build":"tsc --project tsconfig.build.json","clean":"rm -rf dist","eject":"react-scripts eject","start":"react-scripts start","build:demo":"react-scripts build","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"zod":"^3.23.8","dompurify":"^3.3.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.1.12","axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","typescript":"^5.0.0","web-vitals":"^2.1.4","@types/node":"^20.0.0","@types/react":"^18.0.0","react-scripts":"5.0.1","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"optionalDependencies":{"usehttprequest":"^1.0.0"},"peerDependenciesMeta":{"usehttprequest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.4.3_1761025504176_0.5554933546289993","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"usetargethandler","version":"1.4.4","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"author":{"name":"GianfrancoDB"},"license":"MIT","_id":"usetargethandler@1.4.4","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"dist":{"shasum":"5dd90e5ce7104c67fbd2401199d26f147965286c","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.4.tgz","fileCount":12,"integrity":"sha512-KZJPzNVhS675oCnUhTK6yOohq3mSgUnF/REAPkhh40tjMlkSEBmHdercxbQjIWBUmUs2i3xmFd5t8JV3sx3TkA==","signatures":[{"sig":"MEQCIGpMdQmc45BGQZkCdwhaliR6lSl4r02iNRk6SagbScrqAiBfIxfpkqX59ImVXcK64KMSkNXwfb7VkQOr/0/Nck+ANw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72558},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"7456779eb1e5de410e575d611f3d67d83e1b6630","private":false,"scripts":{"test":"react-scripts test","build":"tsc --project tsconfig.build.json","clean":"rm -rf dist","eject":"react-scripts eject","start":"react-scripts start","build:demo":"react-scripts build","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"repository":{"url":"git+https://github.com/GianfrancoD/useTargetHandler.git","type":"git"},"_npmVersion":"10.8.1","description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","directories":{},"_nodeVersion":"18.20.3","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"zod":"^3.23.8","dompurify":"^3.3.0"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.1.12","axios":"^1.7.3","react":"^18.3.1","dotenv":"^16.4.5","react-dom":"^18.3.1","typescript":"^5.0.0","web-vitals":"^2.1.4","@types/node":"^20.0.0","@types/react":"^18.0.0","react-scripts":"5.0.1","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","@testing-library/jest-dom":"^5.17.0","@testing-library/user-event":"^13.5.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","usehttprequest":"^1.0.0"},"peerDependenciesMeta":{"usehttprequest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/usetargethandler_1.4.4_1761029155068_0.1717541704922012","host":"s3://npm-registry-packages-npm-production"}},"1.4.5":{"name":"usetargethandler","version":"1.4.5","private":false,"description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"repository":{"type":"git","url":"git+https://github.com/GianfrancoD/useTargetHandler.git"},"author":{"name":"GianfrancoDB"},"license":"MIT","peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","usehttprequest":"^1.0.0"},"peerDependenciesMeta":{"usehttprequest":{"optional":true}},"dependencies":{"dompurify":"^3.3.0","zod":"^3.23.8"},"devDependencies":{"@testing-library/jest-dom":"^5.17.0","@testing-library/react":"^13.4.0","@testing-library/user-event":"^13.5.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","axios":"^1.7.3","dotenv":"^16.4.5","react":"^18.3.1","react-dom":"^18.3.1","react-scripts":"5.0.1","typescript":"^5.0.0","web-vitals":"^2.1.4","zod":"^4.1.12"},"scripts":{"start":"react-scripts start","build":"tsc --project tsconfig.build.json","build:demo":"react-scripts build","test":"react-scripts test","eject":"react-scripts eject","prepublishOnly":"npm run build","clean":"rm -rf dist","type-check":"tsc --noEmit"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"_id":"usetargethandler@1.4.5","gitHead":"f7473c4195a0fd8e4045ffa842953105b3ae7160","bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","_nodeVersion":"18.20.3","_npmVersion":"10.8.1","dist":{"integrity":"sha512-j/m38LrcvPHgxSaxsoQTD0Ad7Ns0ezUue4ctTXzWJhRO8qopxzOKpsh6fhDBMaLZTlgq2ZBAaMmlPs0YflYJBA==","shasum":"8036f130a32514d8ce6f5a930479ccddb912ec9c","tarball":"https://registry.npmjs.org/usetargethandler/-/usetargethandler-1.4.5.tgz","fileCount":12,"unpackedSize":65753,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGt2YKm4lNZNFzcSE2j80aAqwvpVKFZOpDqo4CUWOtAMAiBAFjP9e8ZW9LZTr3TIU4hlUW7kJS3/d/YC3W2zmj0RRw=="}]},"_npmUser":{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"},"directories":{},"maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/usetargethandler_1.4.5_1761106005401_0.9987158626304542"},"_hasShrinkwrap":false}},"time":{"created":"2024-07-19T19:15:23.055Z","modified":"2025-10-22T04:06:45.794Z","1.0.0":"2024-07-19T19:15:23.299Z","1.0.2":"2024-07-20T19:03:47.983Z","1.0.4":"2024-07-20T19:19:12.786Z","1.0.5":"2024-07-20T20:15:39.125Z","1.0.6":"2024-07-20T20:48:51.494Z","1.0.7":"2024-07-20T21:23:35.664Z","1.0.8":"2024-07-20T21:44:18.792Z","1.0.9":"2024-07-23T00:37:56.501Z","1.0.10":"2024-07-24T04:12:08.389Z","1.0.11":"2024-07-24T17:57:38.661Z","1.0.12":"2024-07-24T18:43:28.005Z","1.0.13":"2024-07-24T23:39:25.105Z","1.0.14":"2024-07-25T00:09:50.272Z","1.0.15":"2024-07-25T02:09:38.706Z","1.0.16":"2024-07-25T03:57:13.504Z","1.0.17":"2024-07-25T04:19:01.598Z","1.0.18":"2024-07-25T04:35:40.896Z","1.0.19":"2024-07-25T05:33:37.357Z","1.0.20":"2024-07-25T05:47:20.176Z","1.0.21":"2024-07-25T05:52:12.289Z","1.0.22":"2024-07-25T06:00:07.888Z","1.0.23":"2024-07-26T00:56:27.548Z","1.0.24":"2024-07-26T01:01:12.136Z","1.0.25":"2024-07-26T01:47:00.417Z","1.0.26":"2024-07-26T04:11:19.600Z","1.0.27":"2024-07-30T03:22:18.695Z","1.1.0":"2024-08-03T05:03:23.870Z","1.2.0":"2024-08-03T23:14:13.278Z","1.2.1":"2024-08-06T22:31:23.345Z","1.2.2":"2024-08-07T03:59:26.520Z","1.2.3":"2024-08-09T01:12:44.896Z","1.2.4":"2024-08-10T06:43:41.925Z","1.2.5":"2024-08-15T03:46:12.223Z","1.4.0":"2025-10-21T04:30:26.366Z","1.4.1":"2025-10-21T05:02:55.872Z","1.4.2":"2025-10-21T05:14:14.563Z","1.4.3":"2025-10-21T05:45:04.348Z","1.4.4":"2025-10-21T06:45:55.276Z","1.4.5":"2025-10-22T04:06:45.605Z"},"bugs":{"url":"https://github.com/GianfrancoD/useTargetHandler/issues"},"author":{"name":"GianfrancoDB"},"license":"MIT","homepage":"https://github.com/GianfrancoD/useTargetHandler#readme","keywords":["react","hook","form","form state","form validation","web development","frontend","javascript","state management","form handling","react hook form","form builder","frontend library","form validation rules","conditional validation","async validation","form submission handling"],"repository":{"type":"git","url":"git+https://github.com/GianfrancoD/useTargetHandler.git"},"description":"use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.","maintainers":[{"name":"gianfrancodb","email":"gianfranco.dfiore@gmail.com"}],"readme":"![useTarget](https://github.com/user-attachments/assets/fcdef414-d99f-49ae-8370-3b288d8b6fad)\n\n<div align=\"center\">\n\n[![License](https://img.shields.io/github/license/GianfrancoD/useTargetHandler?style=for-the-badge&labelColor=000000&color=4A90E2)](https://github.com/GianfrancoD/useTargetHandler/blob/main/LICENSE)\n[![npm version](https://img.shields.io/npm/v/usetargethandler?style=for-the-badge&logo=npm&labelColor=000000&color=CB3837)](https://www.npmjs.com/package/usetargethandler)\n[![npm downloads](https://img.shields.io/npm/dt/usetargethandler?style=for-the-badge&logo=npm&labelColor=000000&color=7CB342)](https://www.npmjs.com/package/usetargethandler)\n[![Status](https://img.shields.io/badge/Status-En%20Desarrollo-10B981?style=for-the-badge&labelColor=000000)](https://github.com/GianfrancoD/useTargetHandler)\n[![GitHub release](https://img.shields.io/github/release/GianfrancoD/useTargetHandler?style=for-the-badge&labelColor=000000&color=F59E0B)](https://github.com/GianfrancoD/useTargetHandler/releases)\n[![Commits](https://img.shields.io/github/commits-since/GianfrancoD/useTargetHandler/1.2.4?style=for-the-badge&labelColor=000000&color=8B5CF6)](https://github.com/GianfrancoD/useTargetHandler/commits)\n\n</div>\n\n## Actualizaciones & Funcionalidad\n\nVer los cambios realizados en el Hook [CHANGELOG](./CHANGELOG.md)\n\n- Conoce las mejoras y cambios en la funcionalidad del Hook [FUNCTIONALITY](FUNCTIONALITY.md)\n\n---\n\n# <div align=\"center\"> UseTargetHandler </div>\n\n<div align=\"center\">\n\n### 🚀 Tecnologías Soportadas\n\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)\n![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)\n![React](https://img.shields.io/badge/React_16.8+-20232A?style=for-the-badge&logo=react&logoColor=61DAFB)\n![Zod](https://img.shields.io/badge/Zod_Included-3E67B1?style=for-the-badge&logo=zod&logoColor=white)\n\n</div>\n\n<p align=\"center\">\n  <em>Hook de React para gestión avanzada de formularios con validación, seguridad y TypeScript</em>\n</p>\n\n## 📋 Tabla de Contenidos\n\n- [Instalación](#-instalación)\n- [Inicio Rápido](#-inicio-rápido)\n- [Características](#-características)\n- [Modos de Uso](#️-modos-de-uso)\n- [Ejemplos](#-ejemplos)\n- [Validación con Zod](#-validación-con-zod)\n- [API Reference](#-api-reference)\n- [Seguridad](#-seguridad)\n- [Mejores Prácticas](#-mejores-prácticas)\n\n---\n\n## 🚀 Instalación\n\n```bash\nnpm install usetargethandler\n```\n\n### Actualizar versión\n\n```bash\nnpm update usetargethandler\n```\n\n---\n\n## ⚡ Inicio Rápido\n\n### Importación\n\n#### JavaScript\n```javascript\nimport { useTargetHandler } from \"usetargethandler\";\n```\n\n#### TypeScript\n```typescript\nimport { useTargetHandler, ValidationRules, FormValues } from \"usetargethandler\";\n```\n\n#### TypeScript con Zod\n```typescript\nimport { useTargetHandler, z } from \"usetargethandler\";\n```\n\n### Ejemplo Básico\n\n```typescript\nimport { useTargetHandler } from \"usetargethandler\";\n\nfunction LoginForm() {\n  const [target, handleTarget, handleSubmit, errors] = useTargetHandler(\n    { email: \"\", password: \"\" },\n    {\n      email: {\n        required: true,\n        pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n        patternMessage: \"Email inválido\"\n      },\n      password: {\n        required: true,\n        minLength: 6,\n        minLengthMessage: \"Mínimo 6 caracteres\"\n      }\n    }\n  );\n\n  const onSubmit = (data) => {\n    console.log(\"Formulario válido:\", data);\n  };\n\n  return (\n    <form onSubmit={handleSubmit(onSubmit)}>\n      <input\n        type=\"email\"\n        name=\"email\"\n        value={target.email}\n        onChange={handleTarget}\n        placeholder=\"Email\"\n      />\n      {errors.email && <span className=\"error\">{errors.email.message}</span>}\n\n      <input\n        type=\"password\"\n        name=\"password\"\n        value={target.password}\n        onChange={handleTarget}\n        placeholder=\"Password\"\n      />\n      {errors.password && <span className=\"error\">{errors.password.message}</span>}\n\n      <button type=\"submit\">Iniciar Sesión</button>\n    </form>\n  );\n}\n```\n\n---\n\n## ✨ Características\n\n### 🎉 TypeScript y Validación\n- **Soporte TypeScript completo (v1.4.0+)** - Tipos completos, funciona sin configuración adicional\n- **Zod integrado (v1.4.0+)** - Validación avanzada sin instalación adicional\n- **Validaciones personalizadas** - Sistema de reglas flexible y extensible\n- **Detección automática** - El hook detecta si usas Zod o ValidationRules nativas\n\n### 🔒 Seguridad\n- **Protección XSS** - Sanitización automática con DOMPurify\n- **Protección CSRF** - Token automático en solicitudes HTTP\n- **Rate Limiting** - Prevención de spam y ataques\n- **Validación de entrada** - Filtrado de datos maliciosos\n\n### 🚀 Rendimiento y UX\n- **Gestión de estado en tiempo real** - Actualización instantánea de campos\n- **Persistencia de datos** - LocalStorage o SessionStorage configurable\n- **Estados de carga** - Indicadores `isLoading` integrados\n- **Reinicialización automática** - Limpieza del formulario tras envío\n\n### 🔗 Integración HTTP\n- **useHttpRequest integrado** - Llamadas API simplificadas\n- **Sentry opcional** - Monitoreo de errores y eventos\n- **Variables de entorno** - Configuración flexible de API URL\n- **Respuestas tipadas** - Manejo de respuestas con TypeScript\n\n---\n\n## ⚙️ Modos de Uso\n\n### 1️⃣ Modo Básico (Solo Validación)\n\nPerfecto para formularios simples sin llamadas API.\n\n```typescript\nimport { useTargetHandler } from \"usetargethandler\";\n\nconst [target, handleTarget, handleSubmit, errors] = useTargetHandler(\n  { email: \"\", password: \"\" },\n  {\n    email: { required: true, pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/ },\n    password: { required: true, minLength: 6 }\n  },\n  { storageType: \"session\", storageKey: \"loginForm\" },\n  { enableCSRF: false, rateLimit: 1000 }\n);\n```\n\n### 2️⃣ Modo HTTP (Con useHttpRequest)\n\nPara formularios que necesitan comunicarse con APIs.\n\n```typescript\nimport { useTargetHandler } from \"usetargethandler\";\nimport { useHttpRequest } from \"usehttprequest\";\n\nconst [target, handleTarget, handleSubmit, errors, httpRequest] = useTargetHandler(\n  { email: \"\", password: \"\" },\n  {\n    email: { required: true, pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/ },\n    password: { required: true, minLength: 6 }\n  },\n  { storageType: \"session\", storageKey: \"loginForm\" },\n  { enableCSRF: true, rateLimit: 3000 },\n  useHttpRequest  // ← Habilita funcionalidades HTTP\n);\n\n// Acceso a funcionalidades HTTP\nconst { \n  apiCall,        // Llamadas a la API\n  apiResponse,    // Respuesta de la última llamada\n  isLoading,      // Estado de carga\n  error,          // Errores HTTP\n  SentryError,    // Logging de errores\n  SentryInfo      // Logging de información\n} = httpRequest;\n```\n\n### Variables de Entorno (Modo HTTP)\n\n```bash\n# Vite\nVITE_API_URL=https://api.ejemplo.com\n\n# Create React App\nREACT_APP_API_URL=https://api.ejemplo.com\n```\n\n> ⚠️ **Importante:** Reinicia el servidor de desarrollo después de modificar `.env`\n\n---\n\n## 📖 Ejemplos\n\n### Ejemplo 1: Formulario de Login con HTTP\n\n```typescript\nimport React from \"react\";\nimport { useTargetHandler } from \"usetargethandler\";\nimport { useHttpRequest } from \"usehttprequest\";\n\nexport function LoginForm() {\n  const [target, handleTarget, handleSubmit, errors, httpRequest] = useTargetHandler(\n    { email: \"\", password: \"\" },\n    {\n      email: {\n        required: true,\n        requiredMessage: \"Email es requerido\",\n        pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n        patternMessage: \"Email inválido\",\n      },\n      password: {\n        required: true,\n        minLength: 6,\n        minLengthMessage: \"Mínimo 6 caracteres\",\n      },\n    },\n    { storageType: \"session\", storageKey: \"loginForm\" },\n    { enableCSRF: true, rateLimit: 3000 },\n    useHttpRequest\n  );\n\n  const { apiCall, isLoading, error, apiResponse, SentryError, SentryInfo } = httpRequest;\n\n  const onSubmit = async (data: typeof initialValues) => {\n    try {\n      SentryInfo(\"Intentando login\", { email: data.email });\n      \n      await apiCall(\"POST\", \"/auth/login\", data);\n\n      if (apiResponse) {\n        localStorage.setItem(\"token\", apiResponse.token);\n        window.location.href = \"/dashboard\";\n      }\n\n      if (error) {\n        SentryError(\"Error en login\", error);\n      }\n    } catch (err) {\n      console.error(\"Error:\", err);\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit(onSubmit)}>\n      <div>\n        <label>Email</label>\n        <input\n          type=\"email\"\n          name=\"email\"\n          value={target.email}\n          onChange={handleTarget}\n        />\n        {errors.email && <span className=\"error\">{errors.email.message}</span>}\n      </div>\n\n      <div>\n        <label>Password</label>\n        <input\n          type=\"password\"\n          name=\"password\"\n          value={target.password}\n          onChange={handleTarget}\n        />\n        {errors.password && <span className=\"error\">{errors.password.message}</span>}\n      </div>\n\n      <button type=\"submit\" disabled={isLoading}>\n        {isLoading ? \"Iniciando sesión...\" : \"Iniciar Sesión\"}\n      </button>\n\n      {error && <div className=\"error\">Error: {error.message}</div>}\n    </form>\n  );\n}\n```\n\n### Ejemplo 2: Formulario Completo de Registro\n\n```typescript\nimport { useTargetHandler } from \"usetargethandler\";\n\nexport function RegisterForm() {\n  const [target, handleTarget, handleSubmit, errors] = useTargetHandler(\n    {\n      nombre: \"\",\n      email: \"\",\n      password: \"\",\n      confirmPassword: \"\",\n      age: \"\",\n      terms: false,\n      ciudad: \"\",\n    },\n    {\n      nombre: {\n        required: true,\n        requiredMessage: \"El nombre es obligatorio\",\n        pattern: /^[a-zA-Z\\s]+$/,\n        patternMessage: \"Solo letras permitidas\",\n        minLength: 2,\n        maxLength: 50,\n      },\n      email: {\n        required: true,\n        pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n        patternMessage: \"Email inválido\",\n      },\n      password: {\n        required: true,\n        minLength: 8,\n        minLengthMessage: \"Mínimo 8 caracteres\",\n      },\n      confirmPassword: {\n        required: true,\n        matches: \"password\",\n        matchMessage: \"Las contraseñas no coinciden\",\n      },\n      age: {\n        required: true,\n        min: 18,\n        max: 99,\n        requiredMessage: \"Debes ser mayor de 18 años\",\n      },\n      terms: {\n        checked: true,\n        checkedMessage: \"Debes aceptar los términos\",\n      },\n      ciudad: {\n        selected: true,\n        selectedMessage: \"Selecciona una ciudad\",\n      },\n    },\n    { storageType: \"local\", storageKey: \"registerForm\" },\n    { enableCSRF: true, rateLimit: 3000 }\n  );\n\n  const onSubmit = (data) => {\n    console.log(\"Registro exitoso:\", data);\n  };\n\n  return (\n    <form onSubmit={handleSubmit(onSubmit)}>\n      <input\n        type=\"text\"\n        name=\"nombre\"\n        value={target.nombre}\n        onChange={handleTarget}\n        placeholder=\"Nombre completo\"\n      />\n      {errors.nombre && <span>{errors.nombre.message}</span>}\n\n      <input\n        type=\"email\"\n        name=\"email\"\n        value={target.email}\n        onChange={handleTarget}\n        placeholder=\"Email\"\n      />\n      {errors.email && <span>{errors.email.message}</span>}\n\n      <input\n        type=\"password\"\n        name=\"password\"\n        value={target.password}\n        onChange={handleTarget}\n        placeholder=\"Contraseña\"\n      />\n      {errors.password && <span>{errors.password.message}</span>}\n\n      <input\n        type=\"password\"\n        name=\"confirmPassword\"\n        value={target.confirmPassword}\n        onChange={handleTarget}\n        placeholder=\"Confirmar contraseña\"\n      />\n      {errors.confirmPassword && <span>{errors.confirmPassword.message}</span>}\n\n      <input\n        type=\"number\"\n        name=\"age\"\n        value={target.age}\n        onChange={handleTarget}\n        placeholder=\"Edad\"\n      />\n      {errors.age && <span>{errors.age.message}</span>}\n\n      <select name=\"ciudad\" value={target.ciudad} onChange={handleTarget}>\n        <option value=\"\">Selecciona una ciudad</option>\n        <option value=\"madrid\">Madrid</option>\n        <option value=\"barcelona\">Barcelona</option>\n        <option value=\"valencia\">Valencia</option>\n      </select>\n      {errors.ciudad && <span>{errors.ciudad.message}</span>}\n\n      <label>\n        <input\n          type=\"checkbox\"\n          name=\"terms\"\n          checked={target.terms}\n          onChange={handleTarget}\n        />\n        Acepto los términos y condiciones\n      </label>\n      {errors.terms && <span>{errors.terms.message}</span>}\n\n      <button type=\"submit\">Registrarse</button>\n    </form>\n  );\n}\n```\n\n### Métodos HTTP - Casos de Uso Reales\n\n#### GET - Obtener Datos\n\n```typescript\n// Obtener lista de usuarios con paginación\nconst fetchUsers = async (page = 1, limit = 10) => {\n  await apiCall(\"GET\", `/users?page=${page}&limit=${limit}`);\n  if (apiResponse) {\n    console.log(\"Usuarios:\", apiResponse.data);\n    console.log(\"Total:\", apiResponse.total);\n  }\n};\n\n// Buscar usuarios con filtros\nconst searchUsers = async (searchTerm: string) => {\n  await apiCall(\"GET\", `/users/search?q=${encodeURIComponent(searchTerm)}&status=active`);\n};\n\n// Obtener detalle de un usuario específico\nconst getUserById = async (userId: string) => {\n  await apiCall(\"GET\", `/users/${userId}`);\n};\n```\n\n#### POST - Crear Recursos\n\n```typescript\n// Crear nuevo usuario con validación\nconst createUser = async (formData: typeof target) => {\n  await apiCall(\"POST\", \"/users\", {\n    name: formData.name,\n    email: formData.email,\n    role: \"user\",\n    metadata: {\n      createdAt: new Date().toISOString(),\n      source: \"web\"\n    }\n  });\n  \n  if (apiResponse) {\n    console.log(\"Usuario creado:\", apiResponse.id);\n    // Redirigir o mostrar mensaje de éxito\n  }\n};\n\n// Subir archivo con FormData\nconst uploadAvatar = async (file: File, userId: string) => {\n  const formData = new FormData();\n  formData.append(\"avatar\", file);\n  formData.append(\"userId\", userId);\n  \n  await apiCall(\"POST\", \"/upload/avatar\", formData);\n};\n\n// Login con credenciales\nconst login = async () => {\n  await apiCall(\"POST\", \"/auth/login\", {\n    email: target.email,\n    password: target.password,\n    rememberMe: true\n  });\n  \n  if (apiResponse?.token) {\n    localStorage.setItem(\"authToken\", apiResponse.token);\n    window.location.href = \"/dashboard\";\n  }\n};\n```\n\n#### PUT - Actualizar Completamente\n\n```typescript\n// Actualizar perfil completo del usuario\nconst updateUserProfile = async (userId: string) => {\n  await apiCall(\"PUT\", `/users/${userId}`, {\n    name: target.name,\n    email: target.email,\n    phone: target.phone,\n    address: {\n      street: target.street,\n      city: target.city,\n      country: target.country\n    },\n    preferences: {\n      language: \"es\",\n      notifications: true\n    }\n  });\n};\n```\n\n#### PATCH - Actualizar Parcialmente\n\n```typescript\n// Actualizar solo el email del usuario\nconst updateEmail = async (userId: string, newEmail: string) => {\n  await apiCall(\"PATCH\", `/users/${userId}`, { \n    email: newEmail \n  });\n};\n\n// Cambiar estado de un pedido\nconst updateOrderStatus = async (orderId: string, status: string) => {\n  await apiCall(\"PATCH\", `/orders/${orderId}`, { \n    status,\n    updatedAt: new Date().toISOString()\n  });\n};\n\n// Activar/desactivar usuario\nconst toggleUserStatus = async (userId: string, isActive: boolean) => {\n  await apiCall(\"PATCH\", `/users/${userId}/status`, { \n    isActive \n  });\n};\n```\n\n#### DELETE - Eliminar Recursos\n\n```typescript\n// Eliminar usuario con confirmación\nconst deleteUser = async (userId: string) => {\n  if (confirm(\"¿Estás seguro de eliminar este usuario?\")) {\n    await apiCall(\"DELETE\", `/users/${userId}`);\n    \n    if (!error) {\n      console.log(\"Usuario eliminado exitosamente\");\n      // Actualizar lista o redirigir\n    }\n  }\n};\n\n// Eliminar múltiples elementos\nconst deleteBatch = async (userIds: string[]) => {\n  await apiCall(\"DELETE\", \"/users/batch\", { \n    ids: userIds \n  });\n};\n\n// Soft delete (marcar como eliminado)\nconst softDeleteUser = async (userId: string) => {\n  await apiCall(\"PATCH\", `/users/${userId}`, { \n    deletedAt: new Date().toISOString(),\n    isDeleted: true \n  });\n};\n```\n\n#### Ejemplo Completo: Sistema de Paginación\n\n```typescript\nimport { useState, useEffect } from \"react\";\nimport { useTargetHandler } from \"usetargethandler\";\nimport { useHttpRequest } from \"usehttprequest\";\n\nexport function UsersList() {\n  const [page, setPage] = useState(1);\n  const [users, setUsers] = useState([]);\n  const [totalPages, setTotalPages] = useState(0);\n\n  const [target, handleTarget, handleSubmit, errors, httpRequest] = useTargetHandler(\n    { search: \"\" },\n    {},\n    {},\n    { enableCSRF: true, rateLimit: 2000 },\n    useHttpRequest\n  );\n\n  const { apiCall, isLoading, apiResponse } = httpRequest;\n\n  // Cargar usuarios al montar o cambiar página\n  useEffect(() => {\n    fetchUsers(page);\n  }, [page]);\n\n  const fetchUsers = async (currentPage: number) => {\n    await apiCall(\"GET\", `/users?page=${currentPage}&limit=20&sort=createdAt:desc`);\n    \n    if (apiResponse) {\n      setUsers(apiResponse.data);\n      setTotalPages(Math.ceil(apiResponse.total / 20));\n    }\n  };\n\n  // Buscar usuarios con debounce\n  const handleSearch = async (searchTerm: string) => {\n    if (searchTerm.length > 2) {\n      await apiCall(\"GET\", `/users/search?q=${encodeURIComponent(searchTerm)}`);\n      if (apiResponse) {\n        setUsers(apiResponse.data);\n      }\n    } else if (searchTerm.length === 0) {\n      fetchUsers(page);\n    }\n  };\n\n  return (\n    <div>\n      <input\n        type=\"text\"\n        name=\"search\"\n        value={target.search}\n        onChange={(e) => {\n          handleTarget(e);\n          handleSearch(e.target.value);\n        }}\n        placeholder=\"Buscar usuarios...\"\n      />\n\n      {isLoading ? (\n        <div>Cargando...</div>\n      ) : (\n        <ul>\n          {users.map((user) => (\n            <li key={user.id}>\n              {user.name} - {user.email}\n            </li>\n          ))}\n        </ul>\n      )}\n\n      <div className=\"pagination\">\n        <button \n          onClick={() => setPage(p => Math.max(1, p - 1))}\n          disabled={page === 1 || isLoading}\n        >\n          Anterior\n        </button>\n        \n        <span>Página {page} de {totalPages}</span>\n        \n        <button \n          onClick={() => setPage(p => Math.min(totalPages, p + 1))}\n          disabled={page === totalPages || isLoading}\n        >\n          Siguiente\n        </button>\n      </div>\n    </div>\n  );\n}\n```\n\n---\n\n## 🔷 Validación con Zod\n\n### Ejemplo 3: Formulario con Zod\n\nZod viene incluido en el paquete, sin instalación adicional.\n\n```typescript\nimport { useTargetHandler, z } from \"usetargethandler\";\n\n// Define el schema de validación\nconst registroSchema = z\n  .object({\n    email: z\n      .string()\n      .email(\"Email inválido\")\n      .transform((val) => val.toLowerCase()),\n    username: z\n      .string()\n      .min(3, \"Mínimo 3 caracteres\")\n      .max(20, \"Máximo 20 caracteres\")\n      .regex(/^[a-zA-Z0-9_]+$/, \"Solo letras, números y guión bajo\"),\n    password: z\n      .string()\n      .min(8, \"Mínimo 8 caracteres\")\n      .regex(/[A-Z]/, \"Debe contener una mayúscula\")\n      .regex(/[0-9]/, \"Debe contener un número\"),\n    confirmPassword: z.string(),\n    age: z.number().min(18, \"Mayor de 18 años\").max(99),\n    terms: z.boolean().refine((val) => val === true, {\n      message: \"Debes aceptar los términos\",\n    }),\n  })\n  .refine((data) => data.password === data.confirmPassword, {\n    message: \"Las contraseñas no coinciden\",\n    path: [\"confirmPassword\"],\n  });\n\n// TypeScript infiere tipos automáticamente\ntype RegistroForm = z.infer<typeof registroSchema>;\n\nexport function FormularioZod() {\n  const [target, handleTarget, handleSubmit, errors] =\n    useTargetHandler<RegistroForm>(\n      {\n        email: \"\",\n        username: \"\",\n        password: \"\",\n        confirmPassword: \"\",\n        age: 0,\n        terms: false,\n      },\n      registroSchema  // ← Detección automática de Zod\n    );\n\n  const onSubmit = async (data: RegistroForm) => {\n    console.log(\"Datos validados:\", data);\n    // data.email está en minúsculas automáticamente\n  };\n\n  return (\n    <form onSubmit={handleSubmit(onSubmit)}>\n      <input\n        type=\"email\"\n        name=\"email\"\n        value={target.email}\n        onChange={handleTarget}\n        placeholder=\"Email\"\n      />\n      {errors.email && <span>{errors.email.message}</span>}\n\n      <input\n        type=\"text\"\n        name=\"username\"\n        value={target.username}\n        onChange={handleTarget}\n        placeholder=\"Usuario\"\n      />\n      {errors.username && <span>{errors.username.message}</span>}\n\n      <input\n        type=\"password\"\n        name=\"password\"\n        value={target.password}\n        onChange={handleTarget}\n        placeholder=\"Contraseña\"\n      />\n      {errors.password && <span>{errors.password.message}</span>}\n\n      <input\n        type=\"password\"\n        name=\"confirmPassword\"\n        value={target.confirmPassword}\n        onChange={handleTarget}\n        placeholder=\"Confirmar Contraseña\"\n      />\n      {errors.confirmPassword && <span>{errors.confirmPassword.message}</span>}\n\n      <input\n        type=\"number\"\n        name=\"age\"\n        value={target.age}\n        onChange={handleTarget}\n        placeholder=\"Edad\"\n      />\n      {errors.age && <span>{errors.age.message}</span>}\n\n      <label>\n        <input\n          type=\"checkbox\"\n          name=\"terms\"\n          checked={target.terms}\n          onChange={handleTarget}\n        />\n        Acepto los términos\n      </label>\n      {errors.terms && <span>{errors.terms.message}</span>}\n\n      <button type=\"submit\">Registrarse</button>\n    </form>\n  );\n}\n```\n\n### Ventajas de Zod\n\n- ✅ **Sin instalación adicional** - Incluido en el paquete\n- ✅ **Detección automática** - El hook reconoce schemas de Zod\n- ✅ **Transformaciones** - Convierte datos automáticamente\n- ✅ **Validaciones complejas** - `.refine()` para lógica custom\n- ✅ **Inferencia de tipos** - TypeScript automático con `z.infer`\n- ✅ **Validación cross-field** - Comparar múltiples campos\n\n---\n\n## 📚 API Reference\n\n### Hook Signature\n\n```typescript\nuseTargetHandler<T>(\n  initialValues: T,\n  validationRules: ValidationRules<T> | ZodSchema<T>,\n  storageOptions?: StorageOptions,\n  securityOptions?: SecurityOptions,\n  httpHook?: typeof useHttpRequest\n): [\n  target: T,\n  handleTarget: (e: ChangeEvent<HTMLInputElement>) => void,\n  handleSubmit: (callback: (data: T) => void) => (e: FormEvent) => void,\n  errors: ValidationErrors<T>,\n  httpRequest?: HttpRequestReturn\n]\n```\n\n### Parámetros\n\n#### `initialValues: T`\nValores iniciales del formulario.\n\n```typescript\n{ email: \"\", password: \"\", age: 0 }\n```\n\n#### `validationRules: ValidationRules<T> | ZodSchema<T>`\nReglas de validación nativas o schema de Zod.\n\n**ValidationRules:**\n```typescript\n{\n  email: {\n    required: true,\n    requiredMessage: \"Email requerido\",\n    pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n    patternMessage: \"Email inválido\"\n  },\n  password: {\n    required: true,\n    minLength: 8,\n    minLengthMessage: \"Mínimo 8 caracteres\",\n    maxLength: 100\n  },\n  age: {\n    min: 18,\n    max: 99\n  },\n  terms: {\n    checked: true,\n    checkedMessage: \"Debes aceptar los términos\"\n  },\n  confirmPassword: {\n    matches: \"password\",\n    matchMessage: \"Las contraseñas no coinciden\"\n  }\n}\n```\n\n**Zod Schema:**\n```typescript\nz.object({\n  email: z.string().email(),\n  password: z.string().min(8)\n})\n```\n\n#### `storageOptions?: StorageOptions`\n```typescript\n{\n  storageType: \"local\" | \"session\" | \"none\",  // default: \"none\"\n  storageKey: string                          // default: \"formData\"\n}\n```\n\n#### `securityOptions?: SecurityOptions`\n```typescript\n{\n  enableCSRF: boolean,   // default: false\n  rateLimit: number      // milliseconds, default: 1000\n}\n```\n\n#### `httpHook?: typeof useHttpRequest`\nHook opcional para funcionalidades HTTP.\n\n### Valores de Retorno\n\n#### `target: T`\nEstado actual del formulario.\n\n#### `handleTarget: (e: ChangeEvent) => void`\nManejador de cambios para inputs.\n\n#### `handleSubmit: (callback) => (e: FormEvent) => void`\nManejador de envío del formulario con validación.\n\n#### `errors: ValidationErrors<T>`\nObjeto con errores de validación.\n\n```typescript\n{\n  email?: { message: string },\n  password?: { message: string }\n}\n```\n\n#### `httpRequest?: HttpRequestReturn`\nFuncionalidades HTTP (si se pasa `useHttpRequest`).\n\n```typescript\n{\n  apiCall: (method, endpoint, data?) => Promise<void>,\n  apiResponse: any,\n  error: Error | null,\n  isLoading: boolean,\n  userFound: boolean,\n  SentryError: (message, context) => void,\n  SentryWarning: (message, context) => void,\n  SentryInfo: (message, context) => void,\n  SentryEvent: (event, context) => void\n}\n```\n\n---\n\n## 🔒 Seguridad\n\n### Resumen de Protecciones\n\n| Amenaza           | Protección Frontend | Nivel | Requiere Backend |\n| ----------------- | ------------------- | ----- | ---------------- |\n| **XSS**           | ✅ DOMPurify        | Alto  | ⚠️ Recomendado   |\n| **CSRF**          | ⚠️ Header Token     | Medio | ✅ Obligatorio   |\n| **SQL Injection** | ❌ No protege       | N/A   | ✅ Obligatorio   |\n\n### Protección XSS\n\nEl hook usa **DOMPurify** para sanitizar inputs de tipo `text`, `email`, `tel`, `url`.\n\n**Elimina:**\n- Tags `<script>` y contenido malicioso\n- Event handlers (`onerror`, `onload`, `onclick`)\n- JavaScript protocol (`javascript:`, `data:` URIs)\n- Inyecciones SVG/XML\n\n**Campos NO sanitizados:**\n- `password`, `number`, `textarea`, `select`\n\n**Mejores Prácticas:**\n1. Sanitizar también en el backend\n2. Usar Content Security Policy (CSP)\n3. Escapar al renderizar HTML\n\n### Protección CSRF\n\nCon `enableCSRF=true`, el hook incluye automáticamente el token CSRF en headers `X-CSRF-Token`.\n\n**Requiere configuración backend:**\n\n```javascript\n// Express.js\nimport csrf from \"csurf\";\nimport cookieParser from \"cookie-parser\";\n\napp.use(cookieParser());\napp.use(csrf({\n  cookie: {\n    httpOnly: false,\n    sameSite: \"strict\",\n    secure: true\n  }\n}));\n\napp.get(\"/api/csrf-token\", (req, res) => {\n  res.cookie(\"csrfToken\", req.csrfToken());\n  res.json({ success: true });\n});\n```\n\n### SQL Injection\n\n⚠️ **El frontend NO previene SQL injection**. Debe implementarse en el backend:\n\n```javascript\n// ✅ CORRECTO - Prepared statement\ndb.query(\"SELECT * FROM users WHERE email = ?\", [email]);\n\n// ❌ VULNERABLE\ndb.query(`SELECT * FROM users WHERE email = '${email}'`);\n```\n\n**Usa:**\n- Prepared Statements\n- ORMs (Sequelize, Prisma, TypeORM)\n- Validación y escape en servidor\n\n### Checklist de Seguridad\n\n**Frontend:**\n- [x] Sanitización XSS (DOMPurify)\n- [x] Token CSRF en headers\n- [x] Rate limiting\n- [x] Validación de inputs\n\n**Backend:**\n- [ ] Validar tokens CSRF\n- [ ] Prepared statements / ORMs\n- [ ] Sanitizar inputs\n- [ ] HTTPS en producción\n- [ ] CORS configurado\n- [ ] Rate limiting en servidor\n\n### Recursos\n\n- [OWASP XSS Prevention](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html)\n- [OWASP CSRF Prevention](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html)\n- [OWASP SQL Injection Prevention](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html)\n\n---\n\n## 💡 Mejores Prácticas\n\n### Validación\n\n- ✅ Usa Zod para validaciones complejas\n- ✅ Combina validación frontend y backend\n- ✅ Mensajes de error claros y específicos\n- ✅ Valida en tiempo real para mejor UX\n\n### Seguridad\n\n- ✅ Habilita CSRF para formularios mutantes\n- ✅ Configura rate limiting apropiado\n- ✅ Sanitiza inputs en backend también\n- ✅ Usa HTTPS en producción\n\n### Rendimiento\n\n- ✅ Usa `storageType: \"session\"` para formularios temporales\n- ✅ Limpia localStorage periódicamente\n- ✅ Debounce validaciones costosas si es necesario\n\n### TypeScript\n\n- ✅ Define interfaces para tus formularios\n- ✅ Usa `z.infer` con Zod para inferencia automática\n- ✅ Tipifica callbacks de submit\n\n---\n\n## 🔗 Enlaces\n\n- **[CHANGELOG](./CHANGELOG.md)** - Historial de versiones\n- **[FUNCTIONALITY](./FUNCTIONALITY.md)** - Documentación detallada de características\n- **[TYPESCRIPT MIGRATION](./TYPESCRIPT_MIGRATION.md)** - Guía de migración a TypeScript\n- **[NPM Package](https://www.npmjs.com/package/usetargethandler)** - Ver en npm\n- **[GitHub Repository](https://github.com/GianfrancoD/useTargetHandler)** - Código fuente\n\n---\n\n## 📝 Licencia\n\nEste proyecto está licenciado bajo los términos especificados en el repositorio.\n\n## 🤝 Contribuciones\n\nLas contribuciones son bienvenidas. Por favor, consulta el repositorio para más detalles.\n\n---\n\n<div align=\"center\">\n\n**[⬆ Volver arriba](#usetargethandler)**\n\nHecho con ❤️ para la comunidad React\n\n</div>\n","readmeFilename":"README.md"}