├── .github └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── lib └── no-loops.js ├── package-lock.json ├── package.json └── tests └── index.js /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: push 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v4 12 | - name: Set up Node.js 13 | uses: actions/setup-node@v4 14 | with: 15 | node-version: 20 16 | - name: Install dependencies 17 | run: npm ci 18 | - name: Run tests 19 | run: npm test 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Node ### 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Dependency directory 13 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 14 | node_modules 15 | 16 | # Optional npm cache directory 17 | .npm 18 | 19 | # Optional REPL history 20 | .node_repl_history 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 buildo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # eslint-plugin-no-loops 2 | It's 2024 and you still use loops? 3 | 4 | [![Build Status](https://travis-ci.org/buildo/eslint-plugin-no-loops.svg?branch=master)](https://travis-ci.org/buildo/eslint-plugin-no-loops) 5 | [![npm](https://img.shields.io/npm/v/eslint-plugin-no-loops.svg)](https://www.npmjs.com/package/eslint-plugin-no-loops) 6 | 7 |

8 | 9 |

10 | 11 | ## Installation 12 | ```sh 13 | npm install --save-dev eslint-plugin-no-loops 14 | ``` 15 | 16 | ## Usage 17 | In your `.eslintrc`: 18 | 19 | ```javascript 20 | { 21 | "plugins": [ 22 | "no-loops" 23 | ], 24 | "rules": { 25 | "no-loops/no-loops": 2 26 | } 27 | } 28 | ``` 29 | 30 | ## Rule 31 | Disallow use of loops (for, for-in, while, do-while, for-of). 32 | 33 | ## Why 34 | You [don't](http://www.codereadability.com/coding-without-loops/) [need](http://joelhooks.com/blog/2014/02/06/stop-writing-for-loops-start-using-underscorejs/) [them](http://www.sitepoint.com/quick-tip-stop-writing-loops-start-thinking-with-maps/). 35 | 36 | ## I know better, I need one now 37 | If 99% of your code doesn't need them, but you have that single case where a loop makes sense, go ahead! 38 | 39 | ```javascript 40 | // eslint-disable-next-line no-loops/no-loops 41 | for (let i = 0; i < arr.length; i++) { 42 | // ... 43 | } 44 | ``` 45 | 46 | What is a rule without its exceptions? 47 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | "no-loops": require('./lib/no-loops') 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /lib/no-loops.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | create(context) { 5 | function reportLoopPresence(node) { 6 | context.report(node, 'loops are not allowed', { identifier: node.name }); 7 | } 8 | 9 | return { 10 | ForStatement: reportLoopPresence, 11 | ForInStatement: reportLoopPresence, 12 | WhileStatement: reportLoopPresence, 13 | DoWhileStatement: reportLoopPresence, 14 | ForOfStatement: reportLoopPresence 15 | }; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-no-loops", 3 | "version": "0.4.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "eslint-plugin-no-loops", 9 | "version": "0.4.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "eslint": "^9.4.0" 13 | }, 14 | "peerDependencies": { 15 | "eslint": ">=9" 16 | } 17 | }, 18 | "node_modules/@eslint-community/eslint-utils": { 19 | "version": "4.4.0", 20 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 21 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 22 | "dev": true, 23 | "dependencies": { 24 | "eslint-visitor-keys": "^3.3.0" 25 | }, 26 | "engines": { 27 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 28 | }, 29 | "peerDependencies": { 30 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 31 | } 32 | }, 33 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 34 | "version": "3.4.3", 35 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 36 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 37 | "dev": true, 38 | "engines": { 39 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 40 | }, 41 | "funding": { 42 | "url": "https://opencollective.com/eslint" 43 | } 44 | }, 45 | "node_modules/@eslint-community/regexpp": { 46 | "version": "4.10.1", 47 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", 48 | "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", 49 | "dev": true, 50 | "engines": { 51 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 52 | } 53 | }, 54 | "node_modules/@eslint/config-array": { 55 | "version": "0.15.1", 56 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", 57 | "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", 58 | "dev": true, 59 | "dependencies": { 60 | "@eslint/object-schema": "^2.1.3", 61 | "debug": "^4.3.1", 62 | "minimatch": "^3.0.5" 63 | }, 64 | "engines": { 65 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 66 | } 67 | }, 68 | "node_modules/@eslint/eslintrc": { 69 | "version": "3.1.0", 70 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", 71 | "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", 72 | "dev": true, 73 | "dependencies": { 74 | "ajv": "^6.12.4", 75 | "debug": "^4.3.2", 76 | "espree": "^10.0.1", 77 | "globals": "^14.0.0", 78 | "ignore": "^5.2.0", 79 | "import-fresh": "^3.2.1", 80 | "js-yaml": "^4.1.0", 81 | "minimatch": "^3.1.2", 82 | "strip-json-comments": "^3.1.1" 83 | }, 84 | "engines": { 85 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 86 | }, 87 | "funding": { 88 | "url": "https://opencollective.com/eslint" 89 | } 90 | }, 91 | "node_modules/@eslint/eslintrc/node_modules/globals": { 92 | "version": "14.0.0", 93 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 94 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 95 | "dev": true, 96 | "engines": { 97 | "node": ">=18" 98 | }, 99 | "funding": { 100 | "url": "https://github.com/sponsors/sindresorhus" 101 | } 102 | }, 103 | "node_modules/@eslint/js": { 104 | "version": "9.4.0", 105 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", 106 | "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", 107 | "dev": true, 108 | "engines": { 109 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 110 | } 111 | }, 112 | "node_modules/@eslint/object-schema": { 113 | "version": "2.1.4", 114 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 115 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", 116 | "dev": true, 117 | "engines": { 118 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 119 | } 120 | }, 121 | "node_modules/@humanwhocodes/module-importer": { 122 | "version": "1.0.1", 123 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 124 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 125 | "dev": true, 126 | "engines": { 127 | "node": ">=12.22" 128 | }, 129 | "funding": { 130 | "type": "github", 131 | "url": "https://github.com/sponsors/nzakas" 132 | } 133 | }, 134 | "node_modules/@humanwhocodes/retry": { 135 | "version": "0.3.0", 136 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", 137 | "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=18.18" 141 | }, 142 | "funding": { 143 | "type": "github", 144 | "url": "https://github.com/sponsors/nzakas" 145 | } 146 | }, 147 | "node_modules/@nodelib/fs.scandir": { 148 | "version": "2.1.5", 149 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 150 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 151 | "dev": true, 152 | "dependencies": { 153 | "@nodelib/fs.stat": "2.0.5", 154 | "run-parallel": "^1.1.9" 155 | }, 156 | "engines": { 157 | "node": ">= 8" 158 | } 159 | }, 160 | "node_modules/@nodelib/fs.stat": { 161 | "version": "2.0.5", 162 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 163 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 164 | "dev": true, 165 | "engines": { 166 | "node": ">= 8" 167 | } 168 | }, 169 | "node_modules/@nodelib/fs.walk": { 170 | "version": "1.2.8", 171 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 172 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 173 | "dev": true, 174 | "dependencies": { 175 | "@nodelib/fs.scandir": "2.1.5", 176 | "fastq": "^1.6.0" 177 | }, 178 | "engines": { 179 | "node": ">= 8" 180 | } 181 | }, 182 | "node_modules/acorn": { 183 | "version": "8.11.3", 184 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 185 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 186 | "dev": true, 187 | "bin": { 188 | "acorn": "bin/acorn" 189 | }, 190 | "engines": { 191 | "node": ">=0.4.0" 192 | } 193 | }, 194 | "node_modules/acorn-jsx": { 195 | "version": "5.3.2", 196 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 197 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 198 | "dev": true, 199 | "peerDependencies": { 200 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 201 | } 202 | }, 203 | "node_modules/ajv": { 204 | "version": "6.12.6", 205 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 206 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 207 | "dev": true, 208 | "dependencies": { 209 | "fast-deep-equal": "^3.1.1", 210 | "fast-json-stable-stringify": "^2.0.0", 211 | "json-schema-traverse": "^0.4.1", 212 | "uri-js": "^4.2.2" 213 | }, 214 | "funding": { 215 | "type": "github", 216 | "url": "https://github.com/sponsors/epoberezkin" 217 | } 218 | }, 219 | "node_modules/ansi-regex": { 220 | "version": "5.0.1", 221 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 222 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 223 | "dev": true, 224 | "engines": { 225 | "node": ">=8" 226 | } 227 | }, 228 | "node_modules/argparse": { 229 | "version": "2.0.1", 230 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 231 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 232 | "dev": true 233 | }, 234 | "node_modules/balanced-match": { 235 | "version": "1.0.2", 236 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 237 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 238 | "dev": true 239 | }, 240 | "node_modules/brace-expansion": { 241 | "version": "1.1.11", 242 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 243 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 244 | "dev": true, 245 | "dependencies": { 246 | "balanced-match": "^1.0.0", 247 | "concat-map": "0.0.1" 248 | } 249 | }, 250 | "node_modules/callsites": { 251 | "version": "3.1.0", 252 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 253 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 254 | "dev": true, 255 | "engines": { 256 | "node": ">=6" 257 | } 258 | }, 259 | "node_modules/concat-map": { 260 | "version": "0.0.1", 261 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 262 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 263 | "dev": true 264 | }, 265 | "node_modules/cross-spawn": { 266 | "version": "7.0.3", 267 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 268 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 269 | "dev": true, 270 | "dependencies": { 271 | "path-key": "^3.1.0", 272 | "shebang-command": "^2.0.0", 273 | "which": "^2.0.1" 274 | }, 275 | "engines": { 276 | "node": ">= 8" 277 | } 278 | }, 279 | "node_modules/debug": { 280 | "version": "4.3.5", 281 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 282 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 283 | "dev": true, 284 | "dependencies": { 285 | "ms": "2.1.2" 286 | }, 287 | "engines": { 288 | "node": ">=6.0" 289 | }, 290 | "peerDependenciesMeta": { 291 | "supports-color": { 292 | "optional": true 293 | } 294 | } 295 | }, 296 | "node_modules/deep-is": { 297 | "version": "0.1.4", 298 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 299 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 300 | "dev": true 301 | }, 302 | "node_modules/eslint": { 303 | "version": "9.4.0", 304 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", 305 | "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", 306 | "dev": true, 307 | "dependencies": { 308 | "@eslint-community/eslint-utils": "^4.2.0", 309 | "@eslint-community/regexpp": "^4.6.1", 310 | "@eslint/config-array": "^0.15.1", 311 | "@eslint/eslintrc": "^3.1.0", 312 | "@eslint/js": "9.4.0", 313 | "@humanwhocodes/module-importer": "^1.0.1", 314 | "@humanwhocodes/retry": "^0.3.0", 315 | "@nodelib/fs.walk": "^1.2.8", 316 | "ajv": "^6.12.4", 317 | "chalk": "^4.0.0", 318 | "cross-spawn": "^7.0.2", 319 | "debug": "^4.3.2", 320 | "escape-string-regexp": "^4.0.0", 321 | "eslint-scope": "^8.0.1", 322 | "eslint-visitor-keys": "^4.0.0", 323 | "espree": "^10.0.1", 324 | "esquery": "^1.4.2", 325 | "esutils": "^2.0.2", 326 | "fast-deep-equal": "^3.1.3", 327 | "file-entry-cache": "^8.0.0", 328 | "find-up": "^5.0.0", 329 | "glob-parent": "^6.0.2", 330 | "ignore": "^5.2.0", 331 | "imurmurhash": "^0.1.4", 332 | "is-glob": "^4.0.0", 333 | "is-path-inside": "^3.0.3", 334 | "json-stable-stringify-without-jsonify": "^1.0.1", 335 | "levn": "^0.4.1", 336 | "lodash.merge": "^4.6.2", 337 | "minimatch": "^3.1.2", 338 | "natural-compare": "^1.4.0", 339 | "optionator": "^0.9.3", 340 | "strip-ansi": "^6.0.1", 341 | "text-table": "^0.2.0" 342 | }, 343 | "bin": { 344 | "eslint": "bin/eslint.js" 345 | }, 346 | "engines": { 347 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 348 | }, 349 | "funding": { 350 | "url": "https://opencollective.com/eslint" 351 | } 352 | }, 353 | "node_modules/eslint-scope": { 354 | "version": "8.0.1", 355 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", 356 | "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", 357 | "dev": true, 358 | "dependencies": { 359 | "esrecurse": "^4.3.0", 360 | "estraverse": "^5.2.0" 361 | }, 362 | "engines": { 363 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 364 | }, 365 | "funding": { 366 | "url": "https://opencollective.com/eslint" 367 | } 368 | }, 369 | "node_modules/eslint/node_modules/ansi-styles": { 370 | "version": "4.3.0", 371 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 372 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 373 | "dev": true, 374 | "dependencies": { 375 | "color-convert": "^2.0.1" 376 | }, 377 | "engines": { 378 | "node": ">=8" 379 | }, 380 | "funding": { 381 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 382 | } 383 | }, 384 | "node_modules/eslint/node_modules/chalk": { 385 | "version": "4.1.2", 386 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 387 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 388 | "dev": true, 389 | "dependencies": { 390 | "ansi-styles": "^4.1.0", 391 | "supports-color": "^7.1.0" 392 | }, 393 | "engines": { 394 | "node": ">=10" 395 | }, 396 | "funding": { 397 | "url": "https://github.com/chalk/chalk?sponsor=1" 398 | } 399 | }, 400 | "node_modules/eslint/node_modules/color-convert": { 401 | "version": "2.0.1", 402 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 403 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 404 | "dev": true, 405 | "dependencies": { 406 | "color-name": "~1.1.4" 407 | }, 408 | "engines": { 409 | "node": ">=7.0.0" 410 | } 411 | }, 412 | "node_modules/eslint/node_modules/color-name": { 413 | "version": "1.1.4", 414 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 415 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 416 | "dev": true 417 | }, 418 | "node_modules/eslint/node_modules/escape-string-regexp": { 419 | "version": "4.0.0", 420 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 421 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 422 | "dev": true, 423 | "engines": { 424 | "node": ">=10" 425 | }, 426 | "funding": { 427 | "url": "https://github.com/sponsors/sindresorhus" 428 | } 429 | }, 430 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 431 | "version": "4.0.0", 432 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", 433 | "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", 434 | "dev": true, 435 | "engines": { 436 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 437 | }, 438 | "funding": { 439 | "url": "https://opencollective.com/eslint" 440 | } 441 | }, 442 | "node_modules/eslint/node_modules/has-flag": { 443 | "version": "4.0.0", 444 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 445 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 446 | "dev": true, 447 | "engines": { 448 | "node": ">=8" 449 | } 450 | }, 451 | "node_modules/eslint/node_modules/supports-color": { 452 | "version": "7.2.0", 453 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 454 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 455 | "dev": true, 456 | "dependencies": { 457 | "has-flag": "^4.0.0" 458 | }, 459 | "engines": { 460 | "node": ">=8" 461 | } 462 | }, 463 | "node_modules/espree": { 464 | "version": "10.0.1", 465 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", 466 | "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", 467 | "dev": true, 468 | "dependencies": { 469 | "acorn": "^8.11.3", 470 | "acorn-jsx": "^5.3.2", 471 | "eslint-visitor-keys": "^4.0.0" 472 | }, 473 | "engines": { 474 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 475 | }, 476 | "funding": { 477 | "url": "https://opencollective.com/eslint" 478 | } 479 | }, 480 | "node_modules/espree/node_modules/eslint-visitor-keys": { 481 | "version": "4.0.0", 482 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", 483 | "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", 484 | "dev": true, 485 | "engines": { 486 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 487 | }, 488 | "funding": { 489 | "url": "https://opencollective.com/eslint" 490 | } 491 | }, 492 | "node_modules/esquery": { 493 | "version": "1.5.0", 494 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 495 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 496 | "dev": true, 497 | "dependencies": { 498 | "estraverse": "^5.1.0" 499 | }, 500 | "engines": { 501 | "node": ">=0.10" 502 | } 503 | }, 504 | "node_modules/esrecurse": { 505 | "version": "4.3.0", 506 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 507 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 508 | "dev": true, 509 | "dependencies": { 510 | "estraverse": "^5.2.0" 511 | }, 512 | "engines": { 513 | "node": ">=4.0" 514 | } 515 | }, 516 | "node_modules/estraverse": { 517 | "version": "5.3.0", 518 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 519 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 520 | "dev": true, 521 | "engines": { 522 | "node": ">=4.0" 523 | } 524 | }, 525 | "node_modules/esutils": { 526 | "version": "2.0.3", 527 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 528 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 529 | "dev": true, 530 | "engines": { 531 | "node": ">=0.10.0" 532 | } 533 | }, 534 | "node_modules/fast-deep-equal": { 535 | "version": "3.1.3", 536 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 537 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 538 | "dev": true 539 | }, 540 | "node_modules/fast-json-stable-stringify": { 541 | "version": "2.1.0", 542 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 543 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 544 | "dev": true 545 | }, 546 | "node_modules/fast-levenshtein": { 547 | "version": "2.0.6", 548 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 549 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 550 | "dev": true 551 | }, 552 | "node_modules/fastq": { 553 | "version": "1.17.1", 554 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 555 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 556 | "dev": true, 557 | "dependencies": { 558 | "reusify": "^1.0.4" 559 | } 560 | }, 561 | "node_modules/file-entry-cache": { 562 | "version": "8.0.0", 563 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 564 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 565 | "dev": true, 566 | "dependencies": { 567 | "flat-cache": "^4.0.0" 568 | }, 569 | "engines": { 570 | "node": ">=16.0.0" 571 | } 572 | }, 573 | "node_modules/find-up": { 574 | "version": "5.0.0", 575 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 576 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 577 | "dev": true, 578 | "dependencies": { 579 | "locate-path": "^6.0.0", 580 | "path-exists": "^4.0.0" 581 | }, 582 | "engines": { 583 | "node": ">=10" 584 | }, 585 | "funding": { 586 | "url": "https://github.com/sponsors/sindresorhus" 587 | } 588 | }, 589 | "node_modules/flat-cache": { 590 | "version": "4.0.1", 591 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 592 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 593 | "dev": true, 594 | "dependencies": { 595 | "flatted": "^3.2.9", 596 | "keyv": "^4.5.4" 597 | }, 598 | "engines": { 599 | "node": ">=16" 600 | } 601 | }, 602 | "node_modules/flatted": { 603 | "version": "3.3.1", 604 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 605 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 606 | "dev": true 607 | }, 608 | "node_modules/glob-parent": { 609 | "version": "6.0.2", 610 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 611 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 612 | "dev": true, 613 | "dependencies": { 614 | "is-glob": "^4.0.3" 615 | }, 616 | "engines": { 617 | "node": ">=10.13.0" 618 | } 619 | }, 620 | "node_modules/ignore": { 621 | "version": "5.3.1", 622 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 623 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 624 | "dev": true, 625 | "engines": { 626 | "node": ">= 4" 627 | } 628 | }, 629 | "node_modules/import-fresh": { 630 | "version": "3.3.0", 631 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 632 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 633 | "dev": true, 634 | "dependencies": { 635 | "parent-module": "^1.0.0", 636 | "resolve-from": "^4.0.0" 637 | }, 638 | "engines": { 639 | "node": ">=6" 640 | }, 641 | "funding": { 642 | "url": "https://github.com/sponsors/sindresorhus" 643 | } 644 | }, 645 | "node_modules/imurmurhash": { 646 | "version": "0.1.4", 647 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 648 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 649 | "dev": true, 650 | "engines": { 651 | "node": ">=0.8.19" 652 | } 653 | }, 654 | "node_modules/is-extglob": { 655 | "version": "2.1.1", 656 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 657 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 658 | "dev": true, 659 | "engines": { 660 | "node": ">=0.10.0" 661 | } 662 | }, 663 | "node_modules/is-glob": { 664 | "version": "4.0.3", 665 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 666 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 667 | "dev": true, 668 | "dependencies": { 669 | "is-extglob": "^2.1.1" 670 | }, 671 | "engines": { 672 | "node": ">=0.10.0" 673 | } 674 | }, 675 | "node_modules/is-path-inside": { 676 | "version": "3.0.3", 677 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 678 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 679 | "dev": true, 680 | "engines": { 681 | "node": ">=8" 682 | } 683 | }, 684 | "node_modules/isexe": { 685 | "version": "2.0.0", 686 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 687 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 688 | "dev": true 689 | }, 690 | "node_modules/js-yaml": { 691 | "version": "4.1.0", 692 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 693 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 694 | "dev": true, 695 | "dependencies": { 696 | "argparse": "^2.0.1" 697 | }, 698 | "bin": { 699 | "js-yaml": "bin/js-yaml.js" 700 | } 701 | }, 702 | "node_modules/json-buffer": { 703 | "version": "3.0.1", 704 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 705 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 706 | "dev": true 707 | }, 708 | "node_modules/json-schema-traverse": { 709 | "version": "0.4.1", 710 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 711 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 712 | "dev": true 713 | }, 714 | "node_modules/json-stable-stringify-without-jsonify": { 715 | "version": "1.0.1", 716 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 717 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 718 | "dev": true 719 | }, 720 | "node_modules/keyv": { 721 | "version": "4.5.4", 722 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 723 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 724 | "dev": true, 725 | "dependencies": { 726 | "json-buffer": "3.0.1" 727 | } 728 | }, 729 | "node_modules/levn": { 730 | "version": "0.4.1", 731 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 732 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 733 | "dev": true, 734 | "dependencies": { 735 | "prelude-ls": "^1.2.1", 736 | "type-check": "~0.4.0" 737 | }, 738 | "engines": { 739 | "node": ">= 0.8.0" 740 | } 741 | }, 742 | "node_modules/locate-path": { 743 | "version": "6.0.0", 744 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 745 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 746 | "dev": true, 747 | "dependencies": { 748 | "p-locate": "^5.0.0" 749 | }, 750 | "engines": { 751 | "node": ">=10" 752 | }, 753 | "funding": { 754 | "url": "https://github.com/sponsors/sindresorhus" 755 | } 756 | }, 757 | "node_modules/lodash.merge": { 758 | "version": "4.6.2", 759 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 760 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 761 | "dev": true 762 | }, 763 | "node_modules/minimatch": { 764 | "version": "3.1.2", 765 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 766 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 767 | "dev": true, 768 | "dependencies": { 769 | "brace-expansion": "^1.1.7" 770 | }, 771 | "engines": { 772 | "node": "*" 773 | } 774 | }, 775 | "node_modules/ms": { 776 | "version": "2.1.2", 777 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 778 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 779 | "dev": true 780 | }, 781 | "node_modules/natural-compare": { 782 | "version": "1.4.0", 783 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 784 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 785 | "dev": true 786 | }, 787 | "node_modules/optionator": { 788 | "version": "0.9.4", 789 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 790 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 791 | "dev": true, 792 | "dependencies": { 793 | "deep-is": "^0.1.3", 794 | "fast-levenshtein": "^2.0.6", 795 | "levn": "^0.4.1", 796 | "prelude-ls": "^1.2.1", 797 | "type-check": "^0.4.0", 798 | "word-wrap": "^1.2.5" 799 | }, 800 | "engines": { 801 | "node": ">= 0.8.0" 802 | } 803 | }, 804 | "node_modules/p-limit": { 805 | "version": "3.1.0", 806 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 807 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 808 | "dev": true, 809 | "dependencies": { 810 | "yocto-queue": "^0.1.0" 811 | }, 812 | "engines": { 813 | "node": ">=10" 814 | }, 815 | "funding": { 816 | "url": "https://github.com/sponsors/sindresorhus" 817 | } 818 | }, 819 | "node_modules/p-locate": { 820 | "version": "5.0.0", 821 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 822 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 823 | "dev": true, 824 | "dependencies": { 825 | "p-limit": "^3.0.2" 826 | }, 827 | "engines": { 828 | "node": ">=10" 829 | }, 830 | "funding": { 831 | "url": "https://github.com/sponsors/sindresorhus" 832 | } 833 | }, 834 | "node_modules/parent-module": { 835 | "version": "1.0.1", 836 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 837 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 838 | "dev": true, 839 | "dependencies": { 840 | "callsites": "^3.0.0" 841 | }, 842 | "engines": { 843 | "node": ">=6" 844 | } 845 | }, 846 | "node_modules/path-exists": { 847 | "version": "4.0.0", 848 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 849 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 850 | "dev": true, 851 | "engines": { 852 | "node": ">=8" 853 | } 854 | }, 855 | "node_modules/path-key": { 856 | "version": "3.1.1", 857 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 858 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 859 | "dev": true, 860 | "engines": { 861 | "node": ">=8" 862 | } 863 | }, 864 | "node_modules/prelude-ls": { 865 | "version": "1.2.1", 866 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 867 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 868 | "dev": true, 869 | "engines": { 870 | "node": ">= 0.8.0" 871 | } 872 | }, 873 | "node_modules/punycode": { 874 | "version": "2.3.1", 875 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 876 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 877 | "dev": true, 878 | "engines": { 879 | "node": ">=6" 880 | } 881 | }, 882 | "node_modules/queue-microtask": { 883 | "version": "1.2.3", 884 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 885 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 886 | "dev": true, 887 | "funding": [ 888 | { 889 | "type": "github", 890 | "url": "https://github.com/sponsors/feross" 891 | }, 892 | { 893 | "type": "patreon", 894 | "url": "https://www.patreon.com/feross" 895 | }, 896 | { 897 | "type": "consulting", 898 | "url": "https://feross.org/support" 899 | } 900 | ] 901 | }, 902 | "node_modules/resolve-from": { 903 | "version": "4.0.0", 904 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 905 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 906 | "dev": true, 907 | "engines": { 908 | "node": ">=4" 909 | } 910 | }, 911 | "node_modules/reusify": { 912 | "version": "1.0.4", 913 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 914 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 915 | "dev": true, 916 | "engines": { 917 | "iojs": ">=1.0.0", 918 | "node": ">=0.10.0" 919 | } 920 | }, 921 | "node_modules/run-parallel": { 922 | "version": "1.2.0", 923 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 924 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 925 | "dev": true, 926 | "funding": [ 927 | { 928 | "type": "github", 929 | "url": "https://github.com/sponsors/feross" 930 | }, 931 | { 932 | "type": "patreon", 933 | "url": "https://www.patreon.com/feross" 934 | }, 935 | { 936 | "type": "consulting", 937 | "url": "https://feross.org/support" 938 | } 939 | ], 940 | "dependencies": { 941 | "queue-microtask": "^1.2.2" 942 | } 943 | }, 944 | "node_modules/shebang-command": { 945 | "version": "2.0.0", 946 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 947 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 948 | "dev": true, 949 | "dependencies": { 950 | "shebang-regex": "^3.0.0" 951 | }, 952 | "engines": { 953 | "node": ">=8" 954 | } 955 | }, 956 | "node_modules/shebang-regex": { 957 | "version": "3.0.0", 958 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 959 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 960 | "dev": true, 961 | "engines": { 962 | "node": ">=8" 963 | } 964 | }, 965 | "node_modules/strip-ansi": { 966 | "version": "6.0.1", 967 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 968 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 969 | "dev": true, 970 | "dependencies": { 971 | "ansi-regex": "^5.0.1" 972 | }, 973 | "engines": { 974 | "node": ">=8" 975 | } 976 | }, 977 | "node_modules/strip-json-comments": { 978 | "version": "3.1.1", 979 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 980 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 981 | "dev": true, 982 | "engines": { 983 | "node": ">=8" 984 | }, 985 | "funding": { 986 | "url": "https://github.com/sponsors/sindresorhus" 987 | } 988 | }, 989 | "node_modules/text-table": { 990 | "version": "0.2.0", 991 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 992 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 993 | "dev": true 994 | }, 995 | "node_modules/type-check": { 996 | "version": "0.4.0", 997 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 998 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 999 | "dev": true, 1000 | "dependencies": { 1001 | "prelude-ls": "^1.2.1" 1002 | }, 1003 | "engines": { 1004 | "node": ">= 0.8.0" 1005 | } 1006 | }, 1007 | "node_modules/uri-js": { 1008 | "version": "4.4.1", 1009 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1010 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "punycode": "^2.1.0" 1014 | } 1015 | }, 1016 | "node_modules/which": { 1017 | "version": "2.0.2", 1018 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1019 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1020 | "dev": true, 1021 | "dependencies": { 1022 | "isexe": "^2.0.0" 1023 | }, 1024 | "bin": { 1025 | "node-which": "bin/node-which" 1026 | }, 1027 | "engines": { 1028 | "node": ">= 8" 1029 | } 1030 | }, 1031 | "node_modules/word-wrap": { 1032 | "version": "1.2.5", 1033 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1034 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1035 | "dev": true, 1036 | "engines": { 1037 | "node": ">=0.10.0" 1038 | } 1039 | }, 1040 | "node_modules/yocto-queue": { 1041 | "version": "0.1.0", 1042 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1043 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1044 | "dev": true, 1045 | "engines": { 1046 | "node": ">=10" 1047 | }, 1048 | "funding": { 1049 | "url": "https://github.com/sponsors/sindresorhus" 1050 | } 1051 | } 1052 | } 1053 | } 1054 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-no-loops", 3 | "version": "0.4.0", 4 | "description": "Disallow loops", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "test": "node tests/index.js", 11 | "preversion": "npm test", 12 | "prepublish": "npm test" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/buildo/eslint-plugin-no-loops.git" 17 | }, 18 | "author": "buildo", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/buildo/eslint-plugin-no-loops/issues" 22 | }, 23 | "homepage": "https://github.com/buildo/eslint-plugin-no-loops#readme", 24 | "devDependencies": { 25 | "eslint": "^9.4.0" 26 | }, 27 | "peerDependencies": { 28 | "eslint": ">=9" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var rule = require('../lib/no-loops.js'); 4 | var RuleTester = require('eslint').RuleTester; 5 | 6 | var ruleTester = new RuleTester(); 7 | ruleTester.run('no-loops', rule, { 8 | valid: [ 9 | { 10 | code: '[1, 2, 3].map(function (i) { console.log(i); });' 11 | } 12 | ], 13 | 14 | invalid: [ 15 | { 16 | code: 'for (var i; i <= n; i++) { console.log(i); }', 17 | errors: [{ message: 'loops are not allowed' }] 18 | }, 19 | { 20 | code: 'for (i in [1, 2, 3]) { console.log(i); }', 21 | errors: [{ message: 'loops are not allowed' }] 22 | }, 23 | { 24 | code: 'while (i <= n) { console.log(i); }', 25 | errors: [{ message: 'loops are not allowed' }] 26 | }, 27 | { 28 | code: 'do { console.log(i); } while (i <= n)', 29 | errors: [{ message: 'loops are not allowed' }] 30 | }, 31 | { 32 | code: 'for (i of [1, 2, 3]) { console.log(i) }', 33 | errors: [{ message: 'loops are not allowed' }], 34 | languageOptions: { ecmaVersion: 6 } 35 | } 36 | ] 37 | }); 38 | --------------------------------------------------------------------------------