{"_id":"@astral/permissions","_rev":"14-d48100e72d06a7d0275ae78286ee4bad","name":"@astral/permissions","dist-tags":{"latest":"1.4.2"},"versions":{"0.1.0":{"name":"@astral/permissions","version":"0.1.0","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@0.1.0","maintainers":[{"name":"astral_frontend","email":"frontendastral@gmail.com"},{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"perevezencev","email":"perevezenzev@gmail.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"6e7e1eda33045a75e779d3f98e7661d21ac865ca","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-0.1.0.tgz","fileCount":7,"integrity":"sha512-1qvohTPST7dAKCYZ6dglkXWMmIfj6tntKGWn+WDIVCOBS+31paSchsNL5KVN8aQnzqk+1eBNcC3bEiUWQjW0KQ==","signatures":[{"sig":"MEUCIFK8fLAcnj7371ziOSMkCMbezsKeI+A1CyHdCvlnmlmHAiEA3VW00T6jJ3UWsboSkp4nHOftQINWteHNAFExgezUinw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1923},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"94d41ad740d1082eea3fe84884775ee406b30570","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.1.0","description":"","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_0.1.0_1716375890154_0.8700044653657921","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@astral/permissions","version":"1.0.0","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.0.0","maintainers":[{"name":"astral_frontend","email":"frontendastral@gmail.com"},{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"perevezencev","email":"perevezenzev@gmail.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"e57208bfe73243000391be345947bb4d737e2a73","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.0.0.tgz","fileCount":63,"integrity":"sha512-frq7hgnGsT5KVPNLWUlDUlu2Du0B0XYkzA+KjkuggaIh4c3x7u2pA2gK7NtTgTE7h6DkGwY8ZaKW5y7kuyoqGw==","signatures":[{"sig":"MEYCIQDYwWzT6bCNYkv4e7QzJ5weSt91S2aYP4ctscvn1RZ87wIhAI5GwZIKYxArgTbnF8Yx+6UnQp5cqTwJ2OYWdsbeFynN","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53693},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"ac5fdc70b90b351ff4e9ece77df5f267824442b3","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.5.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.13.1","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.0.0_1716444692249_0.6517696278475054","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@astral/permissions","version":"1.1.0","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.1.0","maintainers":[{"name":"astral_frontend","email":"frontendastral@gmail.com"},{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"perevezencev","email":"perevezenzev@gmail.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"973494078d9b10814094d4052a17f007609e5e75","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.1.0.tgz","fileCount":63,"integrity":"sha512-QjyEa2X/Z2kn+uY+BqrDA5x96HZLkcfjob4NGv9/mRtfuou7k7H1JVq5Bp+dyAbJ0C+hAmof7oIozq7Sq8rz/A==","signatures":[{"sig":"MEYCIQCRMefhzwEa2He6hEFyXaJ2MmgnuPb7Kug/zKh1l7vtHAIhALvnvORG+yVQxrlzd3xIn3wiQDXlOB1DFE7HDRiSRUwZ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54027},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"a2e7cd361e092ffc09c42755604b6c828dd4a6b0","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.5.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.13.1","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.1.0_1716453668779_0.7789248939036746","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@astral/permissions","version":"1.2.0","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.2.0","maintainers":[{"name":"astral_frontend","email":"frontendastral@gmail.com"},{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"perevezencev","email":"perevezenzev@gmail.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"c4ddbb9e21ebdf9001b847deee28c25577d7b631","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.2.0.tgz","fileCount":63,"integrity":"sha512-JkNEp0MJusIv/gWwwxWKpxZDXkV1o6HadjFQ/1gqKM6jqfuT0mdjtCHeCFFn2sqJLEU/2oCXmahEIZ5SZtOHBw==","signatures":[{"sig":"MEYCIQDojpuFMyC9RVllJxqKUnaLyetsQTXdtnsEh5eZSPWUUwIhAO3Sos89G8HBsB8PPsqFW0Y2cI9Y/zw/LoDf7fNgAgPJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54534},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"e8b03813c1c0837969945056eee67d2c580a584a","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.5.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.13.1","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.2.0_1716461125577_0.939825210520314","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@astral/permissions","version":"1.3.0","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.0","homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"0edc11db5956a3cc35149ec8636143f4556276a6","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.0.tgz","fileCount":63,"integrity":"sha512-1G3F6hIbyRwhLSfoJ677JvDZlHXC0NzoCNBMnxKVnjxLwyfexDuWgPEaw310zT+zTLbi2jyejJcmigr+SEdy2Q==","signatures":[{"sig":"MEQCICz0Q8OwtmwQlj6v3z8UMK72POUqOq8v1oNYSQoWXmsZAiB+zq9mmoJFexxuCU6+qJayucPydegUNtBGgjMv8SxOug==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":56116},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"74e70eac0b33a524e090cf4c945aaa60ab62b48f","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.7.0","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.14.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.0_1718894099994_0.757606929587828","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"@astral/permissions","version":"1.3.1","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.1","homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"32228757bc922f0d7d528989d049ffd45ee4642d","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.1.tgz","fileCount":63,"integrity":"sha512-Zcuj8rmxTKqHeT1n1xx9DXFl9Ts7bcr8N0BxrL8j4CgraAg/WQq+optBMrJy55t3OdjbkU7uNRkKi9jlGODipQ==","signatures":[{"sig":"MEUCIQDCdD8tkorEEEOyrw211t9iTTN6bcq0tD7OAyxqbQBMDAIgHuFYPx4P+PL8ACg2WcnkEiqJzn2JIS13lt1l7SI71k8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":56170},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"c63c9d2f47cb3cbce1782fb03cf7347f61fe79c9","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.7.0","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.14.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.1_1719391046657_0.8762672603089328","host":"s3://npm-registry-packages"}},"1.3.2":{"name":"@astral/permissions","version":"1.3.2","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.2","maintainers":[{"name":"astral_frontend","email":"frontendastral@gmail.com"},{"name":"and_tem","email":"ipad_nw@icloud.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"1876486c15fa1b39911b1e83b7dc7d55c49a1f33","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.2.tgz","fileCount":63,"integrity":"sha512-E32aPG+aF5DtzE2Tw/x3h7R79TyRu2qCM7Hs+rclV7rxfcESeoUVrviOo0TgQFBFs87wFmN4DeV1uh8G2O0CBw==","signatures":[{"sig":"MEQCIGpVmDbH1Lrncnf29hLyNkT/Cmgv/2mHnZgvw0znQNQfAiAqZlljob66iIkSGigR+Chul+RWLCPU4t5DsRbGQ5FNiQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":56314},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"module":"./index.js","vitest":"./node/index.js","require":"./node/index.js"}},"gitHead":"3a6b514af7c7eabb992c3a7c3066754f1a643430","_npmUser":{"name":"and_tem","email":"ipad_nw@icloud.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.7.0","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"20.15.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.2_1720445684405_0.907875001519038","host":"s3://npm-registry-packages"}},"1.3.3":{"name":"@astral/permissions","version":"1.3.3","keywords":[],"author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.3","maintainers":[{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"homepage":"https://github.com/kaluga-astral/permissions#readme","bugs":{"url":"https://github.com/kaluga-astral/permissions/issues"},"dist":{"shasum":"eb36441975488aa1db30a3849319cecb87f8e1cc","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.3.tgz","fileCount":63,"integrity":"sha512-5g8HrjGYdARjcd9wt5O7lNjIeViwZL1wlvnNXTl31caS3aQUL39Y+XF4rpRQWifXmau8q3a1YH5TNFQwWAJtSw==","signatures":[{"sig":"MEQCIBkKThBhxlQQYN6yZ5JaTskb2x5IHjLNddRXmQk6NQfxAiAec3TLfEiYmQgdu7D+yJmuveyH2T/MWRt2Y26LEcxh2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56310},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"types":"./index.d.ts","module":"./index.js","require":"./node/index.js"}},"gitHead":"ea7668952d2a8b7718d1a1cfd682f9a354a525d7","_npmUser":{"name":"astral_frontend","email":"frontendastral@gmail.com"},"repository":{"url":"git+https://github.com/kaluga-astral/permissions.git","type":"git"},"_npmVersion":"10.9.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"mobx":"6.x.x"},"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.3_1741345378981_0.024738875565172957","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@astral/permissions","version":"1.3.4","author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.4","maintainers":[{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"dist":{"shasum":"edaca277c0cfa8b0c9155468cbc923c469f310e2","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.4.tgz","fileCount":63,"integrity":"sha512-h75JiwR1FPxVCG6DpAJVrVR/2y+InsEauN1/VFP1xhV+/lC0+emREeqSsGQ1R5uuyKaSa4OfCoWtHpLqkl3s/w==","signatures":[{"sig":"MEUCIQC4v4nsicyyy33XgU3RJxHbwRLA7mXEVkm+pjFlzBkxQAIgIzauUDfn7V80BxnTRp3lwo1Dk+aCWbPLmdnA0871qSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56145},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"types":"./index.d.ts","module":"./index.js","require":"./node/index.js"}},"gitHead":"ffaa1bb1ec29a8aff085816f5378311f700a04e2","_npmUser":{"name":"astral_frontend","email":"frontendastral@gmail.com"},"repository":{"url":"https://git.astralnalog.ru/frontend.shared/permissions","type":"git"},"_npmVersion":"10.9.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.4_1748356758640_0.7583077038087402","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@astral/permissions","version":"1.3.5","author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.3.5","maintainers":[{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"dist":{"shasum":"0cf01bbcc801cdec9da529766e73cd1a093a213d","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.3.5.tgz","fileCount":63,"integrity":"sha512-vTp58ugLaixmEoXbvPyjmt+ERt79V7S/1Nb1v3WXPiKDmcXljpGDAz7hdd1Hq6MFusstdfcaYbsSiv5XesO1dQ==","signatures":[{"sig":"MEYCIQCXwHBYSXW9ruCKhuFXfQMqLo6iZ1yy3qOLh9UU4H3u/gIhAJxOU6ahNex55humSYlcE+eJaADSa/XF3btj52MipHJQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56641},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"types":"./index.d.ts","module":"./index.js","require":"./node/index.js"}},"gitHead":"6ca020e9a3d33016790e484b05946cd9cb3ed739","_npmUser":{"name":"astral_frontend","actor":{"name":"astral_frontend","type":"user","email":"frontendastral@gmail.com"},"email":"frontendastral@gmail.com"},"repository":{"url":"https://git.astralnalog.ru/frontend.shared/permissions","type":"git"},"_npmVersion":"10.9.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/permissions_1.3.5_1751008710798_0.34182471942020154","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@astral/permissions","version":"1.4.0","author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.4.0","maintainers":[{"name":"and_tem","email":"ipad_nw@icloud.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"dist":{"shasum":"dfe167710a09bbcb4329fecd5fe48f28d7183748","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.4.0.tgz","fileCount":63,"integrity":"sha512-R7AR+9v6lVibkGfM7H9PPGlCZkOusKpAB6TKWJ6QQXQ0L4VTN/sW875YxZOI3rUJ9AlITY0SPqiFF50/phq9+A==","signatures":[{"sig":"MEQCIEfCAkSuDGyHj721/liFD+6gts4wPKSOe2TREd6ZBbqBAiAMvT0VumUJ5QkhXSxS8pA17WA8rRCHRbCX3ekypaWNCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56702},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"types":"./index.d.ts","import":"./index.js","module":"./index.js","default":"./index.js","require":"./node/index.js"}},"gitHead":"cd070c2daf4b130c783209c19e842f0fdee21f0b","_npmUser":{"name":"astral_frontend","email":"frontendastral@gmail.com"},"repository":{"url":"https://git.astralnalog.ru/frontend.shared/permissions","type":"git"},"_npmVersion":"10.9.2","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/permissions_1.4.0_1753369111019_0.16273029005894557","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@astral/permissions","version":"1.4.1","author":{"name":"Astral.Soft"},"license":"MIT","_id":"@astral/permissions@1.4.1","maintainers":[{"name":"and_tem","email":"and.tem.dev@gmail.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"dist":{"shasum":"acc50ec7d88697dfc6c80d505867b4036e54fd7a","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.4.1.tgz","fileCount":63,"integrity":"sha512-v7L+X29jj7BIOuFFjwtDu2Df5ERnDtTI58LzSrEoMpnX5SEcFuCAs/0z6k+pDdTWHhCKziPpNtsY5OZNqo3xXA==","signatures":[{"sig":"MEYCIQDPcU5hUe9fHyJecid4yt4HpHVgrbjcS9A9N1zHpYvjlgIhAMXku58dW8XkdYF6oYNI39uTSJ6TOpkYDd2K9fE6xe6u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58319},"main":"./node/index.js","types":"./index.d.ts","module":"./index.js","browser":"./index.js","exports":{".":{"types":"./index.d.ts","import":"./index.js","module":"./index.js","default":"./index.js","require":"./node/index.js"}},"gitHead":"252336ebb52b433fc1cfd36987b20001a75180f7","_npmUser":{"name":"astral_frontend","email":"frontendastral@gmail.com"},"repository":{"url":"https://git.astralnalog.ru/frontend.shared/permissions","type":"git"},"workspaces":["./example"],"_npmVersion":"10.9.4","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/permissions_1.4.1_1762757494972_0.5576751744146589","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@astral/permissions","main":"./node/index.js","workspaces":["./example"],"version":"1.4.2","author":{"name":"Astral.Soft"},"license":"MIT","repository":{"type":"git","url":"https://git.astralnalog.ru/frontend.shared/permissions"},"types":"./index.d.ts","module":"./index.js","browser":"./index.js","sideEffects":false,"exports":{".":{"node":"./node/index.js","module":"./index.js","require":"./node/index.js","types":"./index.d.ts","default":"./index.js","import":"./index.js"}},"_id":"@astral/permissions@1.4.2","gitHead":"97b068c95fc9654450c6e6d6b46a1d36a5bf64ac","description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-PagkLynZIHqPseAEILZS5nQCcRNpV5k4Lr0A4lh77UOgwvatVukHCF2obnw5jmqqqrMpWK7BSsKzt+pOniAAWQ==","shasum":"9c5f93ef0651317a6cd979058e649d220e82c9e2","tarball":"https://registry.npmjs.org/@astral/permissions/-/permissions-1.4.2.tgz","fileCount":63,"unpackedSize":58353,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCvTHfT2eSDw1xYrHO52W5d29iZmzsOKom9fveZl+PwkQIhAPCCgxLf+5jBqo6nNsp0G1TCGUGsi5JUSU+xQDTxj95r"}]},"_npmUser":{"name":"astral_frontend","email":"frontendastral@gmail.com"},"directories":{},"maintainers":[{"name":"and_tem","email":"and.tem.dev@gmail.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permissions_1.4.2_1778222623498_0.6206825636729294"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-22T11:04:50.045Z","modified":"2026-05-08T06:43:43.825Z","0.1.0":"2024-05-22T11:04:50.311Z","1.0.0":"2024-05-23T06:11:32.468Z","1.1.0":"2024-05-23T08:41:08.928Z","1.2.0":"2024-05-23T10:45:25.711Z","1.3.0":"2024-06-20T14:35:00.185Z","1.3.1":"2024-06-26T08:37:26.825Z","1.3.2":"2024-07-08T13:34:44.640Z","1.3.3":"2025-03-07T11:02:59.157Z","1.3.4":"2025-05-27T14:39:18.847Z","1.3.5":"2025-06-27T07:18:30.979Z","1.4.0":"2025-07-24T14:58:31.206Z","1.4.1":"2025-11-10T06:51:35.158Z","1.4.2":"2026-05-08T06:43:43.664Z"},"author":{"name":"Astral.Soft"},"license":"MIT","repository":{"type":"git","url":"https://git.astralnalog.ru/frontend.shared/permissions"},"description":"Пакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%","maintainers":[{"name":"and_tem","email":"and.tem.dev@gmail.com"},{"name":"astral_frontend","email":"frontendastral@gmail.com"}],"readme":"# @astral/permissions\n\nПакет содержит функционал, необходимый для реализации [единого паттерна разграничения доступов на клиенте](https://kaluga-astral.github.io/guides/docs/category/%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%B2-permissions).\n\nПакет предоставляет функции:\n- Создание policies\n- Централизованная подготовка данных для формирования доступов\n- Создание permissions\n  - Обработка разных причин отказа\n- Создание rules\n- Debug режим для логирования причин отклоненных доступов\n\n## Содержание\n\n<!-- cSpell:disable -->\n- [PolicyManagerStore](#policymanagerstore)\n  - [Инициализация](#инициализация)\n- [`PolicyManagerStore.createPolicy`](#policymanagerstorecreatepolicy)\n  - [Создание policy без подготовки данных](#создание-policy-без-подготовки-данных)\n- [Создание permissions](#создание-permissions)\n- [Причины отказа в доступе](#причины-отказа-в-доступе)\n  - [Системные причины отказа в доступе](#системные-причины-отказа-в-доступе)\n- [Обработка причин отказа в доступе](#обработка-причин-отказа-в-доступе)\n- [Подготовка данных для формирования доступов](#подготовка-данных-для-формирования-доступов)\n- [Создание rules](#создание-rules)\n- [Debug режим](#debug-режим)\n- [Пример реализации доступов в приложении](#пример-реализации-доступов-в-приложении)\n<!-- cSpell:enable -->\n\n## PolicyManagerStore\n\n`PolicyManagerStore` отвечает за:\n- Создание policy\n- Централизованную подготовку данных для формирования доступов\n\n### Инициализация\n\n`PolicyManagerStore` должен являться singletone и создаваться в единой точке доступа к доступам:\n\n```ts\n/**\n * Содержит все доступы приложения\n */\nexport class PermissionsStore {\n  private readonly policyManager: PolicyManagerStore;\n\n  public readonly administration: AdministrationPolicyStore;\n\n  constructor(billingRepo: BillingRepository, userRepo: UserRepository) {\n    makeAutoObservable(this, {}, { autoBind: true });\n    \n    this.policyManager = createPolicyManagerStore();\n\n    this.administration = createAdministrationPolicyStore(\n      this.policyManager,\n      userRepo,\n    );\n  }\n}\n```\n\n## `PolicyManagerStore.createPolicy`\n\n`PolicyManagerStore.createPolicy` предназначен для создания policies.\n\nПример создания policy:\n\n```ts\nimport { makeAutoObservable } from 'mobx';\n\nimport type { UserRepository } from '@example/data';\n\nimport { PermissionDenialReason } from '../../../../enums';\n\nimport { PolicyManagerStore, Policy } from '@astral/permissions';\n\nexport class AdministrationPolicyStore {\n  private readonly policy: Policy;\n\n  constructor(\n    private readonly policyManager: PolicyManagerStore,\n    private readonly userRepo: UserRepository,\n  ) {\n    makeAutoObservable(this, {}, { autoBind: true });\n\n    this.policy = this.policyManager.createPolicy({\n      name: 'administration',\n      // Метод для подготовки данных необходимых для формирования доступов AdministrationPolicy\n      prepareData: async (): Promise<void> => {\n        await Promise.all([this.userRepo.getRolesQuery().async()]);\n      },\n    });\n  }\n}\n```\n\n### Создание policy без подготовки данных\n\nЕсли в создаваемом policy нет permissions, для которых необходимо подготовить данные, то используется флаг `withoutDataPreparation`:\n```ts\nimport { makeAutoObservable } from 'mobx';\n\nimport type { UserRepository } from '@example/data';\n\nimport { PermissionDenialReason } from '../../../../enums';\n\nimport { PolicyManagerStore, Policy } from '@astral/permissions';\n\nexport class AdministrationPolicyStore {\n  private readonly policy: Policy;\n\n  constructor(\n    private readonly policyManager: PolicyManagerStore,\n    private readonly userRepo: UserRepository,\n  ) {\n    makeAutoObservable(this, {}, { autoBind: true });\n\n    this.policy = this.policyManager.createPolicy({\n      name: 'administration',\n      withoutDataPreparation: true,\n    });\n  }\n\n  public calcOrgManagement = (org: Organization) =>\n    this.policy.createPermission((allow, deny) => {\n      if (!org.permissions.includes('admin')) {\n        return deny(PermissionDenialReason.NoAdmin);\n      }\n\n      allow();\n    });\n}\n```\n\n## Создание permissions\n\nPermissions создаются с помощью метода `policy.createPermission`:\n\n```ts\nexport class AdministrationPolicyStore {\n  private readonly policy: Policy;\n\n  constructor(\n    private readonly policyManager: PolicyManagerStore,\n    private readonly userRepo: UserRepository,\n  ) {\n    makeAutoObservable(this, {}, { autoBind: true });\n\n    this.policy = this.policyManager.createPolicy({\n      name: 'administration',\n      prepareData: async (): Promise<void> => {\n        await Promise.all([this.userRepo.getRolesQuery().async()]);\n      },\n    });\n  }\n\n  /**\n   * Доступ к действиям администратора\n   */\n  public get administrationActions() {\n    return this.policy.createPermission((allow, deny) => {\n      if (this.userRepo.getRolesQuery().data?.isAdmin) {\n          return allow();\n      }\n\n      deny(PermissionDenialReason.NoAdmin);\n    });\n  }\n}\n```\n\n`createPermission` принимает функцию-стратегию с двумя аргументами:\n- allow - вызов разрешает доступ\n- deny - вызов запрещает доступ. Принимает причину отказа в доступе\n\n`createPermission` возвращает объект вида:\n```ts\ntype Permission = {\n  isAllowed: boolean;\n  /**\n   * Причина отказа в доступе\n   */\n  reason?: string;\n  /**\n   * @example permission.hasReason(DenialReason.NoAdmin)\n   */\n  hasReason: (reason: string) => boolean;\n};\n```\n\n## Причины отказа в доступе\n\n`deny` обязательно принимает причину отказа в доступе.\n\nПричины должны описываться в едином enum, но пакет @astral/permissions содержит системные причины отказа `SystemDenialReason`:\n```ts\nexport enum SystemDenialReason {\n  /**\n   * При расчете доступа произошла ошибка\n   * **/\n  InternalError = 'internal-error',\n  /**\n   * Недостаточно данных для формирования доступа\n   * **/\n  MissingData = 'missing-data',\n}\n```\n\nДля того чтобы все причины были в одном enum, необходимо объединить продуктовый enum с причинами из пакета:\n```ts\nimport { SystemDenialReason } from '@astral/permissions';\n\nexport enum PermissionsDenialReason {\n  /**\n   * При расчете доступа произошла ошибка\n   * **/\n  InternalError = SystemDenialReason.InternalError,\n  /**\n   * Недостаточно данных для формирования доступа\n   * **/\n  MissingData = SystemDenialReason.MissingData,\n  /**\n   * Пользователь не является админом\n   * **/\n  NoAdmin = 'no-admin',\n}\n```\n\n### Системные причины отказа в доступе\n- Если на момент вычисления доступов не были подготовлены данные (не был вызван `prepareData`), то permission будет отказан с reason: `SystemDenialReason.MissingData`.\n- Если при вычислении доступов не был вызван ни `allow`, ни `deny`, то permission будет отказан с reason: `SystemDenialReason.InternalError`.\n\n## Обработка причин отказа в доступе\n\nОбрабатывать причины отказа в доступе можно либо через оператор `===`:\n```ts\npermissions.books.addingToShelf.reason === PermissionsDenialReason.NoAdmin\n```\n\nЛибо через метод `hasReason`:\n```ts\npermissions.books.addingToShelf.hasReason(PermissionsDenialReason.NoAdmin)\n```\n\n**Пример**:\n```ts\nexport class UIStore {\n  public isOpenPayAccount = false;\n\n  constructor(\n    private readonly bookId: string,\n    private readonly permissions: PermissionsStore,\n    private readonly notifyService: Notify,\n  ) {\n    makeAutoObservable(this, {}, { autoBind: true });\n  }\n\n  public addToShelf = () => {\n      if (this.permissions.books.addingToShelf.isAllowed) {\n        this.notifyService.info(`Книга ${this.bookId} добавлена на полку`);\n\n        return;\n      }\n\n      if (this.permissions.books.addingToShelf.hasReason(PermissionsDenialReason.NoPay)) {\n        this.openPaymentAccount();\n\n        return;\n      }\n\n      if (\n        this.permissions.books.addingToShelf.hasReason(PermissionsDenialReason.ExceedReadingCount)\n      ) {\n        this.notifyService.error(\n          'Достигнуто максимальное количество книг на полке',\n        );\n\n        return;\n      }\n\n      this.notifyService.error(\n        'Добавить книгу на полку нельзя. Попробуйте перезагрузить страницу',\n      );\n  };\n\n  public openPayAccount = () => {\n    this.isOpenPayAccount = true;\n  };\n\n  public closePayAccount = () => {\n    this.isOpenPayAccount = false;\n  };\n}\n```\n\n## Подготовка данных для формирования доступов\n\nКаждый policy при создании посредством `PolicyManagerStore.createPolicy` указывает метод `prepareData`, подготавливающий данные для формирования доступов:\n```ts\nimport { makeAutoObservable } from 'mobx';\n\nimport type { UserRepository } from '@example/data';\n\nimport { PermissionDenialReason } from '../../../../enums';\n\nimport { PolicyManagerStore, Policy } from '@astral/permissions';\n\nexport class AdministrationPolicyStore {\n  private readonly policy: Policy;\n\n  constructor(\n    private readonly policyManager: PolicyManagerStore,\n    private readonly userRepo: UserRepository,\n  ) {\n    makeAutoObservable(this, {}, { autoBind: true });\n\n    this.policy = this.policyManager.createPolicy({\n      name: 'administration',\n      // Метод для подготовки данных необходимых для формирования доступов AdministrationPolicy\n      prepareData: async (): Promise<void> => {\n        await Promise.all([this.userRepo.getRolesQuery().async()]);\n      },\n    });\n  }\n}\n```\n\nДалее для централизованной подготовки данных для всех policy, необходимо создать `PermissionsStore`:\n```ts\nexport class PermissionsStore {\n  private readonly policyManager: PolicyManagerStore;\n\n  public readonly administration: AdministrationPolicyStore;\n\n  constructor(billingRepo: BillingRepository, userRepo: UserRepository) {\n    makeAutoObservable(this, {}, { autoBind: true });\n    this.policyManager = createPolicyManagerStore();\n\n    this.administration = createAdministrationPolicyStore(\n      this.policyManager,\n      userRepo,\n    );\n  }\n\n  /**\n   * Подготавливает данные для формирования доступов\n   */\n  public prepareData = () => this.policyManager.prepareDataSync();\n\n  public get preparingDataStatus() {\n    return this.policyManager.preparingDataStatus;\n  }\n}\n```\n\n`PermissionsStore.prepareData` загрузит все необходимые данные для каждого policy, созданного через `PolicyManagerStore.createPolicy`.\n\n`preparingDataStatus` будет содержать объект:\n```ts\ntype PreparingDataStatus = {\n  /**\n   * Флаг простаивания запроса, true если prepareData не был выполнен\n   */\n  isIdle: boolean;\n  isSuccess: boolean;\n  isLoading: boolean;\n  isError: boolean;\n  error?: Error;\n};\n```\n\n## Создание rules\n\n<!-- cspell:ignore переиспользуемые -->\n`createRule` позволяет создавать правила, переиспользуемые между policies:\n```ts\nimport { createRule } from '@astral/permissions';\n\nimport { getDateYearDiff } from '@example/shared';\n\nimport { PermissionDenialReason } from '../../../../enums';\n\nexport const calcAcceptableAge = (\n  acceptableAge?: number,\n  userBirthday?: string,\n) =>\n  createRule((allow, deny) => {\n    if (!acceptableAge) {\n      return deny(PermissionDenialReason.MissingData);\n    }\n\n    if (!userBirthday) {\n      return deny(PermissionDenialReason.MissingUserAge);\n    }\n\n    if (\n      Math.abs(getDateYearDiff(new Date(userBirthday), new Date())) <\n      acceptableAge\n    ) {\n      return deny(PermissionDenialReason.NotForYourAge);\n    }\n\n    allow();\n  });\n```\n\nПример использования:\n```ts\nexport class PaymentPolicyStore {\n    \n  ...\n\n  /**\n   * Возможность оплатить товар\n   */\n  public calcPayment = (acceptableAge: number) =>\n    this.policy.processPermission((allow, deny) => {\n      // calcAcceptableAge - правило, полностью реализующее calcPayment permission\n      const agePermission = calcAcceptableAge(\n        acceptableAge,\n        this.userRepo.getPersonInfoQuery().data?.birthday,\n      );\n\n      if (!agePermission.isAllowed) {\n        return deny(agePermission.reason);\n      }\n\n      allow();\n    });\n}\n```\n\n## Debug режим\n\n`PolicyManagerStore` позволяет при включении debug режима показывать логи при отказе в доступе:\n\n```ts\nexport class PermissionsStore {\n  private readonly policyManager: PolicyManagerStore;\n\n  public readonly administration: AdministrationPolicyStore;\n\n  constructor(billingRepo: BillingRepository, userRepo: UserRepository) {\n    makeAutoObservable(this, {}, { autoBind: true });\n    \n    this.policyManager = createPolicyManagerStore({ isDebug: true });\n\n    this.administration = createAdministrationPolicyStore(\n      this.policyManager,\n      userRepo,\n    );\n  }\n}\n```\n\nПример логов:\n\n```\n[@astral/permissions]/Policy:administration: При вычислении доступа не был вызван ни allow, ни deny Error: При вычислении доступа не был вызван ни allow, ни deny\n```\n\n## Пример реализации доступов в приложении\n\n[Ссылка на репозиторий с примером реализации доступов в приложении](https://git.astralnalog.ru/frontend.shared/permissions/-/tree/main/example).\n\n","readmeFilename":"README.md"}