{"_id":"@asaidimu/iam","_rev":"24-5ff38ec57b73a57ce7279ab7665f18e9","name":"@asaidimu/iam","dist-tags":{"latest":"8.2.0"},"versions":{"1.0.0":{"name":"@asaidimu/iam","version":"1.0.0","keywords":["typescript"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"b197fb2cf6d47e881139dba16ff0a200ddb8a562","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.0.tgz","fileCount":7,"integrity":"sha512-u+dUGFZ3p6onV9arK/ouQ0mqBHxGhekzRQC2VREYS7u4aazGbB40P1QrQO6lXpWOueIW+BV3fw/YKq9n+fsutw==","signatures":[{"sig":"MEQCICRVG/z1PC+iTP6hcTr+FaNsSe16V+HF7IqxSo1H+bnRAiB7QLelhPQUKr2rBx7hAYm5CSiezKCP1gSu/EmlA49Ltg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24454},"main":"index.js","types":"index.d.ts","gitHead":"8a64ea8ae1d3ac162e4581ea70e7ea20996c8c25","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.0_1736332353999_0.07906503775931362","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@asaidimu/iam","version":"1.0.1","keywords":["typescript"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"a6acff8ea85c4636038cf8c094b4dac4c3d23e11","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.1.tgz","fileCount":7,"integrity":"sha512-fCv/1YU8drCThF6KVndg+B6DOGqhG61y9VzyubMYOUvPcUPPHrJLr0hvtYihJ+9NqEEqV5C/Epk33TkiGV2noA==","signatures":[{"sig":"MEUCIQDyDDWzoyGnFH+nLKFD0iTbeOe2Ze2tRn/nzA1S1D+THQIgGWTXbT1sTHosxgFpu70ITn9VZARwabZoVOYGb2jIENw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24466},"main":"index.js","types":"index.d.ts","gitHead":"27965fdd66cbe5655a6464cbb3867f9e7ad47d47","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.1_1736336373710_0.42561737395505284","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@asaidimu/iam","version":"1.0.2","keywords":["typescript"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"1f495dfb69c0ae74ed2b9a0aafeadd01ec0cdef8","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.2.tgz","fileCount":7,"integrity":"sha512-OXMX4HuleenU2WddXUqk9ouobV36D2XnuEuSr14U9cP2LbAA2aHyU4IYLRWfse5cOx/xwpYAzej8OrZ/3/h4Ow==","signatures":[{"sig":"MEUCIB9eCCS9maL9UkM3Q5N8NX0zVur8XVkhcYqgCYLtJG8HAiEA0qEXhNwJNGWsbVMd009kBpcdhWGdPNSuDb40oYq9iOY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25897},"main":"index.js","types":"index.d.ts","gitHead":"79a8361dce5df0735486cbd2a35111d605693576","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.2_1736593396409_0.23936363385352122","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@asaidimu/iam","version":"1.0.3","keywords":["typescript"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"146e4f87c3e43e0939b81e4934390ea8a960a013","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.3.tgz","fileCount":7,"integrity":"sha512-rZrtUEkbTyqmA/RvzdWSE59OoDPRt52ax/XBYQOb8qnTSAa/eJ8dQ/mBmf1u/9GDhEHBrqm58WkN1OjwXOPRmQ==","signatures":[{"sig":"MEUCIQCsc8y8w2nAEHfFgholmaikKj5ZfrP6VTByK5I62Jn0/wIgagslGzrSSCCVydA2UOA3qfDt9QMA2W4e6jiRd8B1bPg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26822},"main":"index.js","types":"index.d.ts","gitHead":"baf634e313f4f724900dd4cfe3dbf423075faf7c","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.3_1736593850588_0.6263656142113552","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@asaidimu/iam","version":"1.0.4","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.4","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"90509d17bee4bb9ab1ac2e11c574f8e2b402fb12","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.4.tgz","fileCount":3,"integrity":"sha512-nytHKXZxxOwCUDzENv5e30YBIKi5acyEPDdWIm4DeOn39J+oHY5P/BYmmif6YutO+h6jr2yaentQdcjD+XcBlQ==","signatures":[{"sig":"MEUCIEnEd6tJlGIVFJZPhVFHcQGobzlKcXoyFnBmF1w9p2MqAiEA+ge4W/rG7pSB9Vq4Dt/hs3sC14OZmB1iN1W7iVXPZGQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19372},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","import":"./dist/*.js"}},"gitHead":"ecaf568e02dc629d9706ec2635787f9263596421","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.4_1742273878599_0.7998748574872798","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@asaidimu/iam","version":"1.0.5","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@1.0.5","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"436e1299ac5f75e12fede41078bf8f08e8b967d2","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-1.0.5.tgz","fileCount":3,"integrity":"sha512-udHYUGI7hTY/zdBhGcXAXsv+xNMB8hayrnYJO+hoyirggnRmm4jQyue0CTH12svgVQeSoBvkURdn/jUT43S5RQ==","signatures":[{"sig":"MEUCIQCmbDrZXYqry++H5dDippJ9klwX5vnjLqclAEOxu8GWhQIgQmfefv+8kiGwpG7PRuQBKNbW6OzQD66OrMB0VEA8ODE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19380},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","import":"./dist/*.js"}},"gitHead":"358a2f86f0e25ba5505d8a14b48f5de946a4d7f2","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.18.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_1.0.5_1742274337587_0.8081131376526494","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@asaidimu/iam","version":"2.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@2.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"c0f6179d224f51b2383f4ed3c97774aebf0a7049","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-2.0.0.tgz","fileCount":3,"integrity":"sha512-OhOaberpDrV4v6SxlyXoTWBve8gwfZvHJCXfX5IXWaaj/e0KQ2lLBhMjPJBNuPxqUTfZBckobrk/oX7xLvkEWg==","signatures":[{"sig":"MEUCIQDp2jkxKKkducFZ8nV+WvpFE6CjnIVOvSf2T348XnYquwIgWXn6bCzsQPqkx0Y78PrxcQVWpbOoZ+mlnamCR2UFOjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19380},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","import":"./dist/*.js"}},"gitHead":"28b78c50a06509658920342b47fa6455dcd2cf6a","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_2.0.0_1743489291195_0.1479721996854486","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@asaidimu/iam","version":"2.0.1","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@2.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"8299363a328c074e5c80ca84252c2705c7772259","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-2.0.1.tgz","fileCount":4,"integrity":"sha512-fNQ/BekLD3SghB1j1mSU+A2O3669KkcQJojiXYWSGbegIDdGrxINh47TK5PyXctjCN/XJUJ2xAP1vstu0LrAvA==","signatures":[{"sig":"MEQCIA+DVO+HEibYulk6PhOl5DDHHOHigpqWjTqXnGHyqlyxAiB9S1rDGibWTYe+ELCmL9HRD1bmkB8/XCn1qvQ2oG7GkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128377},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"60b680f62ceee4e46e8c0987f690865b5a1df116","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_2.0.1_1743490717716_0.6018070668300946","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@asaidimu/iam","version":"2.0.2","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@2.0.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"10b761e8cd21d3b3d0a82409f09692c644fe237b","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-2.0.2.tgz","fileCount":4,"integrity":"sha512-npVqB5kIyiVZt67PkqfgChMRqPOvhx8Vz1X5oTZdaOT5/QvPwRjHsV/TFcfFgWiWn/qGxbZlDAOYXBVRndxtFg==","signatures":[{"sig":"MEQCIHREA71si3iZiJ0PHukP1Cs0hH6ZL9OUGsYeIalpOECFAiA8Y3IfFoC/ILuGYLC8vijndIL+DFX+rjJ60a0RrDdFyg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132725},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"542044688922d1c7b55346584f82855e839496c6","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_2.0.2_1743491283609_0.28685823676236466","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@asaidimu/iam","version":"2.0.3","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@2.0.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"c7852c677175e59d2e591c8a111046abd4bee30a","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-2.0.3.tgz","fileCount":45,"integrity":"sha512-OSSf6RIT4SJH/FII2lsO48+l2jYvnL+/O1wSipc4vq5iMjBp7HoC+wN1mq49czly1Jx/6yzu54M/ZctoT/iAuA==","signatures":[{"sig":"MEQCIGzUMNeis39lArE8AztXA1gZolQM2fUspkpAbOqEfk4/AiAhrooosc6vS3yTWVRTfndfeZgO5Jdnon5ZYEThcvk6kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":915633},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"51cb92b054503ecdf5a2194af66873e6df3d669a","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_2.0.3_1743492021846_0.09858981413439305","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@asaidimu/iam","version":"3.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@3.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"042094b2a2ef7fc877ba1c91bf5e06710bfb9a15","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-3.0.0.tgz","fileCount":45,"integrity":"sha512-hzkEOm30+KdTlg8RlNBNnErqe0onGnqxoeyR/9MiYZBrgg0gtTzV+Xe5dg7w7HNrbYEiDvux0KdH5quHN+z6RA==","signatures":[{"sig":"MEUCIAIE7MVG1/Uf8H6L6t5594zZ4yTfKY5PJ/sZM3hsHUCcAiEAtcTLZCk7p0hpH2Mc3VdGSnMIxe2Rn+rIUoiwNddiQiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":935792},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"36eec4aa0473717ca63a815e935fa5643edb8af3","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.1","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_3.0.0_1748006281947_0.2409378725416338","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@asaidimu/iam","version":"4.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@4.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"fa571e29011381bc3fae53761101631406124bb0","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-4.0.0.tgz","fileCount":38,"integrity":"sha512-qz96gHV/4dMWPmZNZtA9sJYXH8w19avAwx8AY5VIfMfYxtB+JwuOflNnjfbi4kHRpAirYBTidtBnUHEFhOcm+Q==","signatures":[{"sig":"MEYCIQCVcL0wz7IDXOmDZIsERrFgTzlafiOeExf2FlvpGOZpsQIhAKdyQohyl1aNeKlcPmUTlf2ZhvECXnRvObFxnH3pndjA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":407973},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"163c789aff8528bced009e8b2a79a275cefa48a7","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.1","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_4.0.0_1749244325741_0.8405263278522148","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@asaidimu/iam","version":"4.1.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@4.1.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"714ff03e74e8b33da0466306ec3aa67db42e3c97","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-4.1.0.tgz","fileCount":38,"integrity":"sha512-AcCH03d4aSIXBQzi2GgFk50B6hB9V6Ev7DimVK3z/7+V5kv+3LjHYiQ0EUWflZRlcHfFpemEn/odq5UGbicTgw==","signatures":[{"sig":"MEUCIAFiPfB6GNnPPKBqeNDp/YQO85OeIGbX8OqBST7NUoCDAiEA2Ny+HiBFnhcE0HB/HQo9O9acjuDKH4TPDKIzY3eBOWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420674},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"2b9fe48be99a72cdbc04dec7a42220d0f3a1efd5","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.4","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_4.1.0_1756122569563_0.33052893514344595","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@asaidimu/iam","version":"5.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@5.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"080a62fb7d4b6ee723ec1ca7be246a18a26fcb2d","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-5.0.0.tgz","fileCount":33,"integrity":"sha512-kgMGu7t232wy+F5x09mgeOvCk+emq6RSQdx4IvDl5rSH3xTJslUhZPyAoYCvg+yp3cQlXmcO0USMaVfQbiZ9OA==","signatures":[{"sig":"MEQCIBBwVa4Kxz3EnsRXeanMLjbUN7BlnE+17QQAJ5biVDR5AiBItTsxTHuzdZuzgTBefbV9rSAQiOrDd8hFWAlu/Pyd1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":445400},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"15044debb1fd6e5cfcca530c1e15c0ce3e3d2183","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.4","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_5.0.0_1756151539115_0.4678852454145743","host":"s3://npm-registry-packages-npm-production"}},"5.1.0":{"name":"@asaidimu/iam","version":"5.1.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@5.1.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"3c5f2305ce3c6a537543443c71064e48571b7bea","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-5.1.0.tgz","fileCount":33,"integrity":"sha512-TYkCRPAuu9eRKmzqRlnfRGqb+gaAwbogDZufrgJ4kDb02S+lc9oPFn4NSM1iFKpUakfCTEExFCBaRms95KV0aA==","signatures":[{"sig":"MEUCIDEe4PsRsZSHjmTucvWe0y1e662j+S9wy9K2kG3dgju2AiEAolfKDReiAdNIa2Jofq02X/XyW94HU/CIYrBKZgDXkCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450394},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"3f2f8515f7236be2fabdd2fa1914770360ca5125","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.4","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_5.1.0_1756220150141_0.3961782925846731","host":"s3://npm-registry-packages-npm-production"}},"5.1.1":{"name":"@asaidimu/iam","version":"5.1.1","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@5.1.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"308a3e48dbb16c4e033e8f210a7022e32d42cc6d","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-5.1.1.tgz","fileCount":33,"integrity":"sha512-7fH1SAFk14ZxBTTDldp5NOCi5PY7z+l05CwclSU06B8O+LkHVIs/2RRJ81rnPA7U9lcJONuN1TTAbqV/9oDJNw==","signatures":[{"sig":"MEQCIDrGy/dTTdoi1HJ8WbKdGh5j8QZoChdzDmhKEQJWSnJkAiBIngfslUmuDyJb1bJh0RVDZ5HNqm1Pvd8VkfH3NGpptA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":388613},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"a6607c0ab0faa7d23bee05be1b7d2503af14ad02","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.4","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_5.1.1_1756221522071_0.45215659799789165","host":"s3://npm-registry-packages-npm-production"}},"5.2.0":{"name":"@asaidimu/iam","version":"5.2.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@5.2.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"6da98ffb3f3b519f6b56b83f73e2cb596961b8c1","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-5.2.0.tgz","fileCount":32,"integrity":"sha512-CxLKitYsM106EcumVTqxey0QYx7ccN/WUA0SOocaxFBOJsuZwCzmiSGfpi3A2GNZ/5Gjlb1ut6XMqjSTi4PoPw==","signatures":[{"sig":"MEYCIQCNZjhkG/N3HAUY3fhusCs4LNjiphBUiqSv4o6hweC8EAIhAPGxQa4Cupzuqxtqwi3ExTmOUQjhtrw0jxoodD0Te1KX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163450},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"4c1c493f5c0239b573867ffe927c747fb5cf45b8","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.4","dependencies":{"react":"^19.1.1","react-dom":"^19.1.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_5.2.0_1756236771549_0.0432384662075207","host":"s3://npm-registry-packages-npm-production"}},"5.3.0":{"name":"@asaidimu/iam","version":"5.3.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@5.3.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"44da3fe78415a2fcd5dbcb8e3f20a9320eba6f57","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-5.3.0.tgz","fileCount":32,"integrity":"sha512-/Gt2AWHxBPPD4639uQFdvRzfm8awDpgL2UqUDDfJ7yIw9ejG9Nhj45kSWu+5vtPmY5sVHiRu8PG1h/AWH6M43Q==","signatures":[{"sig":"MEYCIQDVkvETbwKJflkwcAJqQlICSc+ur+TA9IgkLDrlLvu0ggIhAJclj7pQBfD5U+3CranNOfFN3ygWFhSujhUQUJjPJZxs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172668},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"7ed73899c61de37a6accc92a47486afbbcd8b2bf","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_5.3.0_1762182071382_0.7142368891316111","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"@asaidimu/iam","version":"6.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@6.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"512c06f1e03fa96d6ad598bc6bdb3440caeff3a4","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-6.0.0.tgz","fileCount":32,"integrity":"sha512-YT44kDdoPCjMSiM2QxdZ2ivpD1P6ggJkHICbjzogTXsYcw7lyTmyw6VjnI4YGwESNKPmqSKSjxX452xtTlzLbw==","signatures":[{"sig":"MEQCIHdsGGuQCVhLa9CcbSGy3kv2SA7aYH7F2Wm7GovrDkFSAiAmz5HXdlTMTqY+arOPuI3+iJcGH7foMQXwC55Mcd5Y9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163037},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"7ef6a7517e1ad013d7e28e55deee9b779f92d90e","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_6.0.0_1762235380795_0.8964114342434257","host":"s3://npm-registry-packages-npm-production"}},"7.0.2":{"name":"@asaidimu/iam","version":"7.0.2","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@7.0.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"a4a5785ce4bdf3426ad01ea44d95ec667faa3293","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-7.0.2.tgz","fileCount":33,"integrity":"sha512-v3kOXRtVYLWBNjgWWhaf91Zc45Dhpy1SyrWOdmtifpDIRgbnNXa/BnR4kk/7MZvN0TYkiCjP9XM9eEk6oK1r4Q==","signatures":[{"sig":"MEUCIEWnz9QWQAYRJTqa/bO8eKKhp3Mmym5nN/KZVuxiKPxsAiEA0dq8hMlbo6zTk1e/mm3568jE499PeHQYyWJNM7uNk1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":400941},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"f9b6b6ac2424acd83ebc0be2ae7de1306b7ac41c","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.20.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_7.0.2_1770567455240_0.6468688560204827","host":"s3://npm-registry-packages-npm-production"}},"7.0.3":{"name":"@asaidimu/iam","version":"7.0.3","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@7.0.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"2a8d73fdc57ab0e841d8a8806b8fa52b71f234ea","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-7.0.3.tgz","fileCount":32,"integrity":"sha512-mhI7GGTzHQ67MiRVutY9ap3gebTMShhNjafSwLGlgTdURe946inS/OVugUg9+OK3Ymlczk2++l0cNM0Zc+ZSlw==","signatures":[{"sig":"MEQCIDwrCyON6tEO8gbwDXiRgQQgCEBVbqzhkNlxbz3q3f36AiARtmciSh556OwYvPaFGgKM84V5UIA7GBjD95ovYVBodw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162519},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"7ebd73a87c5ffe51169d65d8c1134f83b6b31311","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_7.0.3_1770568048106_0.40667828170149667","host":"s3://npm-registry-packages-npm-production"}},"8.0.0":{"name":"@asaidimu/iam","version":"8.0.0","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@8.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"f08c5fa5701a8ae05bf1d38a98118e3b8817a1db","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-8.0.0.tgz","fileCount":27,"integrity":"sha512-xsl9OV23p2sCcmSc+TuAnH1mO5dgUX8LH3688/Q2GPP9nanQJJVC5l7pYgY7YjCW1MTLhKDipbRvW6fw23pYWw==","signatures":[{"sig":"MEUCIQDFhtdjGe6Rn+iTeWOXWUpezGVGaqZZ2f7Fbn+GIVzPeAIgeYcufWm50LrjZpArXgU+Ryt4oCi1lEvCbXDiPcAMB8o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127585},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"f8efd7affad31ce93e7a8c23ca979ab99bc719e7","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.8.2","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"20.20.0","dependencies":{},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_8.0.0_1773158502334_0.03136173351322302","host":"s3://npm-registry-packages-npm-production"}},"8.1.1":{"name":"@asaidimu/iam","version":"8.1.1","keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/iam@8.1.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/iam#readme","bugs":{"url":"https://github.com/asaidimu/iam/issues"},"dist":{"shasum":"cfe4d3f03618db28fc8ae15d1122eb4f9142ff01","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-8.1.1.tgz","fileCount":56,"integrity":"sha512-7vhRdk+18BXwl9gZXtGbkZaZ2yUvfvzAhBI/Ui7MenpeaShDzdvepGuTehEIta4UId6953yz5rqbMH8w+vQDDQ==","signatures":[{"sig":"MEQCIAL5IbUL6G08/8DzPymfWxQLsbcUac2s6bZ0vUdI9AvmAiAbg4eYJHfFqRkwTL151poIgTkIKOdQIAzSeUGVGk/qsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185164},"main":"index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./*":{"types":"./*.d.ts","import":"./*.js"}},"gitHead":"0ec4f695e0437b4a0c2746bc6c1c1e1eb64457ea","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/iam.git","type":"git"},"_npmVersion":"10.9.8","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"@asaidimu/utils-store":"^10.2.14","@asaidimu/utils-artifacts":"^8.2.21","@asaidimu/utils-persistence":"^6.1.18"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/iam_8.1.1_1782480886519_0.782807534706256","host":"s3://npm-registry-packages-npm-production"}},"8.2.0":{"name":"@asaidimu/iam","version":"8.2.0","description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","main":"index.js","types":"index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./*":{"import":"./*.js","types":"./*.d.ts"}},"keywords":["typescript","roles","user","User Access Management"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/asaidimu/iam.git"},"bugs":{"url":"https://github.com/asaidimu/iam/issues"},"homepage":"https://github.com/asaidimu/iam#readme","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"latest","access":"public"},"dependencies":{"@asaidimu/utils-artifacts":"^8.2.21","@asaidimu/utils-persistence":"^6.1.18","@asaidimu/utils-store":"^10.2.14"},"_id":"@asaidimu/iam@8.2.0","gitHead":"8b32735117cb9677a32e0a6365547da966d6d596","_nodeVersion":"22.23.0","_npmVersion":"10.9.8","dist":{"integrity":"sha512-Mn8jVCzwdREGm5lvASyR9CEKZm0MxvdjGe0JFjihw3UcF7aSZze2p1gfOeu+RJb0kl0GjrbuwPB9SGE29+BfwQ==","shasum":"851806128d2b8bffb21a8a9f739e7451fad32b7e","tarball":"https://registry.npmjs.org/@asaidimu/iam/-/iam-8.2.0.tgz","fileCount":56,"unpackedSize":186896,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHSXsPwwdzs58BlHR2+tS/HXK1qPbnKLhVjhPXqhTX1zAiEAvXsz3rgKDwJkk7xLKDW2kvkiU17B/Da5OYX44TmxOqs="}]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"directories":{},"maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/iam_8.2.0_1782749094637_0.612023185772967"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-08T10:32:33.867Z","modified":"2026-06-29T16:04:54.914Z","1.0.0":"2025-01-08T10:32:34.194Z","1.0.1":"2025-01-08T11:39:34.023Z","1.0.2":"2025-01-11T11:03:16.609Z","1.0.3":"2025-01-11T11:10:50.787Z","1.0.4":"2025-03-18T04:57:58.765Z","1.0.5":"2025-03-18T05:05:37.753Z","2.0.0":"2025-04-01T06:34:51.472Z","2.0.1":"2025-04-01T06:58:37.891Z","2.0.2":"2025-04-01T07:08:03.816Z","2.0.3":"2025-04-01T07:20:22.121Z","3.0.0":"2025-05-23T13:18:02.150Z","4.0.0":"2025-06-06T21:12:05.920Z","4.1.0":"2025-08-25T11:49:29.798Z","5.0.0":"2025-08-25T19:52:19.341Z","5.1.0":"2025-08-26T14:55:50.320Z","5.1.1":"2025-08-26T15:18:42.329Z","5.2.0":"2025-08-26T19:32:51.742Z","5.3.0":"2025-11-03T15:01:11.573Z","6.0.0":"2025-11-04T05:49:40.981Z","7.0.2":"2026-02-08T16:17:35.383Z","7.0.3":"2026-02-08T16:27:28.249Z","8.0.0":"2026-03-10T16:01:42.481Z","8.1.1":"2026-06-26T13:34:46.685Z","8.2.0":"2026-06-29T16:04:54.796Z"},"bugs":{"url":"https://github.com/asaidimu/iam/issues"},"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","homepage":"https://github.com/asaidimu/iam#readme","keywords":["typescript","roles","user","User Access Management"],"repository":{"type":"git","url":"git+https://github.com/asaidimu/iam.git"},"description":"A lightweight, type-safe Identity and Access Management (IAM) system for client-side JavaScript/TypeScript applications.","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"readme":"# `@asaidimu/iam` - Identity & Access Management Toolkit\n\n![npm version](https://img.shields.io/npm/v/@asaidimu/iam?style=flat-square)\n![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)\n![Build Status](https://img.shields.io/github/actions/workflow/status/asaidimu/iam/ci.yml?branch=main&style=flat-square)\n\nA comprehensive, extensible library for building robust identity and access management (IAM) into JavaScript/TypeScript applications, featuring advanced session management and first-class React integration.\n\n---\n\n## 🚀 Quick Links\n\n*   [Overview & Features](#-overview--features)\n*   [Installation & Setup](#-installation--setup)\n*   [Usage Documentation](#-usage-documentation)\n    *   [Core Concepts](#core-concepts)\n    *   [Custom Persistence Adapter](#custom-persistence-adapter)\n    *   [Setting up an Identity Provider](#setting-up-an-identity-provider)\n    *   [Defining Access Rules](#defining-access-rules)\n    *   [Using the Access Controller (Standalone)](#using-the-access-controller-standalone)\n    *   [React Integration](#react-integration)\n*   [Project Architecture](#-project-architecture)\n*   [Development & Contributing](#-development--contributing)\n*   [Additional Information](#-additional-information)\n    *   [Troubleshooting](#troubleshooting)\n    *   [FAQ](#faq)\n    *   [Changelog](#changelog)\n    *   [License](#license)\n    *   [Acknowledgments](#acknowledgments)\n\n---\n\n## ✨ Overview & Features\n\n`@asaidimu/iam` provides a powerful and flexible foundation for managing user identities and controlling access to resources within your application. Designed with modern web applications in mind, it separates concerns into distinct, extensible modules for identity, access control, and seamless React integration. This library empowers developers to implement complex authorization logic, manage secure user sessions, and reactively update UI based on permissions, all while maintaining a high degree of type safety and performance.\n\nThis library offers the tools to define granular permissions, enforce security policies, and deliver a robust user experience. Its modular design allows you to use only the parts you need, while its React hooks and components dramatically simplify integrating IAM into your frontend.\n\n### Key Features\n\n*   **Flexible Identity Management**: `IdentityProvider` abstraction for integrating with any authentication backend (OAuth, JWT, custom API).\n*   **Robust Session Management**: Built-in session TTL, automatic refresh, and pluggable persistence (e.g., `localStorage`, `IndexedDB`).\n*   **Advanced Security Features**: Optional idle timeout, warning notifications, window blur/minimize lock, and activity tracking for high-security environments.\n*   **Rule-Based Access Control**: Define granular permissions using simple functions or complex `CompositeRule` structures with logical `AND`/`OR`/`NOT`/`XOR`/`NAND`/`NOR` operators.\n*   **High-Performance Rule Evaluation**: Memoized rule evaluator with configurable cache TTL for efficient permission checks.\n*   **Comprehensive React Integration**: Dedicated `IAMProvider`, hooks (`useIdentity`, `usePermissions`, `useCan`, `useEvaluate`), Higher-Order Components (`withPermission`), and conditional rendering components (`PermissionGate`, `RuleGate`).\n*   **Type-Safe API**: Fully written in TypeScript, providing excellent developer experience and compile-time safety.\n*   **Extensible Design**: Easily swap out persistence layers, integrate with different identity sources, and define custom rule logic.\n\n---\n\n## 📦 Installation & Setup\n\nThis library is available as an npm package.\n\n### Prerequisites\n\n*   Node.js (LTS version recommended)\n*   npm or yarn\n\n### Installation Steps\n\nInstall the package using your preferred package manager:\n\n```bash\nnpm install @asaidimu/iam\n# OR\nyarn add @asaidimu/iam\n```\n\nThe package includes TypeScript definitions by default.\n\n### Configuration\n\nThere are no global configuration files. All configurations are passed directly to the `createAuthenticator` and `createAccessController` functions, or via the `IAMProvider` component in React.\n\n### Verification\n\nYou can verify the installation by attempting to import a module in your project:\n\n```typescript\n// For TypeScript projects\nimport { createAuthenticator, createAccessController } from '@asaidimu/iam';\n\n// For JavaScript projects\nconst { createAuthenticator, createAccessController } = require('@asaidimu/iam');\n\nconsole.log('IAM Toolkit imported successfully!');\n```\n\n---\n\n## 📖 Usage Documentation\n\n### Core Concepts\n\nAt the heart of `@asaidimu/iam` are a few key abstractions:\n\n*   **`Identity`**: Represents an authenticated user, containing `permissions` (array of strings) and `properties` (generic object for user-specific data).\n*   **`IdentityProvider`**: Manages the authentication state, session lifecycle, and provides the current `Identity`. It handles login, logout, refresh, persistence, and notifies listeners of state changes.\n*   **`IAMRule`**: A function that takes an `IAMRuleContext` (containing `identity` properties and a `resource`) and returns a `boolean` indicating access.\n*   **`CompositeRule`**: Allows combining multiple `IAMRule`s or other `CompositeRule`s using logical operators (`AND`, `OR`, `NOT`, etc.).\n*   **`IAMRuleSet`**: A `Map` that associates permission names (strings) with their corresponding `IAMRule` or `CompositeRule`.\n*   **`AccessController`**: Evaluates `IAMRule`s from an `IAMRuleSet` against the current `Identity` (from an `IdentityProvider`) and a given `resource`.\n*   **`DataStorePersistence`**: An interface for plugging in various storage mechanisms to persist the identity and session state (e.g., `localStorage`, cookies, `IndexedDB`).\n\n### Custom Persistence Adapter\n\nBefore setting up your `IdentityProvider`, you might want to create a persistence adapter. This allows the IAM system to save and load the session state across browser sessions or tabs.\n\nHere's an example using `localStorage`:\n\n```typescript\nimport { DataStorePersistence, Identity } from '@asaidimu/iam';\n\n// Define the shape of your identity properties\ninterface UserProps {\n  id: string;\n  name: string;\n  roles: string[];\n}\n\n// PersistedIdentity type is internal but good to know for context\ninterface PersistedIdentity<T> extends Identity<T, string> {\n  sessionExpires?: number;\n  lastActivity?: number;\n}\n\nconst localStoragePersistence: DataStorePersistence<PersistedIdentity<UserProps>> = {\n  set(id: string, state: PersistedIdentity<UserProps>): boolean {\n    try {\n      localStorage.setItem(`iam_identity_${id}`, JSON.stringify(state));\n      return true;\n    } catch (error) {\n      console.error('Error saving identity to localStorage:', error);\n      return false;\n    }\n  },\n  get(): PersistedIdentity<UserProps> | null {\n    try {\n      const stored = localStorage.getItem(`iam_identity_identity`); // Default instanceId is 'identity'\n      return stored ? JSON.parse(stored) : null;\n    } catch (error) {\n      console.error('Error loading identity from localStorage:', error);\n      return null;\n    }\n  },\n  subscribe(id: string, callback: (state: PersistedIdentity<UserProps>) => void): () => void {\n    const handler = (event: StorageEvent) => {\n      if (event.key === `iam_identity_${id}`) {\n        const newState = event.newValue ? JSON.parse(event.newValue) : null;\n        callback(newState);\n      }\n    };\n    window.addEventListener('storage', handler);\n    return () => window.removeEventListener('storage', handler);\n  },\n  clear(): boolean {\n    try {\n      localStorage.removeItem(`iam_identity_identity`);\n      return true;\n    } catch (error) {\n      console.error('Error clearing identity from localStorage:', error);\n      return false;\n    }\n  },\n};\n```\n\n### Setting up an Identity Provider\n\nThe `createAuthenticator` function is your primary way to manage user sessions. It takes handler functions for authentication, deauthentication, and optional session/security configurations.\n\n```typescript\nimport { createAuthenticator, type IdentityProvider } from '@asaidimu/iam';\n// Assuming localStoragePersistence is defined as above\nimport { localStoragePersistence } from './persistence';\n\ninterface UserProps {\n  id: string;\n  name: string;\n  email: string;\n  roles: string[];\n}\n\n// Authentication parameters can be anything, here we use username and password\ntype AuthParams = [string, string];\n\nconst myIdentityProvider: IdentityProvider<UserProps> = createAuthenticator<UserProps, AuthParams>({\n  onAuthenticate: async (username, password) => {\n    // Simulate an API call to your backend\n    console.log(`Attempting to authenticate ${username}...`);\n    await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network delay\n\n    if (username === 'admin' && password === 'adminpass') {\n      return {\n        permissions: ['dashboard:view', 'users:manage', 'posts:create', 'posts:edit', 'posts:publish'],\n        properties: { id: 'user-123', name: 'Admin User', email: 'admin@example.com', roles: ['admin', 'editor'] },\n      };\n    } else if (username === 'editor' && password === 'editorpass') {\n        return {\n          permissions: ['dashboard:view', 'posts:create', 'posts:edit'],\n          properties: { id: 'user-456', name: 'Editor User', email: 'editor@example.com', roles: ['editor'] },\n        };\n    }\n    return null; // Authentication failed\n  },\n  onDeauthenticate: async (identityProps) => {\n    // Simulate API call to log out on the backend, clear cookies/tokens\n    console.log(`Deauthenticating user: ${identityProps.name}`);\n    await new Promise(resolve => setTimeout(resolve, 300));\n    return true;\n  },\n  onRefresh: async (currentIdentity) => {\n      // Simulate refreshing the session (e.g., using a refresh token)\n      console.log(`Refreshing session for ${currentIdentity.properties.name}...`);\n      await new Promise(resolve => setTimeout(resolve, 200));\n      // In a real app, you'd make an API call here.\n      // If successful, return updated identity, optionally including a fresh dynamic session/ttl.\n      return {\n        ...currentIdentity,\n        permissions: [...currentIdentity.permissions, 'refreshed:permission'],\n        session: { ttl: 30 * 60 * 1000 } // Optionally extend session with a new dynamic TTL\n      };\n  },\n  // Optional: Add persistence to save session across browser sessions/tabs\n  persistence: localStoragePersistence,\n  session: {\n    ttl: 60 * 60 * 1000, // Session expires in 1 hour\n    refreshInterval: 10 * 60 * 1000, // Attempt refresh 10 minutes before TTL\n  },\n  security: {\n    enabled: true,\n    maxIdleTime: 10 * 60 * 1000, // Auto-logout after 10 minutes of inactivity\n    warningTime: 30 * 1000, // Show warning 30 seconds before logout\n    lockOnWindowBlur: true, // Log out immediately if window loses focus\n    onIdleWarning: (timeRemaining) => console.warn(`Idle warning! Session expiring in ${timeRemaining / 1000}s.`),\n    onIdleTimeout: () => console.error('Session expired due to inactivity!'),\n    onSessionLocked: () => console.warn('Session locked due to window blur.'),\n    onSecurityEvent: (event, details) => console.log(`Security event: ${event}`, details),\n  },\n});\n\n// Example usage of IdentityProvider\nasync function runAuthDemo() {\n  await myIdentityProvider.authenticate('admin', 'adminpass');\n  console.log('Current identity after login:', myIdentityProvider.identity()?.properties.name);\n\n  // You can subscribe to changes\n  const unsubscribe = myIdentityProvider.onChange(identityProps => {\n    console.log('Identity changed:', identityProps ? identityProps.name : 'No user');\n  });\n\n  // Wait for a bit, simulate activity\n  await new Promise(resolve => setTimeout(resolve, 2000));\n  myIdentityProvider.resetIdleTimer?.(); // Reset idle timer if security is enabled\n\n  await myIdentityProvider.deauthenticate();\n  console.log('Current identity after logout:', myIdentityProvider.identity());\n\n  unsubscribe(); // Don't forget to unsubscribe\n  myIdentityProvider.destroy(); // Clean up listeners and timers when no longer needed\n}\n\n// runAuthDemo(); // Uncomment to run this demo in a non-React context\n```\n\n### Defining Access Rules\n\nRules are the core of your authorization logic. They can be simple functions or complex `CompositeRule` objects.\n\n```typescript\nimport { IAMRuleSet, CompositeRule, type IAMRuleContext } from '@asaidimu/iam';\n\ninterface UserProps {\n  id: string;\n  name: string;\n  email: string;\n  roles: string[];\n}\n\ninterface ResourceProps {\n  id: string;\n  ownerId: string;\n  status: 'draft' | 'published';\n  visibility: 'public' | 'private';\n}\n\nconst myAccessRules: IAMRuleSet<UserProps, ResourceProps> = new Map();\n\n// Simple rule: Only admin users can view the dashboard\nmyAccessRules.set('dashboard:view', ({ identity }) => {\n  return !!identity && identity.roles.includes('admin');\n});\n\n// Simple rule: Only admins or editors can create posts\nmyAccessRules.set('posts:create', ({ identity }) => {\n  return !!identity && (identity.roles.includes('admin') || identity.roles.includes('editor'));\n});\n\n// Rule with resource context: User can edit their own posts\nmyAccessRules.set('posts:edit', ({ identity, resource }) => {\n  if (!identity || !resource) return false;\n  return identity.id === resource.ownerId || identity.roles.includes('admin');\n});\n\n// Composite Rule: Admin can publish any post, OR editor can publish their own draft post\nmyAccessRules.set('posts:publish', {\n  operator: 'OR',\n  rules: [\n    // Condition 1: User is admin\n    ({ identity }) => !!identity && identity.roles.includes('admin'),\n    // Condition 2: User is editor AND owns the resource AND resource is a draft\n    {\n      operator: 'AND',\n      rules: [\n        ({ identity }) => !!identity && identity.roles.includes('editor'),\n        ({ identity, resource }) => !!identity && !!resource && identity.id === resource.ownerId,\n        ({ resource }) => !!resource && resource.status === 'draft',\n      ],\n    },\n  ],\n});\n\n// Another composite rule: Users can view private resources if they are admin OR owner\nmyAccessRules.set('resource:view-private', {\n    operator: 'OR',\n    rules: [\n        ({ identity }) => !!identity && identity.roles.includes('admin'),\n        ({ identity, resource }) => !!identity && !!resource && identity.id === resource.ownerId,\n    ]\n});\n```\n\n### Using the Access Controller (Standalone)\n\nYou can use the access controller directly without React if you're building a backend, a CLI, or a vanilla JavaScript application.\n\n```typescript\nimport { createAccessController } from '@asaidimu/iam';\n// Assuming myIdentityProvider and myAccessRules are defined as above\nimport { myIdentityProvider } from './identitySetup';\nimport { myAccessRules } from './accessRules';\n\n// Create an access controller instance\nconst accessController = createAccessController(myIdentityProvider, myAccessRules, {\n  defaultAllow: false, // If no rule is found for a permission, deny access by default\n  cacheTTL: 5000, // Cache rule evaluation results for 5 seconds\n});\n\n// Example resource\nconst samplePost = { id: 'post-abc', ownerId: 'user-456', status: 'draft', visibility: 'private' };\nconst anotherPost = { id: 'post-xyz', ownerId: 'user-789', status: 'published', visibility: 'public' };\n\nasync function runAccessDemo() {\n  // Simulate login\n  await myIdentityProvider.authenticate('editor', 'editorpass');\n  const currentUser = myIdentityProvider.identity();\n  console.log(`\\n--- Access checks for ${currentUser?.properties.name} ---`);\n\n  // 1. `has(permission)`: Checks if the identity's `permissions` array *contains* the permission.\n  //    Useful for simple permission checks where the rule logic is implicitly handled by the identity's granted permissions.\n  //    If a rule exists, it's evaluated, but only if the identity already `has` the permission in its list.\n  console.log('Can view dashboard (has):', accessController.has('dashboard:view')); // True (editor has this)\n  console.log('Can manage users (has):', accessController.has('users:manage')); // False (editor does NOT have this)\n\n  // 2. `is(permission)`: Checks if the *rule* for the permission evaluates to true.\n  //    Ignores the `identity.permissions` array. Useful if permissions are purely rule-based.\n  console.log('Can view dashboard (is):', accessController.is('dashboard:view')); // True (rule says editors can)\n  console.log('Can manage users (is):', accessController.is('users:manage')); // False (rule says only admins)\n\n  // 3. `can(permission, resource)`: Checks if the identity's `permissions` array *contains* the permission AND\n  //    if the rule for the permission evaluates to true, potentially with resource context.\n  //    This is often the most common method for resource-based authorization.\n  console.log('Can create posts (can):', accessController.can('posts:create')); // True (editor has permission + rule allows)\n  console.log('Can edit own post (can):', accessController.can('posts:edit', samplePost)); // True (editor owns samplePost)\n  console.log('Can edit other\\'s post (can):', accessController.can('posts:edit', anotherPost)); // False (editor doesn't own anotherPost)\n  console.log('Can publish own draft post (can):', accessController.can('posts:publish', samplePost)); // True (editor owns draft samplePost)\n  console.log('Can publish published post (can):', accessController.can('posts:publish', { ...samplePost, status: 'published' })); // False (rule requires draft)\n\n  // 4. `evaluate(rule, resource)`: Directly evaluates a custom rule or CompositeRule, bypassing the permission map.\n  //    Useful for one-off, dynamic rule evaluations not tied to a predefined permission name.\n  const customRule = ({ identity, resource }: IAMRuleContext<UserProps, ResourceProps>) =>\n    !!identity && identity.email.endsWith('@example.com') && resource?.visibility === 'public';\n  console.log('Can view public resource with custom rule:', accessController.evaluate(customRule, anotherPost)); // True\n  console.log('Can view private resource with custom rule:', accessController.evaluate(customRule, samplePost)); // False\n\n  await myIdentityProvider.deauthenticate();\n}\n\n// runAccessDemo(); // Uncomment to run this demo\n```\n\n### React Integration\n\nThe React module (`src/react.tsx`) provides an `IAMProvider` component and a suite of hooks and components for seamless integration into your React application.\n\n```tsx\n// App.tsx\nimport React, { useState, useEffect } from 'react';\nimport {\n  IAMProvider,\n  useIdentity,\n  usePermissions,\n  useCan,\n  useEvaluate,\n  PermissionGate,\n  RuleGate,\n  useAccessController,\n  useIdentityProvider,\n  useStableSetup,\n} from '@asaidimu/iam';\n\n// Assume myIdentityProvider and myAccessRules are imported from their setup files\nimport { myIdentityProvider } from './identitySetup';\nimport { myAccessRules } from './accessRules';\n\n// Define the shape of your identity and resource properties\ninterface UserProps {\n  id: string;\n  name: string;\n  email: string;\n  roles: string[];\n}\n\ninterface ResourceProps {\n  id: string;\n  ownerId: string;\n  status: 'draft' | 'published';\n  visibility: 'public' | 'private';\n}\n\nfunction App() {\n  // Use useStableSetup to ensure the setup function passed to IAMProvider is stable\n  // This prevents unnecessary re-initialization of the provider/controller.\n  const stableIAMSetup = useStableSetup(async () => {\n    // In a real app, you might fetch initial identity/rules from an API here\n    await new Promise(resolve => setTimeout(resolve, 100)); // Simulate async setup\n    return {\n      provider: myIdentityProvider,\n      rules: myAccessRules,\n    };\n  });\n\n  const customErrorComponent = (error: Error, retry: () => void) => (\n    <div style={{ color: 'red' }}>\n      <h2>Failed to load IAM</h2>\n      <p>{error.message}</p>\n      <button onClick={retry}>Try Again</button>\n    </div>\n  );\n\n  return (\n    <IAMProvider\n      setup={stableIAMSetup}\n      loadingComponent={<div style={{ padding: '20px', textAlign: 'center' }}>Loading identity and access control...</div>}\n      errorComponent={customErrorComponent}\n      onRetry={() => console.log('Retrying IAM setup...')}\n    >\n      <div style={{ fontFamily: 'Arial, sans-serif', maxWidth: '800px', margin: '20px auto', padding: '20px', border: '1px solid #eee', borderRadius: '8px', boxShadow: '0 2px 4px rgba(0,0,0,0.1)' }}>\n        <h1>IAM Demo Application</h1>\n        <AuthenticationSection />\n        <DashboardContent />\n      </div>\n    </IAMProvider>\n  );\n}\n\nfunction AuthenticationSection() {\n  const user = useIdentity<UserProps>();\n  const { authenticate, deauthenticate } = useIdentityProvider();\n  const [username, setUsername] = useState('');\n  const [password, setPassword] = useState('');\n  const [authError, setAuthError] = useState<string | null>(null);\n\n  const handleLogin = async () => {\n    setAuthError(null);\n    try {\n      const success = await authenticate(username, password);\n      if (!success) {\n        setAuthError('Invalid credentials');\n      }\n    } catch (e: any) {\n      setAuthError(e.message || 'Login failed');\n    }\n  };\n\n  if (user) {\n    return (\n      <div style={{ marginBottom: '20px', padding: '15px', border: '1px solid #ccc', borderRadius: '4px', backgroundColor: '#e8f5e9' }}>\n        <p>Logged in as: <strong>{user.name}</strong> ({user.roles.join(', ')})</p>\n        <button onClick={() => deauthenticate()}>Logout</button>\n      </div>\n    );\n  }\n\n  return (\n    <div style={{ marginBottom: '20px', padding: '15px', border: '1px solid #ccc', borderRadius: '4px', backgroundColor: '#ffe0b2' }}>\n      <h2>Login</h2>\n      <input\n        type=\"text\"\n        placeholder=\"Username (e.g., admin, editor)\"\n        value={username}\n        onChange={(e) => setUsername(e.target.value)}\n        style={{ marginRight: '10px', padding: '8px' }}\n      />\n      <input\n        type=\"password\"\n        placeholder=\"Password (e.g., adminpass, editorpass)\"\n        value={password}\n        onChange={(e) => setPassword(e.target.value)}\n        style={{ marginRight: '10px', padding: '8px' }}\n      />\n      <button onClick={handleLogin}>Login</button>\n      {authError && <p style={{ color: 'red', marginTop: '10px' }}>{authError}</p>}\n    </div>\n  );\n}\n\nfunction DashboardContent() {\n  const user = useIdentity<UserProps>(); // Get current user properties\n  const canViewDashboard = usePermissions('dashboard:view'); // Check simple permission\n  const canManageUsers = usePermissions('users:manage'); // Check another simple permission\n  const canCreatePosts = useCan('posts:create'); // Check permission (no resource needed for this rule)\n\n  // Example resource to check against\n  const myPost: ResourceProps = { id: 'post-1', ownerId: user?.id || 'unknown', status: 'draft', visibility: 'private' };\n  const othersPost: ResourceProps = { id: 'post-2', ownerId: 'some-other-id', status: 'published', visibility: 'public' };\n\n  const canEditMyPost = useCan('posts:edit', myPost); // Check permission on a specific resource\n  const canPublishMyDraftPost = useCan('posts:publish', myPost);\n  const canPublishOthersPost = useCan('posts:publish', othersPost);\n  const canViewOthersPrivatePost = useEvaluate<UserProps, ResourceProps>(\n    ({ identity, resource }) => {\n      // Custom inline rule: can view private if admin or owner\n      if (!identity || !resource) return false;\n      return resource.visibility === 'private' && (identity.roles.includes('admin') || identity.id === resource.ownerId);\n    },\n    othersPost\n  );\n\n  const { resetIdleTimer } = useIdentityProvider();\n  useEffect(() => {\n      if (user && resetIdleTimer) {\n          // Simulate user activity to reset the idle timer\n          const interval = setInterval(() => {\n              console.log('User active, resetting idle timer...');\n              resetIdleTimer();\n          }, 60 * 1000); // Reset every minute\n          return () => clearInterval(interval);\n      }\n  }, [user, resetIdleTimer]);\n\n\n  return (\n    <div style={{ borderTop: '1px solid #eee', paddingTop: '20px', marginTop: '20px' }}>\n      <h2>Application Content</h2>\n\n      <p>Current User ID: {user?.id || 'N/A'}</p>\n      <p>Can View Dashboard: <strong>{canViewDashboard ? 'Yes' : 'No'}</strong></p>\n      <p>Can Manage Users: <strong>{canManageUsers ? 'Yes' : 'No'}</strong></p>\n      <p>Can Create Posts: <strong>{canCreatePosts ? 'Yes' : 'No'}</strong></p>\n      <p>Can Edit My Post (ID: {myPost.id}): <strong>{canEditMyPost ? 'Yes' : 'No'}</strong></p>\n      <p>Can Publish My Draft Post (ID: {myPost.id}): <strong>{canPublishMyDraftPost ? 'Yes' : 'No'}</strong></p>\n      <p>Can Publish Others Post (ID: {othersPost.id}): <strong>{canPublishOthersPost ? 'Yes' : 'No'}</strong></p>\n      <p>Can View Others Private Post (Custom Rule): <strong>{canViewOthersPrivatePost ? 'Yes' : 'No'}</strong></p>\n\n      <h3>Conditional Rendering Examples</h3>\n\n      <PermissionGate permission=\"dashboard:view\" fallback={<p style={{ color: '#d32f2f' }}>Access Denied: You need 'dashboard:view' permission to see the admin section.</p>}>\n        <div style={{ border: '1px dashed #4caf50', padding: '10px', marginTop: '10px', backgroundColor: '#e8f5e9' }}>\n          <h4>Admin Dashboard Section</h4>\n          <p>This content is only visible to users with the 'dashboard:view' permission.</p>\n          {canManageUsers && <button>Manage Users</button>}\n          {!canManageUsers && <p style={{ opacity: 0.6 }}>You cannot manage users.</p>}\n        </div>\n      </PermissionGate>\n\n      <RuleGate rule={myAccessRules.get('posts:publish')!} resource={myPost} fallback={<p style={{ color: '#d32f2f' }}>Access Denied: You cannot publish this specific post.</p>}>\n        <div style={{ border: '1px dashed #2196f3', padding: '10px', marginTop: '10px', backgroundColor: '#e3f2fd' }}>\n          <h4>Publish Post Section</h4>\n          <p>This content is visible if the `posts:publish` rule passes for your specific post ({myPost.id}).</p>\n          <button>Publish My Draft Post</button>\n        </div>\n      </RuleGate>\n\n      <RuleGate\n        rule={{\n          operator: 'AND',\n          rules: [\n            ({ identity }) => !!identity && identity.roles.includes('editor'),\n            ({ resource }) => !!resource && resource.status === 'draft',\n          ],\n        }}\n        resource={myPost}\n        fallback={<p style={{ color: '#d32f2f' }}>Access Denied: You need to be an editor and the post must be a draft to see this rule-based content.</p>}\n      >\n        <div style={{ border: '1px dashed #ff9800', padding: '10px', marginTop: '10px', backgroundColor: '#fff3e0' }}>\n          <h4>Editor Draft Tools</h4>\n          <p>This content is visible only if you are an editor AND the current post (`myPost`) is a draft.</p>\n          <button>Edit Draft</button>\n        </div>\n      </RuleGate>\n\n    </div>\n  );\n}\n\nexport default App;\n```\n\n---\n\n## 🏗️ Project Architecture\n\n`@asaidimu/iam` is designed with a clear separation of concerns, making it modular, testable, and extensible.\n\n*   **Identity Module (`identity.ts`)**:\n    *   **Purpose**: Manages user authentication state, session lifecycle, and optional security features.\n    *   **Components**: `createAuthenticator` (the main factory function), `IdentityProvider` interface, `SecurityConfig`.\n    *   **Functionality**: Handles login (`onAuthenticate`), logout (`onDeauthenticate`), session refreshing (`onRefresh`), identity verification (`onVerify`), change notifications (`onChange`), persistence integration, and security features like idle timeouts, window blur locking, and activity tracking.\n\n*   **Access Module (`access.ts`)**:\n    *   **Purpose**: Provides the core logic for evaluating access rules against the current identity and resources.\n    *   **Components**: `createAccessController` (factory function), `AccessController` type, `createMemoizedEvaluator`.\n    *   **Functionality**: Offers methods like `has`, `is`, `can`, and `evaluate` for checking permissions. It utilizes memoization for performance and supports both simple and composite rule structures.\n\n*   **React Integration Module (`react.tsx`)**:\n    *   **Purpose**: Offers a user-friendly way to integrate IAM into React applications.\n    *   **Components**: `IAMProvider` (context provider), `useIdentity`, `usePermissions`, `useCan`, `useEvaluate`, `useAccessController`, `useIdentityProvider` (hooks), `PermissionGate`, `RuleGate` (components), `withPermission` (HOC).\n    *   **Functionality**: Provides a declarative way to wrap your application with IAM context, and reactive hooks/components to consume identity and access control data. Includes utilities for stable setup functions and robust loading/error handling.\n\n*   **Types & Interfaces (`types.ts`)**:\n    *   **Purpose**: Defines the foundational data structures and contracts used across all modules.\n    *   **Components**: `Identity`, `IAMRuleContext`, `IAMRule`, `IAMRuleSet`, `IAMBooleanOperator`, `CompositeRule`, `DataStorePersistence`.\n    *   **Functionality**: Ensures type safety, clarity, and consistency throughout the library, making it easier to understand, use, and extend.\n\n*   **Error Handling (`error.ts`)**:\n    *   **Purpose**: Provides a standardized custom error class for IAM-specific failures.\n    *   **Components**: `IAMError`.\n    *   **Functionality**: Allows for structured error reporting with specific codes and optional context, aiding in debugging and user feedback.\n\n**Data Flow**: The `IAMProvider` (or `createAuthenticator` directly) establishes an `IdentityProvider` which manages the current user's `Identity`. This `IdentityProvider` is then passed to `createAccessController` along with a `IAMRuleSet` to create an `AccessController`. In React applications, the `IAMContext` makes both the `IdentityProvider` and `AccessController` available to child components via hooks like `useIdentity` and `usePermissions`, which react to changes in the identity provider's state.\n\n**Extension Points**:\n*   **Custom `IdentityProvider` Logic**: Override `onAuthenticate`, `onDeauthenticate`, `onRefresh`, `onVerify`, `onAuthChange` callbacks in `createAuthenticator`.\n*   **Custom `DataStorePersistence`**: Implement the `DataStorePersistence` interface to integrate with any storage mechanism (e.g., cookies, server-side sessions, custom browser storage).\n*   **Custom `IAMRule`s**: Define any arbitrary function logic for your authorization rules, including asynchronous checks if needed (though `IAMRule` is synchronous by default; for async, you'd typically pre-fetch data or use another mechanism).\n*   **Security Event Handlers**: Hook into `onIdleWarning`, `onIdleTimeout`, `onSessionLocked`, `onWindowBlur`, `onSecurityEvent` for custom notifications or actions in response to security events.\n\n---\n\n## 🛠️ Development & Contributing\n\nContributions are welcome! If you'd like to contribute, please follow these guidelines.\n\n### Development Setup\n\n1.  **Clone the repository**:\n    ```bash\n    git clone https://github.com/asaidimu/iam.git # Replace with actual repo URL\n    cd iam\n    ```\n2.  **Install dependencies**:\n    ```bash\n    npm install\n    # OR\n    yarn install\n    ```\n3.  **Build the project**:\n    ```bash\n    npm run build\n    ```\n\n### Scripts\n\n*   `npm run build`: Compiles the TypeScript source code into JavaScript.\n*   `npm test`: Runs the test suite (e.g., Jest).\n*   `npm run lint`: Lints the codebase (e.g., ESLint).\n*   `npm run format`: Formats the codebase (e.g., Prettier).\n\n### Testing\n\nTests are crucial for maintaining the quality and stability of the library.\n*   To run all tests: `npm test`\n*   Ensure high test coverage for any new features or bug fixes.\n\n### Contributing Guidelines\n\n1.  **Fork** the repository.\n2.  **Create a new branch** for your feature or bug fix: `git checkout -b feature/your-feature-name` or `git checkout -b bugfix/issue-description`.\n3.  **Make your changes**, ensuring they adhere to the project's coding standards (linting and formatting checks).\n4.  **Write tests** for your changes.\n5.  **Ensure all tests pass**: `npm test`.\n6.  **Commit your changes** with clear and descriptive commit messages.\n7.  **Push your branch** to your forked repository.\n8.  **Open a Pull Request** against the `main` branch of the original repository.\n    *   Provide a clear description of your changes.\n    *   Reference any related issues.\n\n### Issue Reporting\n\nIf you find a bug or have a feature request, please open an issue on the [GitHub Issues page](https://github.com/asaidimu/iam/issues).\n\n---\n\n## 📚 Additional Information\n\n### Troubleshooting\n\n*   **`useIAMContext must be used within an IAMProvider`**:\n    *   **Cause**: You are attempting to use one of the IAM React hooks (e.g., `useIdentity`, `usePermissions`) outside of an `IAMProvider` component's tree.\n    *   **Solution**: Ensure that the component where you're using the hook is a child of `IAMProvider`. Typically, you'd wrap your entire application or the relevant part with `<IAMProvider />`.\n\n*   **Permissions or Identity not updating in React components**:\n    *   **Cause**: The `IdentityProvider`'s `onChange` mechanism might not be properly implemented or the component isn't reacting correctly. Ensure your `createAuthenticator` setup correctly calls `notifyListeners()` when the identity state changes.\n    *   **Solution**: Verify your `IdentityProvider`'s `onChange` callback is correctly subscribed and publishing updates. Check if your `onAuthenticate`, `onDeauthenticate`, `onRefresh` functions are correctly calling `updateIdentity`.\n\n*   **`createAuthenticator` options not working as expected (e.g., persistence not saving)**:\n    *   **Cause**: Incorrect implementation of the `DataStorePersistence` adapter or issues with the chosen storage mechanism.\n    *   **Solution**: Double-check your `DataStorePersistence` implementation (especially `set` and `get` methods). Ensure `instanceId` is consistent if you have multiple IAM instances. For `localStorage`, ensure browser storage isn't blocked or full.\n\n*   **Rules are not evaluated or always return `defaultAllow`**:\n    *   **Cause**: The permission string passed to `accessController.has()`, `is()`, or `can()` does not match any key in your `IAMRuleSet`.\n    *   **Solution**: Ensure the permission string precisely matches a key in the `Map` you passed to `createAccessController`.\n\n### FAQ\n\n*   **Why do I need `useStableSetup` for `IAMProvider`?**\n    The `IAMProvider` takes a `setup` function that returns a Promise. If this `setup` function is recreated on every render (which happens if it's defined directly inside your functional component), React might continuously re-run the setup process. `useStableSetup` memoizes this function, ensuring it remains the same across renders unless its dependencies explicitly change, preventing unnecessary re-initializations of your `IdentityProvider` and `AccessController`.\n\n*   **Can I implement my own `IdentityProvider` from scratch?**\n    Yes! The `IdentityProvider` is an interface. While `createAuthenticator` provides a robust, pre-built solution with many features, you can implement the `IdentityProvider` interface yourself if you have highly custom needs that `createAuthenticator` cannot accommodate.\n\n*   **How do `has`, `is`, and `can` differ?**\n    *   `has(permission)`: Checks if the identity's `permissions` array *includes* the given permission string. If a rule exists for this permission, it will also be evaluated, but `has` implies an *explicit* permission granted to the identity.\n    *   `is(permission)`: Evaluates the *rule* associated with the given permission string, completely ignoring the `identity.permissions` array. This is for purely rule-based authorization.\n    *   `can(permission, resource)`: This is the most common for resource-based checks. It acts like `has` (requires the permission in `identity.permissions`) *and* evaluates the associated rule, providing the `resource` context to the rule.\n\n*   **How can I handle Server-Side Rendering (SSR) with `@asaidimu/iam`?**\n    The React hooks utilize `useSyncExternalStore` which supports SSR by providing a `getServerSnapshot` function. By default, `useIdentity`, `usePermissions`, etc., will return `null` (or `false`) on the server, as a real authenticated identity typically doesn't exist in that context unless explicitly hydrated. You would need to hydrate the `IdentityProvider` state on the server (e.g., from request headers/cookies) before passing it to `IAMProvider` or `createAccessController`.\n\n### Changelog\n\n*   See [CHANGELOG.md](CHANGELOG.md) for a history of changes. (Placeholder - create this file in your project)\n\n### License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. (Placeholder - create this file in your project)\n\n### Acknowledgments\n\n*   Inspired by robust authentication and authorization patterns found in various frameworks and libraries.\n*   Built with TypeScript and React.\n","readmeFilename":"README.md"}