{"_id":"eslint-plugin-granular-selectors","_rev":"12-e8930b7f1c8edfee7f12154525e429d9","name":"eslint-plugin-granular-selectors","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"eslint-plugin-granular-selectors","version":"1.0.0","keywords":["eslint","eslintplugin","redux","zustand","selectors"],"author":"","license":"MIT","_id":"eslint-plugin-granular-selectors@1.0.0","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"dist":{"shasum":"4fef753c943864cc6809b7710698f13612bb66a6","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.0.0.tgz","fileCount":5,"integrity":"sha512-3/wesxNa+90RTGcXHher7I5veguQh5qI2ikQr/GY5PHP4+pW/46aoQWBwmcPtg39AhHrl2kh26j7hP/iNnBWNw==","signatures":[{"sig":"MEUCIQCcNWaAhd47hhstfWXCwg9muHbz3KpUXVMcOIvAoGkNLwIgCKquckreoVfvKVlvYpH07kPVq2V7aNRuU69Jxylknks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22546},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"c21def1b2c725f2a4a48efe383cda88d03d5ec43","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.0.0_1741706150660_0.709982175046779","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"eslint-plugin-granular-selectors","version":"1.1.0","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":"","license":"MIT","_id":"eslint-plugin-granular-selectors@1.1.0","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"dist":{"shasum":"da842972cbd00f8f0ea16bf6aed06ba440b7c69d","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.1.0.tgz","fileCount":5,"integrity":"sha512-igbdLx/ixRiegF7whQsGy+491YBMJ9oo+D0VTi3+bqTCt7IBMhLNkaIPoCOAgTUlOq7GG9EXgu8k0HiByBzTlg==","signatures":[{"sig":"MEYCIQDiBmzvxw/UJkDgagmRgv000K0hlxeQXBppau5VnRjlUAIhAKnMdqoa6Tldn7S8Ed1LskiX0AAa2X7Sp1iTbEMnFCjD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28580},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"9347e3c2af55ba727a90ad984cb1025a1c90abed","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.1.0_1741708496050_0.08858546416704738","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"eslint-plugin-granular-selectors","version":"1.2.0","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":"","license":"MIT","_id":"eslint-plugin-granular-selectors@1.2.0","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"dist":{"shasum":"1c3e050bc05e1b6e999aed0f194d489487d7eeee","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.2.0.tgz","fileCount":5,"integrity":"sha512-JBy5ZQJfTDhRzOQ9c4yoCBu1Vr2pPnb8GkmkzKOS7epLazj81YmiaPRNwP9YBpfv0m8knrfG9cstEf1ulj+/jQ==","signatures":[{"sig":"MEUCIEHMrcKrFnOMixXZE5Tqh6lBjkUxxn9oj265Tl9EVoGfAiEAp8jWeStcUMXstIHE+xF0Memh6EX7s6HkOvwbYDF0Z4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46124},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"40f94227ce6b936d6d6b57a14210bc90689de44b","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.2.0_1741765092123_0.3447371413738405","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"eslint-plugin-granular-selectors","version":"1.2.1","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":"","license":"MIT","_id":"eslint-plugin-granular-selectors@1.2.1","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"dist":{"shasum":"5c9e2f3ef5a29ac107ead44169c6259cdc2665ec","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.2.1.tgz","fileCount":5,"integrity":"sha512-+lh4k8RarmE/KHpNMEj1f/myF/wv3NU5J54KMARbicJpSS8ZdSQyoJRX3RDeDcXmZ7QB4tZV+bE0nwXmh5Swbw==","signatures":[{"sig":"MEUCIQC7n6c9BQZs9u5BvXRCa3ZOv9gg6PLkEdYn7dYn6Zkx0wIgArOgOGSlDHFlDvBGUuKbfQIT/F9bPjWYbzzXFx09eqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48918},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"ba22e3d93203d6cc3cde40aa182ace610f11a1c3","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.2.1_1741765810316_0.8846079616734848","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"eslint-plugin-granular-selectors","version":"1.2.2","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.2.2","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"dist":{"shasum":"8f659fe2b4986040d3459b7280937cc8223c67eb","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.2.2.tgz","fileCount":6,"integrity":"sha512-rKsVOj2JQ/QnM0w0iMF+R0J7Hxr/fYx8CuSxD9wZsCyxvsKk3EUXP37PHp28ixUQnL96CxlrYOy80kUfIc6pOQ==","signatures":[{"sig":"MEYCIQDb97kBMEdgM3uRf+OOgSNqHiO122FFVo6cLnSfrVYxCQIhAIxookxzFNfywl5j34PqwCl+lcnuFM3KS+SN8GmVoqkH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50287},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"1c5fdb834b498f8421622a8c7bdd9f099aa8c2f3","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.2.2_1741771159108_0.7591373785022055","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"eslint-plugin-granular-selectors","version":"1.2.3","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.2.3","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"5ca32187c4e4c35c1c4db2fb8286f906ffd04cd2","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.2.3.tgz","fileCount":6,"integrity":"sha512-kqt2AaiJ6b97+uR9dRN3FSmauSIQB466wxLG9xJfK9T0Gwz/7f184T4yEpHFVVzQNvBL8odbMX2iRqZt05j2hw==","signatures":[{"sig":"MEYCIQDYY4ktlUpcsJ4X7SPEiSZVXeRdnFu5f0yQNgBvKMnh1wIhAK8VX6mtv7XnG8/1G4nXLGgkYF+qY+fSHqhsJ0L+kgum","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50365},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"7781de972aeca48688d5334d01e44bbc483ff5ab","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.2.3_1741773307398_0.6163277005909948","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"eslint-plugin-granular-selectors","version":"1.3.0","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.3.0","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"ef982a5b06836b277a13af3a083c78ebe07291d1","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.3.0.tgz","fileCount":6,"integrity":"sha512-So79HxpU97+5NXMPhN3xPGy2ldspy5vCJ8aLh+Vi8jCEUC5IT0fznjr1l7tzJyFMFTuaCfX9LG1awa1TcBkbmg==","signatures":[{"sig":"MEYCIQCTydml6RVe2EedDm+HUMIlgXhzsZBkCElHDvAvC3NPKQIhALF8EVb1RQAJYMccR1Fy4cs7bzb4jeE8UGPxCkb/W5n8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64915},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"2b337ecabad97649ca4135bb0175cd423ee863b0","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.2.3","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.3.0_1741864684594_0.025059036411997804","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"eslint-plugin-granular-selectors","version":"1.3.1","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.3.1","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"4132cdacc51b83d2cef09bcae9850f55bd319ca7","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.3.1.tgz","fileCount":6,"integrity":"sha512-QlEn+lNLnVY78rAbnf4IzgJ8+SuYOMraFDbTilBjXHeiS555pBokm05015u4xJgHomIZO/R7w1UtsW07utUWXw==","signatures":[{"sig":"MEYCIQDX3PR1ExJRr/RNFX2OKO3zHlKlGieoUkJ+wpujyOkWVwIhAOX+SDExQxfTdO7DQ3wq3G8YGid9mcNoHpWO9pucjoE+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66985},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"e47456af5a4a802d7fdebfb096ce71f209537e29","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test","test:eslint9":"npm i eslint@9.31.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.9.0","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"18.18.1","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.3.1_1755797013091_0.18331057379783644","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"eslint-plugin-granular-selectors","version":"1.3.2","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.3.2","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"5982faf7b6a45c75ad868e6a85e758cd60cfa1af","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.3.2.tgz","fileCount":7,"integrity":"sha512-wcHBZCfAiNJVOEMWMTlJSgBn03nuo0AXAravEQDQZBh4IOhqAnIKN9SYrlVvY8ps6c0fWR60Zd5trxCE0nfz2w==","signatures":[{"sig":"MEQCIFgUOEwuS/2v06BtPT00bxmnr1AmYrpDPY1E8oMVPwHpAiAmIp18icps4rn2M+/UAemB5tl038+btOxAYtWzO4QUuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80689},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"869ee830e21f0f1d7b80cda482ce157f05681610","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test","test:eslint9":"npm i eslint@9.31.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.9.0","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"18.18.1","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.3.2_1755866485360_0.24041564752064515","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"eslint-plugin-granular-selectors","version":"1.3.3","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.3.3","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"4562ae6495cde1757a5b4f6b9ab120e74d51da88","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.3.3.tgz","fileCount":6,"integrity":"sha512-LmgjtgEerPy03nfymR3eWKqkSr1I/3Jyq6P0tnrML7eGGo+ct3VSHb15jloB8GVdZuINo65Yg3izMtrRTfvAdQ==","signatures":[{"sig":"MEQCIHUWl4Fe3kCXiie7450zQDMA7FQAOzot2S3L5GJNEpz2AiAp5yKZOb94smEYdrgwcNKOx+danBf4EZFtsUFTdNgq/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81039},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"03e826c8207d07078cf247f0ae1e5af1bd254040","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test","test:eslint9":"npm i eslint@9.31.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.9.0","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"18.18.1","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.3.3_1755880855792_0.21089675782407302","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"eslint-plugin-granular-selectors","version":"1.4.0","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","_id":"eslint-plugin-granular-selectors@1.4.0","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"dist":{"shasum":"5fd2eea0a4d5007aa59b5ac1aeaae323f2091e9b","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.4.0.tgz","fileCount":6,"integrity":"sha512-RH01omeiFYstVppOmVIOmXQSutSru9HjY+GKDNcoS+VJl3r3j9RoOX5Eu8M1ehiSQ5/eyhfh6/yYXTMHZPbnCw==","signatures":[{"sig":"MEUCIQCrsHxR4udRA73ljtlYChw1OMSqGIegh28/CQ9MmDqxnQIgWLPrq55/lVG8AKYbIugnz7LaykueSzCggxcXBpcahaY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86076},"main":"index.js","engines":{"node":">=8.0.0"},"gitHead":"5ba8285cda2e2e0e13270e83d80b92d844c46480","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test","test:eslint9":"npm i eslint@9.31.0 mocha@10.2.0 --no-save && npm test"},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"repository":{"url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git","type":"git"},"_npmVersion":"10.9.0","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","directories":{},"_nodeVersion":"18.18.1","_hasShrinkwrap":false,"devDependencies":{"mocha":"^8.4.0","eslint":"^7.32.0","@typescript-eslint/parser":"^5.0.0"},"peerDependencies":{"eslint":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-granular-selectors_1.4.0_1755882759401_0.13110823011540473","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"eslint-plugin-granular-selectors","version":"1.5.0","description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","repository":{"type":"git","url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git"},"main":"index.js","scripts":{"test":"mocha tests/lib/rules/granular-selectors.js","test:ts":"npm i @typescript-eslint/parser --no-save && npm test","test:eslint5":"npm i eslint@5.16.0 mocha@5.2.0 --no-save && npm test","test:eslint6":"npm i eslint@6.8.0 mocha@7.2.0 --no-save && npm test","test:eslint7":"npm i eslint@7.32.0 mocha@8.4.0 --no-save && npm test","test:eslint8":"npm i eslint@8.38.0 mocha@10.2.0 --no-save && npm test","test:eslint9":"npm i eslint@9.31.0 mocha@10.2.0 --no-save && npm test","test:eslint10":"npm i eslint@10 @typescript-eslint/parser@8 mocha@10.2.0 --no-save && npm test"},"keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"author":{"name":"vrsttl"},"license":"MIT","peerDependencies":{"eslint":">=5.0.0"},"devDependencies":{"@typescript-eslint/parser":"^5.0.0","eslint":"^7.32.0","mocha":"^8.4.0"},"engines":{"node":">=18.0.0"},"_id":"eslint-plugin-granular-selectors@1.5.0","gitHead":"cbc70a5fc9307c142f73b01b4d9e74e77487b01e","bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-EdVxOZRjovvVpEiPotagjWXesZZv3ti+I+t8b2S/IVvdZ4PUCmElosJrIefCkPzBn16s9krrrT2SRuM5ermWjA==","shasum":"2e6aaeaa036954da9d58f1242fc6841d6ef1089f","tarball":"https://registry.npmjs.org/eslint-plugin-granular-selectors/-/eslint-plugin-granular-selectors-1.5.0.tgz","fileCount":6,"unpackedSize":66783,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE8AKxztMx+rLSsar6vbGt7y9wtunWdlf/1MFVjSYrbIAiBwcPZEFmlHFYfYRKNF6ROtEhSswk3+TI6wdKm/q6MgLg=="}]},"_npmUser":{"name":"vrsttl","email":"vrsttl@gmail.com"},"directories":{},"maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-granular-selectors_1.5.0_1773057574414_0.16666832397958942"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-11T15:15:50.658Z","modified":"2026-03-09T11:59:34.667Z","1.0.0":"2025-03-11T15:15:50.838Z","1.1.0":"2025-03-11T15:54:56.239Z","1.2.0":"2025-03-12T07:38:12.295Z","1.2.1":"2025-03-12T07:50:10.520Z","1.2.2":"2025-03-12T09:19:19.317Z","1.2.3":"2025-03-12T09:55:07.578Z","1.3.0":"2025-03-13T11:18:04.802Z","1.3.1":"2025-08-21T17:23:33.374Z","1.3.2":"2025-08-22T12:41:25.588Z","1.3.3":"2025-08-22T16:40:55.995Z","1.4.0":"2025-08-22T17:12:39.604Z","1.5.0":"2026-03-09T11:59:34.571Z"},"bugs":{"url":"https://github.com/vrsttl/eslint-plugin-granular-selectors/issues"},"author":{"name":"vrsttl"},"license":"MIT","homepage":"https://github.com/vrsttl/eslint-plugin-granular-selectors#readme","keywords":["eslint","eslintplugin","redux","zustand","selectors","typescript"],"repository":{"type":"git","url":"git+https://github.com/vrsttl/eslint-plugin-granular-selectors.git"},"description":"ESLint plugin to enforce granular store selectors for Redux and Zustand","maintainers":[{"name":"vrsttl","email":"vrsttl@gmail.com"}],"readme":"# eslint-plugin-granular-selectors\n\nESLint plugin to enforce granular store selectors for Redux and Zustand.\n\n## Why Use Granular Selectors?\n\nUsing granular selectors provides several benefits:\n\n1. **Performance Optimization**: Components only re-render when the specific pieces of state they depend on change\n2. **Code Clarity**: Makes dependencies on state explicit and easier to understand\n3. **Maintainability**: Easier to refactor state structure without breaking components\n4. **Reduced Bugs**: Prevents unnecessary re-renders caused by changes to unrelated parts of state\n\n## Installation\n\n```bash\nnpm install --save-dev eslint-plugin-granular-selectors\n```\n\n## Compatibility\n\nThis plugin is compatible with:\n- ESLint 5.0.0 and above\n- React Redux, Redux Toolkit, Zustand, and other state management libraries that use selector patterns\n- Both ES5 and ES6+ codebases (automatically detects and preserves your code style)\n- TypeScript codebases (preserves type annotations)\n\n## Usage\n\nAdd to your `.eslintrc.js`:\n\n```js\nmodule.exports = {\n  plugins: [\n    'granular-selectors'\n  ],\n  rules: {\n    'granular-selectors/granular-selectors': 'error'\n  }\n}\n```\n\nOr use the recommended config:\n\n```js\nmodule.exports = {\n  extends: [\n    'plugin:granular-selectors/recommended'\n  ]\n}\n```\n\n### Configuration Options\n\nThe rule accepts the following options:\n\n```js\n{\n  'granular-selectors/granular-selectors': ['error', {\n    // Array of patterns to include for selector function detection\n    include: ['use.*Selector.*', 'createSelector', 'select.*'],\n    \n    // Array of patterns to exclude from selector function detection\n    exclude: ['useSelectOptions', 'useSelectorRef'],\n    \n    // Code patterns to ignore (e.g., specific variable names or patterns)\n    ignorePatterns: ['.*ForceDestructure.*', '.*IgnoreThis.*']\n  }]\n}\n```\n\n#### include\n\nAn array of strings that will be converted to regular expressions to match selector function names. The default is `['use.*Selector.*']`, which matches common patterns like `useSelector`, `useAppSelector`, `useStoreSelector`, etc.\n\nYou can customize this to match your specific selector naming conventions:\n\n```js\n// Example: Match Redux's createSelector and reselect patterns\n{\n  'granular-selectors/granular-selectors': ['error', {\n    include: [\n      'use.*Selector.*',  // React hooks style selectors\n      'createSelector',   // Redux/Reselect\n      'select.*',         // Custom selectors like selectUserData\n      'get.*State'        // Getters like getUserState\n    ]\n  }]\n}\n```\n\n#### exclude\n\nAn array of strings that will be converted to regular expressions to exclude specific function names from being treated as selectors, even if they match the `include` patterns.\n\n```js\n// Example: Exclude specific functions that match the general pattern\n{\n  'granular-selectors/granular-selectors': ['error', {\n    include: ['use.*Selector.*'],\n    exclude: [\n      'useSelectOptions',     // Not a state selector\n      'useSelectorRef',       // Not a state selector\n      'useSelectorComponent'  // Not a state selector\n    ]\n  }]\n}\n```\n\n#### ignorePatterns\n\nAn array of strings that will be converted to regular expressions to ignore specific code patterns. This is useful for ignoring specific variable names or code patterns where you want to allow destructuring from selectors.\n\n```js\n// Example: Ignore specific patterns\n{\n  'granular-selectors/granular-selectors': ['error', {\n    ignorePatterns: [\n      '.*ForceDestructure.*',  // Ignore variables with ForceDestructure in the name\n      '.*IgnoreThis.*',        // Ignore variables with IgnoreThis in the name\n      '.*// eslint-disable-line.*'  // Ignore lines with inline disable comments\n    ]\n  }]\n}\n```\n\n## Rules\n\n### granular-selectors\n\nThis rule enforces granular store selectors for Redux and Zustand to improve performance.\n\n#### ❌ Incorrect\n\n```js\n// ES6: Destructuring from selector\nconst { foo, bar } = useAppSelector(state => state);\n\n// ES6: Destructuring from a nested state path\nconst { name, email } = useSelector(state => state.user);\n\n// ES6: Destructuring with nested objects\nconst { user: { name, email }, settings } = useAppSelector(state => state);\n\n// ES6: Destructuring with aliases\nconst { foo: renamedFoo, bar } = useSelector(state => state);\n\n// ES6: Destructuring from selector variables\nconst obj = useSelector(state => state);\nconst { a } = obj;\nconst { b } = obj;\n\n// ES5: Variable assignments from selector result\nvar obj = useAppSelector(function(state) { return state; });\nvar foo = obj.foo;\nvar bar = obj.bar;\n\n// TypeScript: Destructuring with type annotations\nconst { foo, bar } = useAppSelector((state: RootState) => state);\n```\n\n#### ✅ Correct\n\n```js\n// ES6: Granular selectors\nconst foo = useAppSelector(state => state.foo);\nconst bar = useAppSelector(state => state.bar);\n\n// ES6: Specific nested properties\nconst value = useSelector(state => state.nested.specific.value);\n\n// ES6: Accessing nested state properly\nconst name = useSelector(state => state.user.name);\nconst email = useSelector(state => state.user.email);\n\n// ES5: Granular selectors\nvar foo = useAppSelector(function(state) { return state.foo; });\nvar bar = useAppSelector(function(state) { return state.bar; });\n\n// TypeScript: Granular selectors with type annotations\nconst foo = useAppSelector((state: RootState) => state.foo);\nconst bar = useAppSelector((state: RootState) => state.bar);\n```\n\n## Features\n\nThe plugin supports:\n\n1. **Basic Destructuring Detection**: Identifies when you're destructuring from a selector\n2. **Nested Destructuring**: Handles complex patterns like `const { user: { name, email } } = useSelector(...)`\n3. **Property Aliases**: Supports renaming properties during destructuring\n4. **Base Paths**: Works with selectors that already select a subset of state\n5. **Auto-fixing**: Automatically converts destructured selectors to granular ones\n6. **Flexible Selector Matching**: Works with any function matching the pattern `use*Selector*`\n7. **Code Style Preservation**: Automatically detects and preserves ES5 or ES6+ syntax\n8. **TypeScript Support**: Preserves type annotations in the generated code\n9. **Supports property aliases and default values in destructuring**\n10. **Comprehensive test coverage**\n11. **Preserves fallback logic (|| and ?? from selectors)**\n12. **Handles object literals in selectors**: Correctly processes selectors that return object literals with explicit property mappings\n\n## How It Works\n\nThe rule looks for:\n1. ES6 destructuring from selector hooks: `const { foo, bar } = useSelector(...)`\n2. ES6 destructuring from selector variables: `const obj = useSelector(...); const { a } = obj;`\n3. ES5 variable assignments from selector results: `var obj = useSelector(...); var foo = obj.foo;`\n4. Destructuring from selectors that return object literals: `const { foo, bar } = useSelector(state => ({ foo: state.a.foo, bar: state.b.bar }))`\n\nWhen it finds such patterns, it transforms them into individual granular selector calls for each property, preserving your code style (ES5 or ES6) and type annotations. For destructuring patterns with subsequent property accesses, it performs a coordinated transformation that eliminates intermediate variables entirely.\n\n## Examples\n\n### Example 1: ES6 Destructuring\n\n```js\n// Before\nconst { count, user } = useAppSelector(state => state);\n\n// After (auto-fixed)\nconst count = useAppSelector(state => state.count);\nconst user = useAppSelector(state => state.user);\n```\n\n### Example 2: ES6 Nested Destructuring\n\n```js\n// Before\nconst { user: { name, email }, settings } = useAppSelector(state => state);\n\n// After (auto-fixed)\nconst name = useAppSelector(state => state.user.name);\nconst email = useAppSelector(state => state.user.email);\nconst settings = useAppSelector(state => state.settings);\n```\n\n### Example 3: ES6 Destructuring from Selector Variables\n\n```js\n// Before\nconst obj = useSelector(state => state);\nconst { a } = obj;\nconst { b } = obj;\n\n// After (auto-fixed)\nconst obj = useSelector(state => state);\nconst a = useSelector(state => state.a);\nconst b = useSelector(state => state.b);\n```\n\n### Example 3.5: Coordinated Transformation (Destructuring + Property Accesses)\n\n```js\n// Before\nconst {userSubmissions} = useSelector(state => state);\nconst userEducationLabel = userSubmissions.educationLevelLabel;\nconst userEducationLevel = userSubmissions.educationLevel;\n\n// After (auto-fixed with coordinated transformation)\nconst userEducationLabel = useSelector(state => state.userSubmissions.educationLevelLabel);\nconst userEducationLevel = useSelector(state => state.userSubmissions.educationLevel);\n```\n\n### Example 4: ES5 Coordinated Transformation\n\n```js\n// Before\nvar obj = useAppSelector(function(state) { return state; });\nvar foo = obj.foo;\nvar bar = obj.bar;\n\n// After (auto-fixed with coordinated transformation)\nvar foo = useAppSelector(function(state) { return state.foo; });\nvar bar = useAppSelector(function(state) { return state.bar; });\n```\n\n### Example 5: TypeScript with Type Annotations\n\n```ts\n// Before\nconst { count, user } = useAppSelector((state: RootState) => state);\n\n// After (auto-fixed)\nconst count = useAppSelector((state: RootState) => state.count);\nconst user = useAppSelector((state: RootState) => state.user);\n```\n\n### Example 6: TypeScript with Complex Type Annotations\n\n```ts\n// Before\nconst { items, totalCount } = useProductsSelector((state: Store<ProductState>) => state);\n\n// After (auto-fixed)\nconst items = useProductsSelector((state: Store<ProductState>) => state.items);\nconst totalCount = useProductsSelector((state: Store<ProductState>) => state.totalCount);\n```\n\n### Example 7: Property aliases and default values\n\n```js\n// ❌ Bad\nconst { jobs: jobsList = [], totalCount = 0 } = useSelector(state => state.hiringExtensionJobs || {});\n\n// ✅ Good\nconst jobsList = useSelector(state => state.hiringExtensionJobs.jobs || {}) || [];\nconst totalCount = useSelector(state => state.hiringExtensionJobs.totalCount || {}) || 0;\n```\n\n### Example 7: Fallback logic preservation\n\n```js\n// ❌ Bad\nconst { items, count } = useSelector(state => state.data || {});\n\n// ✅ Good\nconst items = useSelector(state => state.data.items || {});\nconst count = useSelector(state => state.data.count || {});\n```\n\n### Example 8: Fallback logic preservation with null check\n\n```js\n// ❌ Bad\nconst { name, email } = useSelector(state => state.user ?? null);\n\n// ✅ Good\nconst name = useSelector(state => state.user.name ?? null);\nconst email = useSelector(state => state.user.email ?? null);\n```\n\n### Example 9: TypeScript support\n\n```ts\n// ❌ Bad\nconst { items, totalCount } = useProductsSelector((state: Store<ProductState>) => state);\n\n// ✅ Good\nconst items = useProductsSelector((state: Store<ProductState>) => state.items);\nconst totalCount = useProductsSelector((state: Store<ProductState>) => state.totalCount);\n```\n\n### Example 10: Object literals in selectors\n\n```js\n// ❌ Bad\nconst {\n  countryCode,\n  followProfileError,\n  isLoggedIn,\n} = useSelector((state) => ({\n  countryCode: state.profile.countryCode,\n  followProfileError: state.notifications?.err,\n  isLoggedIn: state.user.isLoggedIn,\n}));\n\n// ✅ Good\nconst countryCode = useSelector((state) => state.profile.countryCode);\nconst followProfileError = useSelector((state) => state.notifications?.err);\nconst isLoggedIn = useSelector((state) => state.user.isLoggedIn);\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request!\n\nIf you think I solved one of your headaches, feel free to [tip me](https://revolut.me/attilanknz) with as much money as you see fit. This is a Revolut payment link that you can use with Apple Pay too. \n\nYou will find the Repo [here](https://github.com/vrsttl/eslint-plugin-granular-selectors).\n\n## Changelog\n\n### Version 1.5.0\n- **ESLint 10 compatibility**: Prefer `context.sourceCode` property over deprecated `context.getSourceCode()` method\n- Added `test:eslint10` script for testing against ESLint 10\n- Updated minimum Node.js engine requirement to >=18.0.0 (aligned with ESLint 9+ requirements)\n\n### Version 1.4.0\n- **Added ES5 coordinated transformation**: Implemented full support for ES5 coordinated transformation patterns\n- Fixed ES5 pattern detection: `var obj = useSelector(...); var foo = obj.foo; var bar = obj.bar;` now transforms to eliminate intermediate variables entirely  \n- Enhanced fallback logic preservation for ES5 coordinated transformations\n- Improved scope analysis and handler coordination to prevent duplicate transformations\n- Updated test suite to properly validate ES5 coordinated transformation behavior\n- Added comprehensive documentation and examples for ES5 coordinated transformation\n\n### Version 1.3.3\n- **Fixed coordinated transformation bug**: Fixed issue where ES6 destructuring from selector variables followed by property accesses was not being detected and transformed\n- Added coordinated transformation that eliminates intermediate destructuring variables entirely when followed by property accesses\n- Enhanced test coverage for coordinated transformation patterns\n- Improved auto-fixing logic to prevent duplicate transformations\n- Added proper documentation and examples for coordinated transformation pattern\n\n### Version 1.3.1\n- **Fixed ESLint 9 compatibility**: Resolved `TypeError: context.getScope is not a function` error\n- Added support for ESLint 9.x flat config format while maintaining backwards compatibility\n- Updated `context.getScope()` usage to be compatible with ESLint 9+ API changes\n- Added `test:eslint9` script for testing with ESLint 9.31.0\n- Improved RuleTester configuration to automatically detect and use appropriate config format\n- All tests now pass across ESLint 5.16.0 through 9.31.0\n- Enhanced TypeScript parser usage to eliminate unused variables\n\n### Version 1.3.0\n- Added support for object literals in selectors\n- Fixed handling of selectors that return explicit property mappings\n- Improved TypeScript support with better handling of optional chaining\n- Enhanced configuration options for greater flexibility:\n  - Added `include` option for specifying selector patterns to match\n  - Added `exclude` option for excluding specific function names from being treated as selectors\n  - Added `ignorePatterns` option for ignoring specific code patterns\n- Maintained backward compatibility with previous configuration options\n- Fixed handling of object literals in selectors with proper parentheses preservation\n\n### Version 1.2.3\n- Initial release\n- Support for ES5 and ES6+ code styles\n- Compatible with ESLint 5 and above\n- Support for TypeScript type annotations\n- Handling of property aliases and default values\n- Support for nested destructuring patterns\n- Preservation of fallback logic (|| and ??)\n","readmeFilename":"README.md"}