├── .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 | [](https://travis-ci.org/buildo/eslint-plugin-no-loops)
5 | [](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 |
--------------------------------------------------------------------------------