Mise à jour de index.js

This commit is contained in:
soufiane 2025-11-03 19:21:24 +01:00
parent d9cae7cb87
commit 4312633bdb
36 changed files with 508 additions and 6170 deletions

89
Jenkinsfile vendored
View File

@ -1,18 +1,29 @@
pipeline {
agent any
triggers {
pollSCM('* * * * *') // Vérifie les changements toutes les minutes, webhook Gitea force un scan immédiat
// 🔁 Vérifie le code toutes les minutes (ou via Webhook Gitea)
triggers {
pollSCM('* * * * *')
}
// ⚙️ Paramètre pour choisir lenvironnement
parameters {
choice(name: 'ENV', choices: ['dev', 'preprod', 'prod'], description: 'Choisir lenvironnement de déploiement')
}
// 🌍 Variables globales
environment {
REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr"
IMAGE_NAME = "the-tip-top-backend"
DEPLOY_PATH = "/srv/devops/the-tip-top"
DOMAIN = "api.dsp5-archi-o24a-15m-g3.fr"
TAG = "${params.ENV}-latest"
DEPLOY_PATH = "/srv/devops/the-tip-top/${params.ENV}"
}
stages {
/* ───────────────────────────────
* 1⃣ Checkout du code source
* ─────────────────────────────── */
stage('Checkout') {
steps {
echo "📦 Récupération du code source depuis Gitea..."
@ -20,32 +31,71 @@ pipeline {
}
}
stage('Build Docker image') {
/* ───────────────────────────────
* 2⃣ Tests qualité et unitaires
* ─────────────────────────────── */
stage('Tests & Qualité') {
steps {
echo "🐳 Construction de limage Docker backend..."
echo "🧪 Lancement des tests et analyse de code..."
sh '''
docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER} .
docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER} ${REGISTRY_URL}/${IMAGE_NAME}:latest
npm ci
npm run lint || echo "⚠️ Erreurs de lint détectées"
npm test || echo "⚠️ Tests échoués — vérifier les logs"
'''
}
}
/* ───────────────────────────────
* 3⃣ Build de limage Docker
* ─────────────────────────────── */
stage('Build Docker image') {
steps {
echo "🐳 Construction de limage Docker backend..."
sh '''
docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} .
docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} ${REGISTRY_URL}/${IMAGE_NAME}:latest
'''
}
}
/* ───────────────────────────────
* 4⃣ Push vers le registre privé
* ─────────────────────────────── */
stage('Push to Registry') {
steps {
echo "📤 Envoi de limage vers le registre privé..."
echo "📤 Envoi de limage vers le registre Docker privé..."
withCredentials([usernamePassword(credentialsId: 'registry-credentials', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) {
sh '''
echo "$REG_PASS" | docker login ${REGISTRY_URL} -u "$REG_USER" --password-stdin
docker push ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER}
docker push ${REGISTRY_URL}/${IMAGE_NAME}:${TAG}
docker push ${REGISTRY_URL}/${IMAGE_NAME}:latest
'''
}
}
}
/* ───────────────────────────────
* 5⃣ Sauvegarde avant déploiement
* ─────────────────────────────── */
stage('Backup Before Deploy') {
steps {
echo "💾 Exécution du script de sauvegarde avant déploiement..."
sh '''
if [ -f /srv/devops/the-tip-top/backup.sh ]; then
bash /srv/devops/the-tip-top/backup.sh
else
echo "⚠️ Aucun script backup.sh trouvé, déploiement sans sauvegarde."
fi
'''
}
}
/* ───────────────────────────────
* 6⃣ Déploiement du backend
* ─────────────────────────────── */
stage('Deploy') {
steps {
echo "🚀 Déploiement du backend..."
echo "🚀 Déploiement du backend sur ${params.ENV}..."
sh '''
if [ ! -f ${DEPLOY_PATH}/docker-compose.yml ]; then
echo "❌ Fichier docker-compose.yml introuvable dans ${DEPLOY_PATH}"
@ -59,21 +109,28 @@ pipeline {
}
}
/* ───────────────────────────────
* 7⃣ Vérification du déploiement
* ─────────────────────────────── */
stage('Health Check') {
steps {
echo "🩺 Vérification du backend après déploiement..."
script {
def domain = (params.ENV == 'dev') ? "api.dev.dsp5-archi-o24a-15m-g3.fr" :
(params.ENV == 'preprod') ? "api.preprod.dsp5-archi-o24a-15m-g3.fr" :
"api.dsp5-archi-o24a-15m-g3.fr"
def maxRetries = 10
def statusCode = "000"
for (int i = 1; i <= maxRetries; i++) {
statusCode = sh(
script: "curl -k -s -o /dev/null -w '%{http_code}' https://${DOMAIN}/ || echo 000",
script: "curl -k -s -o /dev/null -w '%{http_code}' https://${domain}/health || echo 000",
returnStdout: true
).trim()
if (statusCode == '200') {
echo "✅ Backend opérationnel (HTTP ${statusCode}) après ${i} essai(s)"
echo "✅ Backend ${params.ENV} opérationnel (HTTP ${statusCode}) après ${i} essai(s)"
break
} else {
echo "⏳ Tentative ${i}/${maxRetries} → HTTP ${statusCode}"
@ -82,7 +139,7 @@ pipeline {
}
if (statusCode != '200') {
error("❌ Health check échoué - code HTTP ${statusCode}")
error("❌ Health check échoué sur ${params.ENV} - code HTTP ${statusCode}")
}
}
}
@ -91,10 +148,10 @@ pipeline {
post {
success {
echo "✅ Pipeline backend terminé avec succès !"
echo "✅ Pipeline backend ${params.ENV} terminé avec succès !"
}
failure {
echo "❌ Échec du pipeline backend."
echo "❌ Échec du pipeline backend pour ${params.ENV}."
}
}
}

View File

@ -34,7 +34,7 @@ app.get("/db-check", async (req, res) => {
// --- Route daccueil (fix pour 'Cannot GET /') ---
app.get("/", (req, res) => {
res.json({ message: "✅ API Thé Tip Top en ligne et opérationnelle 1200n1 !" });
res.json({ message: "✅ API Thé Tip Top en ligne et opérationnelle 000 !" });
});
// --- Monitoring Prometheus ---

48
node_modules/.package-lock.json generated vendored
View File

@ -590,7 +590,7 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/config-helpers/node_modules/@eslint/core": {
"node_modules/@eslint/core": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
@ -603,19 +603,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
"integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
@ -641,9 +628,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.38.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz",
"integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==",
"version": "9.39.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.0.tgz",
"integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==",
"dev": true,
"license": "MIT",
"engines": {
@ -677,19 +664,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@ -2566,20 +2540,20 @@
}
},
"node_modules/eslint": {
"version": "9.38.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz",
"integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==",
"version": "9.39.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz",
"integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.1",
"@eslint/config-helpers": "^0.4.1",
"@eslint/core": "^0.16.0",
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.38.0",
"@eslint/plugin-kit": "^0.4.0",
"@eslint/js": "9.39.0",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",

View File

@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,29 +0,0 @@
# ESLint Core
## Overview
This package is the future home of the rewritten, runtime-agnostic ESLint core.
Right now, it exports the core types necessary to implement language plugins.
## License
Apache 2.0
<!-- NOTE: This section is autogenerated. Do not manually edit.-->
<!--sponsorsstart-->
## Sponsors
The following companies, organizations, and individuals support ESLint's ongoing maintenance and development. [Become a Sponsor](https://eslint.org/donate)
to get your logo on our READMEs and [website](https://eslint.org/sponsors).
<h3>Platinum Sponsors</h3>
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="128"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="128"></a></p><h3>Gold Sponsors</h3>
<p><a href="https://qlty.sh/"><img src="https://images.opencollective.com/qltysh/33d157d/logo.png" alt="Qlty Software" height="96"></a> <a href="https://trunk.io/"><img src="https://images.opencollective.com/trunkio/fb92d60/avatar.png" alt="trunk.io" height="96"></a> <a href="https://shopify.engineering/"><img src="https://avatars.githubusercontent.com/u/8085" alt="Shopify" height="96"></a></p><h3>Silver Sponsors</h3>
<p><a href="https://vite.dev/"><img src="https://images.opencollective.com/vite/e6d15e1/logo.png" alt="Vite" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a> <a href="https://stackblitz.com"><img src="https://avatars.githubusercontent.com/u/28635252" alt="StackBlitz" height="64"></a></p><h3>Bronze Sponsors</h3>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<h3>Technology Sponsors</h3>
Technology sponsors allow us to use their products and services for free as part of a contribution to the open source ecosystem and our work.
<p><a href="https://netlify.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg" alt="Netlify" height="32"></a> <a href="https://algolia.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg" alt="Algolia" height="32"></a> <a href="https://1password.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg" alt="1Password" height="32"></a></p>
<!--sponsorsend-->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +0,0 @@
{
"name": "@eslint/core",
"version": "0.17.0",
"description": "Runtime-agnostic core of ESLint",
"type": "module",
"types": "./dist/esm/types.d.ts",
"exports": {
"types": {
"import": "./dist/esm/types.d.ts",
"require": "./dist/cjs/types.d.cts"
}
},
"files": [
"dist"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build:cts": "node -e \"fs.cpSync('dist/esm/types.d.ts', 'dist/cjs/types.d.cts')\"",
"build": "tsc && npm run build:cts",
"test:jsr": "npx jsr@latest publish --dry-run",
"test:types": "tsc -p tests/types/tsconfig.json"
},
"repository": {
"type": "git",
"url": "git+https://github.com/eslint/rewrite.git",
"directory": "packages/core"
},
"keywords": [
"eslint",
"core"
],
"author": "Nicholas C. Zakas",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/eslint/rewrite/issues"
},
"homepage": "https://github.com/eslint/rewrite/tree/main/packages/core#readme",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"devDependencies": {
"json-schema": "^0.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
}

View File

@ -22,7 +22,7 @@ to get your logo on our READMEs and [website](https://eslint.org/sponsors).
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="128"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="128"></a></p><h3>Gold Sponsors</h3>
<p><a href="https://qlty.sh/"><img src="https://images.opencollective.com/qltysh/33d157d/logo.png" alt="Qlty Software" height="96"></a> <a href="https://trunk.io/"><img src="https://images.opencollective.com/trunkio/fb92d60/avatar.png" alt="trunk.io" height="96"></a> <a href="https://shopify.engineering/"><img src="https://avatars.githubusercontent.com/u/8085" alt="Shopify" height="96"></a></p><h3>Silver Sponsors</h3>
<p><a href="https://vite.dev/"><img src="https://images.opencollective.com/vite/e6d15e1/logo.png" alt="Vite" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a> <a href="https://stackblitz.com"><img src="https://avatars.githubusercontent.com/u/28635252" alt="StackBlitz" height="64"></a></p><h3>Bronze Sponsors</h3>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<h3>Technology Sponsors</h3>
Technology sponsors allow us to use their products and services for free as part of a contribution to the open source ecosystem and our work.
<p><a href="https://netlify.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg" alt="Netlify" height="32"></a> <a href="https://algolia.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg" alt="Algolia" height="32"></a> <a href="https://1password.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg" alt="1Password" height="32"></a></p>

View File

@ -117,7 +117,7 @@ export interface RulesMeta<MessageIds extends string = string, RuleOptions = unk
schema?: JSONSchema4 | JSONSchema4[] | false | undefined;
/**
* Any default options to be recursively merged on top of any user-provided options.
**/
*/
defaultOptions?: RuleOptions;
/**
* The messages that the rule can report.
@ -371,12 +371,12 @@ export interface RuleTextEdit {
* @param fixer The text editor to apply the fix.
* @returns The fix(es) for the violation.
*/
type RuleFixer = (fixer: RuleTextEditor) => RuleTextEdit | Iterable<RuleTextEdit> | null;
interface ViolationReportBase {
export type RuleFixer = (fixer: RuleTextEditor) => RuleTextEdit | Iterable<RuleTextEdit> | null;
export interface ViolationReportBase {
/**
* The data to insert into the message.
*/
data?: Record<string, string> | undefined;
data?: Record<string, unknown> | undefined;
/**
* The fix to be applied for the violation.
*/
@ -387,28 +387,28 @@ interface ViolationReportBase {
*/
suggest?: SuggestedEdit[] | null | undefined;
}
type ViolationMessage<MessageIds = string> = {
export type ViolationMessage<MessageIds = string> = {
message: string;
} | {
messageId: MessageIds;
};
type ViolationLocation<Node> = {
export type ViolationLocation<Node> = {
loc: SourceLocation | Position;
} | {
node: Node;
};
export type ViolationReport<Node = unknown, MessageIds = string> = ViolationReportBase & ViolationMessage<MessageIds> & ViolationLocation<Node>;
interface SuggestedEditBase {
export interface SuggestedEditBase {
/**
* The data to insert into the message.
*/
data?: Record<string, string> | undefined;
data?: Record<string, unknown> | undefined;
/**
* The fix to be applied for the suggestion.
*/
fix?: RuleFixer | null | undefined;
fix: RuleFixer;
}
type SuggestionMessage = {
export type SuggestionMessage = {
desc: string;
} | {
messageId: string;
@ -420,7 +420,7 @@ export type SuggestedEdit = SuggestedEditBase & SuggestionMessage;
/**
* The normalized version of a lint suggestion.
*/
interface LintSuggestion {
export interface LintSuggestion {
/** A short description. */
desc: string;
/** Fix result info. */
@ -662,7 +662,7 @@ export type EcmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
* The type of JavaScript source code.
* @deprecated Only supported in legacy eslintrc config format.
*/
type JavaScriptSourceType = "script" | "module" | "commonjs";
export type JavaScriptSourceType = "script" | "module" | "commonjs";
/**
* Parser options.
* @deprecated Only supported in legacy eslintrc config format.
@ -723,7 +723,7 @@ export interface EnvironmentConfig {
/**
* A configuration object that may have a `rules` block.
*/
interface HasRules<Rules extends RulesConfig = RulesConfig> {
export interface HasRules<Rules extends RulesConfig = RulesConfig> {
rules?: Partial<Rules> | undefined;
}
/**
@ -731,7 +731,7 @@ interface HasRules<Rules extends RulesConfig = RulesConfig> {
*
* @see [ESLint Legacy Configuration](https://eslint.org/docs/latest/use/configure/)
*/
interface BaseConfig<Rules extends RulesConfig = RulesConfig, OverrideRules extends RulesConfig = Rules> extends HasRules<Rules> {
export interface BaseConfig<Rules extends RulesConfig = RulesConfig, OverrideRules extends RulesConfig = Rules> extends HasRules<Rules> {
$schema?: string | undefined;
/**
* An environment provides predefined global variables.

View File

@ -117,7 +117,7 @@ export interface RulesMeta<MessageIds extends string = string, RuleOptions = unk
schema?: JSONSchema4 | JSONSchema4[] | false | undefined;
/**
* Any default options to be recursively merged on top of any user-provided options.
**/
*/
defaultOptions?: RuleOptions;
/**
* The messages that the rule can report.
@ -371,12 +371,12 @@ export interface RuleTextEdit {
* @param fixer The text editor to apply the fix.
* @returns The fix(es) for the violation.
*/
type RuleFixer = (fixer: RuleTextEditor) => RuleTextEdit | Iterable<RuleTextEdit> | null;
interface ViolationReportBase {
export type RuleFixer = (fixer: RuleTextEditor) => RuleTextEdit | Iterable<RuleTextEdit> | null;
export interface ViolationReportBase {
/**
* The data to insert into the message.
*/
data?: Record<string, string> | undefined;
data?: Record<string, unknown> | undefined;
/**
* The fix to be applied for the violation.
*/
@ -387,28 +387,28 @@ interface ViolationReportBase {
*/
suggest?: SuggestedEdit[] | null | undefined;
}
type ViolationMessage<MessageIds = string> = {
export type ViolationMessage<MessageIds = string> = {
message: string;
} | {
messageId: MessageIds;
};
type ViolationLocation<Node> = {
export type ViolationLocation<Node> = {
loc: SourceLocation | Position;
} | {
node: Node;
};
export type ViolationReport<Node = unknown, MessageIds = string> = ViolationReportBase & ViolationMessage<MessageIds> & ViolationLocation<Node>;
interface SuggestedEditBase {
export interface SuggestedEditBase {
/**
* The data to insert into the message.
*/
data?: Record<string, string> | undefined;
data?: Record<string, unknown> | undefined;
/**
* The fix to be applied for the suggestion.
*/
fix?: RuleFixer | null | undefined;
fix: RuleFixer;
}
type SuggestionMessage = {
export type SuggestionMessage = {
desc: string;
} | {
messageId: string;
@ -420,7 +420,7 @@ export type SuggestedEdit = SuggestedEditBase & SuggestionMessage;
/**
* The normalized version of a lint suggestion.
*/
interface LintSuggestion {
export interface LintSuggestion {
/** A short description. */
desc: string;
/** Fix result info. */
@ -662,7 +662,7 @@ export type EcmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
* The type of JavaScript source code.
* @deprecated Only supported in legacy eslintrc config format.
*/
type JavaScriptSourceType = "script" | "module" | "commonjs";
export type JavaScriptSourceType = "script" | "module" | "commonjs";
/**
* Parser options.
* @deprecated Only supported in legacy eslintrc config format.
@ -723,7 +723,7 @@ export interface EnvironmentConfig {
/**
* A configuration object that may have a `rules` block.
*/
interface HasRules<Rules extends RulesConfig = RulesConfig> {
export interface HasRules<Rules extends RulesConfig = RulesConfig> {
rules?: Partial<Rules> | undefined;
}
/**
@ -731,7 +731,7 @@ interface HasRules<Rules extends RulesConfig = RulesConfig> {
*
* @see [ESLint Legacy Configuration](https://eslint.org/docs/latest/use/configure/)
*/
interface BaseConfig<Rules extends RulesConfig = RulesConfig, OverrideRules extends RulesConfig = Rules> extends HasRules<Rules> {
export interface BaseConfig<Rules extends RulesConfig = RulesConfig, OverrideRules extends RulesConfig = Rules> extends HasRules<Rules> {
$schema?: string | undefined;
/**
* An environment provides predefined global variables.

View File

@ -1,6 +1,6 @@
{
"name": "@eslint/core",
"version": "0.16.0",
"version": "0.17.0",
"description": "Runtime-agnostic core of ESLint",
"type": "module",
"types": "./dist/esm/types.d.ts",

View File

@ -1,6 +1,6 @@
{
"name": "@eslint/js",
"version": "9.38.0",
"version": "9.39.0",
"description": "ESLint JavaScript language implementation",
"funding": "https://eslint.org/donate",
"main": "./src/index.js",

View File

@ -1,13 +1,9 @@
/**
* @fileoverview Configuration applied when a user configuration extends from
* eslint:recommended.
* @author Nicholas C. Zakas
/*
* WARNING: This file is autogenerated using the tools/update-eslint-recommended.js
* script. Do not edit manually.
*/
"use strict";
/* eslint sort-keys: ["error", "asc"] -- Long, so make more readable */
/*
* IMPORTANT!
*
@ -17,67 +13,67 @@
*/
module.exports = Object.freeze({
rules: Object.freeze({
"constructor-super": "error",
"for-direction": "error",
"getter-return": "error",
"no-async-promise-executor": "error",
"no-case-declarations": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error",
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-else-if": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-empty-static-block": "error",
"no-ex-assign": "error",
"no-extra-boolean-cast": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-new-native-nonconstructor": "error",
"no-nonoctal-decimal-escape": "error",
"no-obj-calls": "error",
"no-octal": "error",
"no-prototype-builtins": "error",
"no-redeclare": "error",
"no-regex-spaces": "error",
"no-self-assign": "error",
"no-setter-return": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error",
"no-undef": "error",
"no-unexpected-multiline": "error",
"no-unreachable": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error",
"no-unused-labels": "error",
"no-unused-private-class-members": "error",
"no-unused-vars": "error",
"no-useless-backreference": "error",
"no-useless-catch": "error",
"no-useless-escape": "error",
"no-with": "error",
"require-yield": "error",
"use-isnan": "error",
"valid-typeof": "error",
}),
rules: Object.freeze({
"constructor-super": "error",
"for-direction": "error",
"getter-return": "error",
"no-async-promise-executor": "error",
"no-case-declarations": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error",
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-else-if": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-empty-static-block": "error",
"no-ex-assign": "error",
"no-extra-boolean-cast": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-new-native-nonconstructor": "error",
"no-nonoctal-decimal-escape": "error",
"no-obj-calls": "error",
"no-octal": "error",
"no-prototype-builtins": "error",
"no-redeclare": "error",
"no-regex-spaces": "error",
"no-self-assign": "error",
"no-setter-return": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error",
"no-undef": "error",
"no-unexpected-multiline": "error",
"no-unreachable": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error",
"no-unused-labels": "error",
"no-unused-private-class-members": "error",
"no-unused-vars": "error",
"no-useless-backreference": "error",
"no-useless-catch": "error",
"no-useless-escape": "error",
"no-with": "error",
"require-yield": "error",
"use-isnan": "error",
"valid-typeof": "error"
}),
});

View File

@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,29 +0,0 @@
# ESLint Core
## Overview
This package is the future home of the rewritten, runtime-agnostic ESLint core.
Right now, it exports the core types necessary to implement language plugins.
## License
Apache 2.0
<!-- NOTE: This section is autogenerated. Do not manually edit.-->
<!--sponsorsstart-->
## Sponsors
The following companies, organizations, and individuals support ESLint's ongoing maintenance and development. [Become a Sponsor](https://eslint.org/donate)
to get your logo on our READMEs and [website](https://eslint.org/sponsors).
<h3>Platinum Sponsors</h3>
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="128"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="128"></a></p><h3>Gold Sponsors</h3>
<p><a href="https://qlty.sh/"><img src="https://images.opencollective.com/qltysh/33d157d/logo.png" alt="Qlty Software" height="96"></a> <a href="https://trunk.io/"><img src="https://images.opencollective.com/trunkio/fb92d60/avatar.png" alt="trunk.io" height="96"></a> <a href="https://shopify.engineering/"><img src="https://avatars.githubusercontent.com/u/8085" alt="Shopify" height="96"></a></p><h3>Silver Sponsors</h3>
<p><a href="https://vite.dev/"><img src="https://images.opencollective.com/vite/e6d15e1/logo.png" alt="Vite" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a> <a href="https://stackblitz.com"><img src="https://avatars.githubusercontent.com/u/28635252" alt="StackBlitz" height="64"></a></p><h3>Bronze Sponsors</h3>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<h3>Technology Sponsors</h3>
Technology sponsors allow us to use their products and services for free as part of a contribution to the open source ecosystem and our work.
<p><a href="https://netlify.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg" alt="Netlify" height="32"></a> <a href="https://algolia.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg" alt="Algolia" height="32"></a> <a href="https://1password.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg" alt="1Password" height="32"></a></p>
<!--sponsorsend-->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +0,0 @@
{
"name": "@eslint/core",
"version": "0.17.0",
"description": "Runtime-agnostic core of ESLint",
"type": "module",
"types": "./dist/esm/types.d.ts",
"exports": {
"types": {
"import": "./dist/esm/types.d.ts",
"require": "./dist/cjs/types.d.cts"
}
},
"files": [
"dist"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build:cts": "node -e \"fs.cpSync('dist/esm/types.d.ts', 'dist/cjs/types.d.cts')\"",
"build": "tsc && npm run build:cts",
"test:jsr": "npx jsr@latest publish --dry-run",
"test:types": "tsc -p tests/types/tsconfig.json"
},
"repository": {
"type": "git",
"url": "git+https://github.com/eslint/rewrite.git",
"directory": "packages/core"
},
"keywords": [
"eslint",
"core"
],
"author": "Nicholas C. Zakas",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/eslint/rewrite/issues"
},
"homepage": "https://github.com/eslint/rewrite/tree/main/packages/core#readme",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"devDependencies": {
"json-schema": "^0.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
}

4
node_modules/eslint/README.md generated vendored
View File

@ -342,8 +342,8 @@ to get your logo on our READMEs and [website](https://eslint.org/sponsors).
<h3>Platinum Sponsors</h3>
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="128"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="128"></a></p><h3>Gold Sponsors</h3>
<p><a href="https://qlty.sh/"><img src="https://images.opencollective.com/qltysh/33d157d/logo.png" alt="Qlty Software" height="96"></a> <a href="https://trunk.io/"><img src="https://images.opencollective.com/trunkio/fb92d60/avatar.png" alt="trunk.io" height="96"></a> <a href="https://shopify.engineering/"><img src="https://avatars.githubusercontent.com/u/8085" alt="Shopify" height="96"></a></p><h3>Silver Sponsors</h3>
<p><a href="https://vite.dev/"><img src="https://images.opencollective.com/vite/e6d15e1/logo.png" alt="Vite" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a> <a href="https://stackblitz.com"><img src="https://avatars.githubusercontent.com/u/28635252" alt="StackBlitz" height="64"></a></p><h3>Bronze Sponsors</h3>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<p><a href="https://vite.dev/"><img src="https://images.opencollective.com/vite/e6d15e1/logo.png" alt="Vite" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/2d6c3b6/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a> <a href="https://stackblitz.com"><img src="https://avatars.githubusercontent.com/u/28635252" alt="StackBlitz" height="64"></a></p><h3>Bronze Sponsors</h3>
<p><a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://sentry.io"><img src="https://github.com/getsentry.png" alt="Sentry" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a> <a href="https://www.lambdatest.com"><img src="https://avatars.githubusercontent.com/u/171592363" alt="LambdaTest" height="32"></a></p>
<h3>Technology Sponsors</h3>
Technology sponsors allow us to use their products and services for free as part of a contribution to the open source ecosystem and our work.
<p><a href="https://netlify.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg" alt="Netlify" height="32"></a> <a href="https://algolia.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg" alt="Algolia" height="32"></a> <a href="https://1password.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg" alt="1Password" height="32"></a></p>

View File

@ -17,6 +17,7 @@ const { pathToFileURL } = require("node:url");
const { SHARE_ENV, Worker } = require("node:worker_threads");
const { version } = require("../../package.json");
const { defaultConfig } = require("../config/default-config");
const timing = require("../linter/timing");
const {
createDebug,
@ -503,6 +504,11 @@ async function runWorkers(
worstNetLintingRatio,
netLintingRatio,
);
if (timing.enabled && indexedResults.timings) {
timing.mergeData(indexedResults.timings);
}
for (const result of indexedResults) {
const { index } = result;
delete result.index;
@ -522,7 +528,17 @@ async function runWorkers(
for (let index = 0; index < workerCount; ++index) {
promises[index] = new Promise(workerExecutor);
}
await Promise.all(promises);
try {
await Promise.all(promises);
} catch (error) {
/*
* If any worker fails, suppress timing display in the main thread
* to avoid printing partial or misleading timing output.
*/
timing.disableDisplay();
throw error;
}
if (worstNetLintingRatio < LOW_NET_LINTING_RATIO) {
warnOnLowNetLintingRatio();

View File

@ -29,6 +29,7 @@ const {
processOptions,
} = require("./eslint-helpers");
const { WarningService } = require("../services/warning-service");
const timing = require("../linter/timing");
const depsLoadedTime = hrtimeBigint();
@ -39,7 +40,7 @@ const depsLoadedTime = hrtimeBigint();
/** @typedef {import("../types").ESLint.LintResult} LintResult */
/** @typedef {import("../types").ESLint.Options} ESLintOptions */
/** @typedef {LintResult & { index?: number; }} IndexedLintResult */
/** @typedef {IndexedLintResult[] & { netLintingDuration: bigint; }} WorkerLintResults */
/** @typedef {IndexedLintResult[] & { netLintingDuration: bigint; timings?: Record<string, number>; }} WorkerLintResults */
/**
* @typedef {Object} WorkerData - Data passed to the worker thread.
* @property {ESLintOptions | string} eslintOptionsOrURL - The unprocessed ESLint options or the URL of the options module.
@ -57,6 +58,12 @@ const debug = createDebug(`eslint:worker:thread-${threadId}`);
// Main
//------------------------------------------------------------------------------
/*
* Prevent timing module from printing profiling output from worker threads.
* The main thread is responsible for displaying any aggregated timings.
*/
timing.disableDisplay();
debug("Dependencies loaded in %t", depsLoadedTime - startTime);
(async () => {
@ -158,5 +165,9 @@ debug("Dependencies loaded in %t", depsLoadedTime - startTime);
indexedResults.netLintingDuration =
lintingDuration - loadConfigTotalDuration - readFileCounter.duration;
if (timing.enabled) {
indexedResults.timings = timing.getData();
}
parentPort.postMessage(indexedResults);
})();

View File

@ -426,7 +426,7 @@ function validateSuggestions(suggest, messages) {
if (typeof suggestion.fix !== "function") {
throw new TypeError(
`context.report() called with a suggest option without a fix function. See: ${suggestion}`,
`context.report() called with a suggest option without a fix function. See: ${JSON.stringify(suggestion, null, 2)}`,
);
}
});

View File

@ -17,8 +17,9 @@ const vk = require("eslint-visitor-keys");
//-----------------------------------------------------------------------------
/**
* @import { ESQueryParsedSelector } from "./esquery.js";
* @import { Language, SourceCode } from "@eslint/core";
* @import { ESQueryOptions } from "esquery";
* @import { ESQueryParsedSelector } from "./esquery.js";
* @import { SourceCodeVisitor } from "./source-code-visitor.js";
*/
@ -47,11 +48,10 @@ class ESQueryHelper {
* Creates a new instance.
* @param {SourceCodeVisitor} visitor The visitor containing the functions to call.
* @param {ESQueryOptions} esqueryOptions `esquery` options for traversing custom nodes.
* @returns {NodeEventGenerator} new instance
*/
constructor(visitor, esqueryOptions) {
/**
* The emitter to use during traversal.
* The visitor to use during traversal.
* @type {SourceCodeVisitor}
*/
this.visitor = visitor;
@ -288,7 +288,10 @@ class SourceCodeTraverser {
false,
)
.forEach(selector => {
visitor.callSync(selector, step.target);
visitor.callSync(
selector,
...(step.args ?? [step.target]),
);
});
currentAncestry.unshift(step.target);
} else {
@ -300,7 +303,10 @@ class SourceCodeTraverser {
true,
)
.forEach(selector => {
visitor.callSync(selector, step.target);
visitor.callSync(
selector,
...(step.args ?? [step.target]),
);
});
}
} catch (err) {

View File

@ -131,6 +131,7 @@ function display(data) {
/* c8 ignore next */
module.exports = (function () {
const data = Object.create(null);
let displayEnabled = true;
/**
* Time the run
@ -158,9 +159,42 @@ module.exports = (function () {
};
}
/**
* Returns a shallow copy of the collected timings data.
* @returns {Record<string, number>} mapping of ruleId to total time in ms
*/
function getData() {
return { ...data };
}
/**
* Merges rule timing totals collected elsewhere into this process' totals.
* @param {Record<string, number>} dataToMerge mapping of ruleId to total time in ms
* @returns {void}
*/
function mergeData(dataToMerge) {
for (const [key, value] of Object.entries(dataToMerge)) {
if (typeof data[key] === "undefined") {
data[key] = 0;
}
data[key] += value;
}
}
/**
* Disables printing of timing data on process exit.
* Intended for worker threads or non-main contexts.
* @returns {void}
*/
function disableDisplay() {
displayEnabled = false;
}
if (enabled) {
process.on("exit", () => {
display(data);
if (displayEnabled && Object.keys(data).length > 0) {
display(data);
}
});
}
@ -168,5 +202,8 @@ module.exports = (function () {
time,
enabled,
getListSize,
getData,
mergeData,
disableDisplay,
};
})();

View File

@ -68,6 +68,7 @@ module.exports = {
},
create(context) {
const sourceCode = context.sourceCode;
const option = context.options[0];
let threshold = THRESHOLD_DEFAULT;
let VARIANT = "classic";
@ -177,12 +178,10 @@ module.exports = {
name = "class field initializer";
} else if (codePath.origin === "class-static-block") {
name = "class static block";
loc = sourceCode.getFirstToken(node).loc;
} else {
name = astUtils.getFunctionNameWithKind(node);
loc = astUtils.getFunctionHeadLoc(
node,
context.sourceCode,
);
loc = astUtils.getFunctionHeadLoc(node, sourceCode);
}
context.report({

View File

@ -46,7 +46,10 @@ module.exports = {
*/
function report(node) {
context.report({
node,
loc: {
start: node.loc.start,
end: sourceCode.getTokenBefore(node.body).loc.end,
},
messageId: "incorrectDirection",
});
}

View File

@ -5,6 +5,12 @@
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const astUtils = require("./utils/ast-utils");
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
@ -58,10 +64,15 @@ module.exports = {
// Checks and reports duplications.
const defs = variable.defs.filter(isParameter);
const loc = {
start: astUtils.getOpeningParenOfParams(node, sourceCode)
.loc.start,
end: sourceCode.getTokenBefore(node.body).loc.end,
};
if (defs.length >= 2) {
context.report({
node,
loc,
messageId: "unexpected",
data: { name: variable.name },
});

View File

@ -106,7 +106,7 @@ module.exports = {
if (isDuplicate) {
context.report({
node,
loc: node.key.loc,
messageId: "unexpected",
data: { name },
});

View File

@ -19,6 +19,86 @@ const OPTIONS = {
//------------------------------------------------------------------------------
const astUtils = require("./utils/ast-utils");
//--------------------------------------------------------------------------
// Helpers
//--------------------------------------------------------------------------
const CTOR_PREFIX_REGEX = /[^_$0-9]/u;
const JSDOC_COMMENT_REGEX = /^\s*\*/u;
/**
* Determines if the first character of the name is a capital letter.
* @param {string} name The name of the node to evaluate.
* @returns {boolean} True if the first character of the property name is a capital letter, false if not.
* @private
*/
function isConstructor(name) {
const match = CTOR_PREFIX_REGEX.exec(name);
// Not a constructor if name has no characters apart from '_', '$' and digits e.g. '_', '$$', '_8'
if (!match) {
return false;
}
const firstChar = name.charAt(match.index);
return firstChar === firstChar.toUpperCase();
}
/**
* Determines if the property can have a shorthand form.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the property can have a shorthand form
* @private
*/
function canHaveShorthand(property) {
return (
property.kind !== "set" &&
property.kind !== "get" &&
property.type !== "SpreadElement" &&
property.type !== "SpreadProperty" &&
property.type !== "ExperimentalSpreadProperty"
);
}
/**
* Checks whether a node is a string literal.
* @param {ASTNode} node Any AST node.
* @returns {boolean} `true` if it is a string literal.
*/
function isStringLiteral(node) {
return node.type === "Literal" && typeof node.value === "string";
}
/**
* Determines if the property is a shorthand or not.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the property is considered shorthand, false if not.
* @private
*/
function isShorthand(property) {
// property.method is true when `{a(){}}`.
return property.shorthand || property.method;
}
/**
* Determines if the property's key and method or value are named equally.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the key and value are named equally, false if not.
* @private
*/
function isRedundant(property) {
const value = property.value;
if (value.type === "FunctionExpression") {
return !value.id; // Only anonymous should be shorthand method.
}
if (value.type === "Identifier") {
return astUtils.getStaticPropertyName(property) === value.name;
}
return false;
}
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
@ -139,86 +219,6 @@ module.exports = {
const AVOID_EXPLICIT_RETURN_ARROWS = !!PARAMS.avoidExplicitReturnArrows;
const sourceCode = context.sourceCode;
//--------------------------------------------------------------------------
// Helpers
//--------------------------------------------------------------------------
const CTOR_PREFIX_REGEX = /[^_$0-9]/u;
/**
* Determines if the first character of the name is a capital letter.
* @param {string} name The name of the node to evaluate.
* @returns {boolean} True if the first character of the property name is a capital letter, false if not.
* @private
*/
function isConstructor(name) {
const match = CTOR_PREFIX_REGEX.exec(name);
// Not a constructor if name has no characters apart from '_', '$' and digits e.g. '_', '$$', '_8'
if (!match) {
return false;
}
const firstChar = name.charAt(match.index);
return firstChar === firstChar.toUpperCase();
}
/**
* Determines if the property can have a shorthand form.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the property can have a shorthand form
* @private
*/
function canHaveShorthand(property) {
return (
property.kind !== "set" &&
property.kind !== "get" &&
property.type !== "SpreadElement" &&
property.type !== "SpreadProperty" &&
property.type !== "ExperimentalSpreadProperty"
);
}
/**
* Checks whether a node is a string literal.
* @param {ASTNode} node Any AST node.
* @returns {boolean} `true` if it is a string literal.
*/
function isStringLiteral(node) {
return node.type === "Literal" && typeof node.value === "string";
}
/**
* Determines if the property is a shorthand or not.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the property is considered shorthand, false if not.
* @private
*/
function isShorthand(property) {
// property.method is true when `{a(){}}`.
return property.shorthand || property.method;
}
/**
* Determines if the property's key and method or value are named equally.
* @param {ASTNode} property Property AST node
* @returns {boolean} True if the key and value are named equally, false if not.
* @private
*/
function isRedundant(property) {
const value = property.value;
if (value.type === "FunctionExpression") {
return !value.id; // Only anonymous should be shorthand method.
}
if (value.type === "Identifier") {
return astUtils.getStaticPropertyName(property) === value.name;
}
return false;
}
/**
* Ensures that an object's properties are consistently shorthand, or not shorthand at all.
* @param {ASTNode} node Property AST node
@ -582,6 +582,19 @@ module.exports = {
node.key.name === node.value.name &&
APPLY_TO_PROPS
) {
// Skip if there are JSDoc comments inside the property (e.g., JSDoc type annotations)
const comments = sourceCode.getCommentsInside(node);
if (
comments.some(
comment =>
comment.type === "Block" &&
JSDOC_COMMENT_REGEX.test(comment.value) &&
comment.value.includes("@type"),
)
) {
return;
}
// {x: x} should be written as {x}
context.report({
node,
@ -606,6 +619,18 @@ module.exports = {
return;
}
const comments = sourceCode.getCommentsInside(node);
if (
comments.some(
comment =>
comment.type === "Block" &&
comment.value.startsWith("*") &&
comment.value.includes("@type"),
)
) {
return;
}
// {"x": x} should be written as {x}
context.report({
node,

View File

@ -2729,4 +2729,5 @@ module.exports = {
isStartOfExpressionStatement,
needsPrecedingSemicolon,
isImportAttributeKey,
getOpeningParenOfParams,
};

View File

@ -33,7 +33,6 @@ import type {
LanguageOptions as GenericLanguageOptions,
RuleContext as CoreRuleContext,
RuleDefinition,
RuleVisitor,
SourceRange,
TextSourceCode,
TraversalStep,
@ -56,11 +55,40 @@ import type {
ProcessorFile as CoreProcessorFile,
JavaScriptParserOptionsConfig,
RulesMeta,
RuleConfig,
RuleTextEditor,
RuleTextEdit,
RuleVisitor,
BaseConfig as CoreBaseConfig,
RuleFixer as CoreRuleFixer,
ViolationReportBase,
ViolationMessage,
ViolationLocation,
SuggestionMessage,
LintSuggestion as CoreLintSuggestion,
JavaScriptSourceType,
HasRules as CoreHasRules,
SuggestedEditBase,
SuggestedEdit,
ViolationReport,
} from "@eslint/core";
import { LegacyESLint } from "./use-at-your-own-risk.js";
//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------
/** Adds matching `:exit` selectors for all properties of a `RuleVisitor`. */
type WithExit<RuleVisitorType extends RuleVisitor> = {
[Key in keyof RuleVisitorType as
| Key
| `${Key & string}:exit`]: RuleVisitorType[Key];
};
//------------------------------------------------------------------------------
// Exports
//------------------------------------------------------------------------------
export namespace AST {
type TokenType =
| "Boolean"
@ -133,6 +161,10 @@ export namespace Scope {
references: Reference[];
through: Reference[];
functionExpressionScope: boolean;
implicit?: {
variables: Variable[];
set: Map<string, Variable>;
};
}
interface Variable {
@ -173,7 +205,14 @@ export namespace Scope {
node: ESTree.FunctionDeclaration | ESTree.FunctionExpression;
parent: null;
}
| { type: "ImplicitGlobalVariable"; node: ESTree.Program; parent: null }
| {
type: "ImplicitGlobalVariable";
node:
| ESTree.AssignmentExpression
| ESTree.ForInStatement
| ESTree.ForOfStatement;
parent: null;
}
| {
type: "ImportBinding";
node:
@ -640,480 +679,35 @@ export namespace Rule {
LangOptions: Linter.LanguageOptions;
Code: SourceCode;
RuleOptions: any[];
Visitor: NodeListener;
Visitor: RuleListener;
Node: JSSyntaxElement;
MessageIds: string;
ExtRuleDocs: {};
}> {
create(context: RuleContext): NodeListener;
create(context: RuleContext): RuleListener;
}
type NodeTypes = ESTree.Node["type"];
interface NodeListener extends RuleVisitor {
ArrayExpression?:
| ((node: ESTree.ArrayExpression & NodeParentExtension) => void)
| undefined;
"ArrayExpression:exit"?:
| ((node: ESTree.ArrayExpression & NodeParentExtension) => void)
| undefined;
ArrayPattern?:
| ((node: ESTree.ArrayPattern & NodeParentExtension) => void)
| undefined;
"ArrayPattern:exit"?:
| ((node: ESTree.ArrayPattern & NodeParentExtension) => void)
| undefined;
ArrowFunctionExpression?:
| ((
node: ESTree.ArrowFunctionExpression & NodeParentExtension,
) => void)
| undefined;
"ArrowFunctionExpression:exit"?:
| ((
node: ESTree.ArrowFunctionExpression & NodeParentExtension,
) => void)
| undefined;
AssignmentExpression?:
| ((
node: ESTree.AssignmentExpression & NodeParentExtension,
) => void)
| undefined;
"AssignmentExpression:exit"?:
| ((
node: ESTree.AssignmentExpression & NodeParentExtension,
) => void)
| undefined;
AssignmentPattern?:
| ((node: ESTree.AssignmentPattern & NodeParentExtension) => void)
| undefined;
"AssignmentPattern:exit"?:
| ((node: ESTree.AssignmentPattern & NodeParentExtension) => void)
| undefined;
AwaitExpression?:
| ((node: ESTree.AwaitExpression & NodeParentExtension) => void)
| undefined;
"AwaitExpression:exit"?:
| ((node: ESTree.AwaitExpression & NodeParentExtension) => void)
| undefined;
BinaryExpression?:
| ((node: ESTree.BinaryExpression & NodeParentExtension) => void)
| undefined;
"BinaryExpression:exit"?:
| ((node: ESTree.BinaryExpression & NodeParentExtension) => void)
| undefined;
BlockStatement?:
| ((node: ESTree.BlockStatement & NodeParentExtension) => void)
| undefined;
"BlockStatement:exit"?:
| ((node: ESTree.BlockStatement & NodeParentExtension) => void)
| undefined;
BreakStatement?:
| ((node: ESTree.BreakStatement & NodeParentExtension) => void)
| undefined;
"BreakStatement:exit"?:
| ((node: ESTree.BreakStatement & NodeParentExtension) => void)
| undefined;
CallExpression?:
| ((node: ESTree.CallExpression & NodeParentExtension) => void)
| undefined;
"CallExpression:exit"?:
| ((node: ESTree.CallExpression & NodeParentExtension) => void)
| undefined;
CatchClause?:
| ((node: ESTree.CatchClause & NodeParentExtension) => void)
| undefined;
"CatchClause:exit"?:
| ((node: ESTree.CatchClause & NodeParentExtension) => void)
| undefined;
ChainExpression?:
| ((node: ESTree.ChainExpression & NodeParentExtension) => void)
| undefined;
"ChainExpression:exit"?:
| ((node: ESTree.ChainExpression & NodeParentExtension) => void)
| undefined;
ClassBody?:
| ((node: ESTree.ClassBody & NodeParentExtension) => void)
| undefined;
"ClassBody:exit"?:
| ((node: ESTree.ClassBody & NodeParentExtension) => void)
| undefined;
ClassDeclaration?:
| ((node: ESTree.ClassDeclaration & NodeParentExtension) => void)
| undefined;
"ClassDeclaration:exit"?:
| ((node: ESTree.ClassDeclaration & NodeParentExtension) => void)
| undefined;
ClassExpression?:
| ((node: ESTree.ClassExpression & NodeParentExtension) => void)
| undefined;
"ClassExpression:exit"?:
| ((node: ESTree.ClassExpression & NodeParentExtension) => void)
| undefined;
ConditionalExpression?:
| ((
node: ESTree.ConditionalExpression & NodeParentExtension,
) => void)
| undefined;
"ConditionalExpression:exit"?:
| ((
node: ESTree.ConditionalExpression & NodeParentExtension,
) => void)
| undefined;
ContinueStatement?:
| ((node: ESTree.ContinueStatement & NodeParentExtension) => void)
| undefined;
"ContinueStatement:exit"?:
| ((node: ESTree.ContinueStatement & NodeParentExtension) => void)
| undefined;
DebuggerStatement?:
| ((node: ESTree.DebuggerStatement & NodeParentExtension) => void)
| undefined;
"DebuggerStatement:exit"?:
| ((node: ESTree.DebuggerStatement & NodeParentExtension) => void)
| undefined;
DoWhileStatement?:
| ((node: ESTree.DoWhileStatement & NodeParentExtension) => void)
| undefined;
"DoWhileStatement:exit"?:
| ((node: ESTree.DoWhileStatement & NodeParentExtension) => void)
| undefined;
EmptyStatement?:
| ((node: ESTree.EmptyStatement & NodeParentExtension) => void)
| undefined;
"EmptyStatement:exit"?:
| ((node: ESTree.EmptyStatement & NodeParentExtension) => void)
| undefined;
ExportAllDeclaration?:
| ((
node: ESTree.ExportAllDeclaration & NodeParentExtension,
) => void)
| undefined;
"ExportAllDeclaration:exit"?:
| ((
node: ESTree.ExportAllDeclaration & NodeParentExtension,
) => void)
| undefined;
ExportDefaultDeclaration?:
| ((
node: ESTree.ExportDefaultDeclaration & NodeParentExtension,
) => void)
| undefined;
"ExportDefaultDeclaration:exit"?:
| ((
node: ESTree.ExportDefaultDeclaration & NodeParentExtension,
) => void)
| undefined;
ExportNamedDeclaration?:
| ((
node: ESTree.ExportNamedDeclaration & NodeParentExtension,
) => void)
| undefined;
"ExportNamedDeclaration:exit"?:
| ((
node: ESTree.ExportNamedDeclaration & NodeParentExtension,
) => void)
| undefined;
ExportSpecifier?:
| ((node: ESTree.ExportSpecifier & NodeParentExtension) => void)
| undefined;
"ExportSpecifier:exit"?:
| ((node: ESTree.ExportSpecifier & NodeParentExtension) => void)
| undefined;
ExpressionStatement?:
| ((node: ESTree.ExpressionStatement & NodeParentExtension) => void)
| undefined;
"ExpressionStatement:exit"?:
| ((node: ESTree.ExpressionStatement & NodeParentExtension) => void)
| undefined;
ForInStatement?:
| ((node: ESTree.ForInStatement & NodeParentExtension) => void)
| undefined;
"ForInStatement:exit"?:
| ((node: ESTree.ForInStatement & NodeParentExtension) => void)
| undefined;
ForOfStatement?:
| ((node: ESTree.ForOfStatement & NodeParentExtension) => void)
| undefined;
"ForOfStatement:exit"?:
| ((node: ESTree.ForOfStatement & NodeParentExtension) => void)
| undefined;
ForStatement?:
| ((node: ESTree.ForStatement & NodeParentExtension) => void)
| undefined;
"ForStatement:exit"?:
| ((node: ESTree.ForStatement & NodeParentExtension) => void)
| undefined;
FunctionDeclaration?:
| ((node: ESTree.FunctionDeclaration & NodeParentExtension) => void)
| undefined;
"FunctionDeclaration:exit"?:
| ((node: ESTree.FunctionDeclaration & NodeParentExtension) => void)
| undefined;
FunctionExpression?:
| ((node: ESTree.FunctionExpression & NodeParentExtension) => void)
| undefined;
"FunctionExpression:exit"?:
| ((node: ESTree.FunctionExpression & NodeParentExtension) => void)
| undefined;
Identifier?:
| ((node: ESTree.Identifier & NodeParentExtension) => void)
| undefined;
"Identifier:exit"?:
| ((node: ESTree.Identifier & NodeParentExtension) => void)
| undefined;
IfStatement?:
| ((node: ESTree.IfStatement & NodeParentExtension) => void)
| undefined;
"IfStatement:exit"?:
| ((node: ESTree.IfStatement & NodeParentExtension) => void)
| undefined;
ImportDeclaration?:
| ((node: ESTree.ImportDeclaration & NodeParentExtension) => void)
| undefined;
"ImportDeclaration:exit"?:
| ((node: ESTree.ImportDeclaration & NodeParentExtension) => void)
| undefined;
ImportDefaultSpecifier?:
| ((
node: ESTree.ImportDefaultSpecifier & NodeParentExtension,
) => void)
| undefined;
"ImportDefaultSpecifier:exit"?:
| ((
node: ESTree.ImportDefaultSpecifier & NodeParentExtension,
) => void)
| undefined;
ImportExpression?:
| ((node: ESTree.ImportExpression & NodeParentExtension) => void)
| undefined;
"ImportExpression:exit"?:
| ((node: ESTree.ImportExpression & NodeParentExtension) => void)
| undefined;
ImportNamespaceSpecifier?:
| ((
node: ESTree.ImportNamespaceSpecifier & NodeParentExtension,
) => void)
| undefined;
"ImportNamespaceSpecifier:exit"?:
| ((
node: ESTree.ImportNamespaceSpecifier & NodeParentExtension,
) => void)
| undefined;
ImportSpecifier?:
| ((node: ESTree.ImportSpecifier & NodeParentExtension) => void)
| undefined;
"ImportSpecifier:exit"?:
| ((node: ESTree.ImportSpecifier & NodeParentExtension) => void)
| undefined;
LabeledStatement?:
| ((node: ESTree.LabeledStatement & NodeParentExtension) => void)
| undefined;
"LabeledStatement:exit"?:
| ((node: ESTree.LabeledStatement & NodeParentExtension) => void)
| undefined;
Literal?:
| ((node: ESTree.Literal & NodeParentExtension) => void)
| undefined;
"Literal:exit"?:
| ((node: ESTree.Literal & NodeParentExtension) => void)
| undefined;
LogicalExpression?:
| ((node: ESTree.LogicalExpression & NodeParentExtension) => void)
| undefined;
"LogicalExpression:exit"?:
| ((node: ESTree.LogicalExpression & NodeParentExtension) => void)
| undefined;
MemberExpression?:
| ((node: ESTree.MemberExpression & NodeParentExtension) => void)
| undefined;
"MemberExpression:exit"?:
| ((node: ESTree.MemberExpression & NodeParentExtension) => void)
| undefined;
MetaProperty?:
| ((node: ESTree.MetaProperty & NodeParentExtension) => void)
| undefined;
"MetaProperty:exit"?:
| ((node: ESTree.MetaProperty & NodeParentExtension) => void)
| undefined;
MethodDefinition?:
| ((node: ESTree.MethodDefinition & NodeParentExtension) => void)
| undefined;
"MethodDefinition:exit"?:
| ((node: ESTree.MethodDefinition & NodeParentExtension) => void)
| undefined;
NewExpression?:
| ((node: ESTree.NewExpression & NodeParentExtension) => void)
| undefined;
"NewExpression:exit"?:
| ((node: ESTree.NewExpression & NodeParentExtension) => void)
| undefined;
ObjectExpression?:
| ((node: ESTree.ObjectExpression & NodeParentExtension) => void)
| undefined;
"ObjectExpression:exit"?:
| ((node: ESTree.ObjectExpression & NodeParentExtension) => void)
| undefined;
ObjectPattern?:
| ((node: ESTree.ObjectPattern & NodeParentExtension) => void)
| undefined;
"ObjectPattern:exit"?:
| ((node: ESTree.ObjectPattern & NodeParentExtension) => void)
| undefined;
PrivateIdentifier?:
| ((node: ESTree.PrivateIdentifier & NodeParentExtension) => void)
| undefined;
"PrivateIdentifier:exit"?:
| ((node: ESTree.PrivateIdentifier & NodeParentExtension) => void)
| undefined;
Program?: ((node: ESTree.Program) => void) | undefined;
"Program:exit"?: ((node: ESTree.Program) => void) | undefined;
Property?:
| ((node: ESTree.Property & NodeParentExtension) => void)
| undefined;
"Property:exit"?:
| ((node: ESTree.Property & NodeParentExtension) => void)
| undefined;
PropertyDefinition?:
| ((node: ESTree.PropertyDefinition & NodeParentExtension) => void)
| undefined;
"PropertyDefinition:exit"?:
| ((node: ESTree.PropertyDefinition & NodeParentExtension) => void)
| undefined;
RestElement?:
| ((node: ESTree.RestElement & NodeParentExtension) => void)
| undefined;
"RestElement:exit"?:
| ((node: ESTree.RestElement & NodeParentExtension) => void)
| undefined;
ReturnStatement?:
| ((node: ESTree.ReturnStatement & NodeParentExtension) => void)
| undefined;
"ReturnStatement:exit"?:
| ((node: ESTree.ReturnStatement & NodeParentExtension) => void)
| undefined;
SequenceExpression?:
| ((node: ESTree.SequenceExpression & NodeParentExtension) => void)
| undefined;
"SequenceExpression:exit"?:
| ((node: ESTree.SequenceExpression & NodeParentExtension) => void)
| undefined;
SpreadElement?:
| ((node: ESTree.SpreadElement & NodeParentExtension) => void)
| undefined;
"SpreadElement:exit"?:
| ((node: ESTree.SpreadElement & NodeParentExtension) => void)
| undefined;
StaticBlock?:
| ((node: ESTree.StaticBlock & NodeParentExtension) => void)
| undefined;
"StaticBlock:exit"?:
| ((node: ESTree.StaticBlock & NodeParentExtension) => void)
| undefined;
Super?:
| ((node: ESTree.Super & NodeParentExtension) => void)
| undefined;
"Super:exit"?:
| ((node: ESTree.Super & NodeParentExtension) => void)
| undefined;
SwitchCase?:
| ((node: ESTree.SwitchCase & NodeParentExtension) => void)
| undefined;
"SwitchCase:exit"?:
| ((node: ESTree.SwitchCase & NodeParentExtension) => void)
| undefined;
SwitchStatement?:
| ((node: ESTree.SwitchStatement & NodeParentExtension) => void)
| undefined;
"SwitchStatement:exit"?:
| ((node: ESTree.SwitchStatement & NodeParentExtension) => void)
| undefined;
TaggedTemplateExpression?:
| ((
node: ESTree.TaggedTemplateExpression & NodeParentExtension,
) => void)
| undefined;
"TaggedTemplateExpression:exit"?:
| ((
node: ESTree.TaggedTemplateExpression & NodeParentExtension,
) => void)
| undefined;
TemplateElement?:
| ((node: ESTree.TemplateElement & NodeParentExtension) => void)
| undefined;
"TemplateElement:exit"?:
| ((node: ESTree.TemplateElement & NodeParentExtension) => void)
| undefined;
TemplateLiteral?:
| ((node: ESTree.TemplateLiteral & NodeParentExtension) => void)
| undefined;
"TemplateLiteral:exit"?:
| ((node: ESTree.TemplateLiteral & NodeParentExtension) => void)
| undefined;
ThisExpression?:
| ((node: ESTree.ThisExpression & NodeParentExtension) => void)
| undefined;
"ThisExpression:exit"?:
| ((node: ESTree.ThisExpression & NodeParentExtension) => void)
| undefined;
ThrowStatement?:
| ((node: ESTree.ThrowStatement & NodeParentExtension) => void)
| undefined;
"ThrowStatement:exit"?:
| ((node: ESTree.ThrowStatement & NodeParentExtension) => void)
| undefined;
TryStatement?:
| ((node: ESTree.TryStatement & NodeParentExtension) => void)
| undefined;
"TryStatement:exit"?:
| ((node: ESTree.TryStatement & NodeParentExtension) => void)
| undefined;
UnaryExpression?:
| ((node: ESTree.UnaryExpression & NodeParentExtension) => void)
| undefined;
"UnaryExpression:exit"?:
| ((node: ESTree.UnaryExpression & NodeParentExtension) => void)
| undefined;
UpdateExpression?:
| ((node: ESTree.UpdateExpression & NodeParentExtension) => void)
| undefined;
"UpdateExpression:exit"?:
| ((node: ESTree.UpdateExpression & NodeParentExtension) => void)
| undefined;
VariableDeclaration?:
| ((node: ESTree.VariableDeclaration & NodeParentExtension) => void)
| undefined;
"VariableDeclaration:exit"?:
| ((node: ESTree.VariableDeclaration & NodeParentExtension) => void)
| undefined;
VariableDeclarator?:
| ((node: ESTree.VariableDeclarator & NodeParentExtension) => void)
| undefined;
"VariableDeclarator:exit"?:
| ((node: ESTree.VariableDeclarator & NodeParentExtension) => void)
| undefined;
WhileStatement?:
| ((node: ESTree.WhileStatement & NodeParentExtension) => void)
| undefined;
"WhileStatement:exit"?:
| ((node: ESTree.WhileStatement & NodeParentExtension) => void)
| undefined;
WithStatement?:
| ((node: ESTree.WithStatement & NodeParentExtension) => void)
| undefined;
"WithStatement:exit"?:
| ((node: ESTree.WithStatement & NodeParentExtension) => void)
| undefined;
YieldExpression?:
| ((node: ESTree.YieldExpression & NodeParentExtension) => void)
| undefined;
"YieldExpression:exit"?:
| ((node: ESTree.YieldExpression & NodeParentExtension) => void)
| undefined;
}
interface NodeListener
extends WithExit<
{
[Node in Rule.Node as Node["type"]]?:
| ((node: Node) => void)
| undefined;
} & {
// A `Program` visitor's node type has no `parent` property.
Program?: ((node: AST.Program) => void) | undefined;
}
> {}
interface NodeParentExtension {
parent: Node;
}
type Node = ESTree.Node & NodeParentExtension;
type Node =
| (AST.Program & { parent: null })
| (Exclude<ESTree.Node, ESTree.Program> & NodeParentExtension);
interface RuleListener extends NodeListener {
onCodePathStart?(codePath: CodePath, node: Node): void;
@ -1124,6 +718,16 @@ export namespace Rule {
onCodePathSegmentEnd?(segment: CodePathSegment, node: Node): void;
onUnreachableCodePathSegmentStart?(
segment: CodePathSegment,
node: Node,
): void;
onUnreachableCodePathSegmentEnd?(
segment: CodePathSegment,
node: Node,
): void;
onCodePathSegmentLoop?(
fromSegment: CodePathSegment,
toSegment: CodePathSegment,
@ -1178,37 +782,21 @@ export namespace Rule {
MessageIds: string;
}> {}
type ReportFixer = (
fixer: RuleFixer,
) => null | Fix | IterableIterator<Fix> | Fix[];
type ReportFixer = CoreRuleFixer;
interface ReportDescriptorOptionsBase {
data?: { [key: string]: string };
/** @deprecated Use `ReportDescriptorOptions` instead. */
type ReportDescriptorOptionsBase = ViolationReportBase;
fix?: null | ReportFixer;
}
type SuggestionReportOptions = SuggestedEditBase;
type SuggestionDescriptorMessage = SuggestionMessage;
type SuggestionReportDescriptor = SuggestedEdit;
interface SuggestionReportOptions {
data?: { [key: string]: string };
// redundant with ReportDescriptorOptionsBase but kept for clarity
type ReportDescriptorOptions = ViolationReportBase;
fix: ReportFixer;
}
type SuggestionDescriptorMessage = { desc: string } | { messageId: string };
type SuggestionReportDescriptor = SuggestionDescriptorMessage &
SuggestionReportOptions;
interface ReportDescriptorOptions extends ReportDescriptorOptionsBase {
suggest?: SuggestionReportDescriptor[] | null | undefined;
}
type ReportDescriptor = ReportDescriptorMessage &
ReportDescriptorLocation &
ReportDescriptorOptions;
type ReportDescriptorMessage = { message: string } | { messageId: string };
type ReportDescriptorLocation =
| { node: ESTree.Node }
| { loc: AST.SourceLocation | { line: number; column: number } };
type ReportDescriptor = ViolationReport<ESTree.Node>;
type ReportDescriptorMessage = ViolationMessage;
type ReportDescriptorLocation = ViolationLocation<ESTree.Node>;
type RuleFixer = RuleTextEditor<ESTree.Node | AST.Token>;
type Fix = RuleTextEdit;
@ -1222,7 +810,7 @@ export type JSRuleDefinition<
{
LangOptions: Linter.LanguageOptions;
Code: SourceCode;
Visitor: Rule.NodeListener;
Visitor: Rule.RuleListener;
Node: JSSyntaxElement;
},
Options
@ -1318,9 +906,7 @@ export namespace Linter {
*
* @see [Rules](https://eslint.org/docs/latest/use/configure/rules)
*/
type RuleEntry<Options extends any[] = any[]> =
| RuleSeverity
| RuleSeverityAndOptions<Options>;
type RuleEntry<Options extends any[] = any[]> = RuleConfig<Options>;
/**
* The rules config object is a key/value map of rule names and their severity and options.
@ -1330,9 +916,8 @@ export namespace Linter {
/**
* A configuration object that may have a `rules` block.
*/
interface HasRules<Rules extends RulesConfig = RulesConfig> {
rules?: Partial<Rules> | undefined;
}
type HasRules<Rules extends RulesConfig = RulesConfig> =
CoreHasRules<Rules>;
/**
* The ECMAScript version of the code being linted.
@ -1342,99 +927,17 @@ export namespace Linter {
/**
* The type of JavaScript source code.
*/
// TODO: Refactor to JavaScriptSourceType when exported from @eslint/core.
type SourceType = "script" | "module" | "commonjs";
type SourceType = JavaScriptSourceType;
/**
* ESLint legacy configuration.
*
* @see [ESLint Legacy Configuration](https://eslint.org/docs/latest/use/configure/)
*/
interface BaseConfig<
type BaseConfig<
Rules extends RulesConfig = RulesConfig,
OverrideRules extends RulesConfig = Rules,
> extends HasRules<Rules> {
$schema?: string | undefined;
/**
* An environment provides predefined global variables.
*
* @see [Environments](https://eslint.org/docs/latest/use/configure/language-options-deprecated#specifying-environments)
*/
env?: { [name: string]: boolean } | undefined;
/**
* Extending configuration files.
*
* @see [Extends](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated#extending-configuration-files)
*/
extends?: string | string[] | undefined;
/**
* Specifying globals.
*
* @see [Globals](https://eslint.org/docs/latest/use/configure/language-options-deprecated#specifying-globals)
*/
globals?: Linter.Globals | undefined;
/**
* Disable processing of inline comments.
*
* @see [Disabling Inline Comments](https://eslint.org/docs/latest/use/configure/rules-deprecated#disabling-inline-comments)
*/
noInlineConfig?: boolean | undefined;
/**
* Overrides can be used to use a differing configuration for matching sub-directories and files.
*
* @see [How do overrides work](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated#how-do-overrides-work)
*/
overrides?: Array<ConfigOverride<OverrideRules>> | undefined;
/**
* Parser.
*
* @see [Working with Custom Parsers](https://eslint.org/docs/latest/extend/custom-parsers)
* @see [Specifying Parser](https://eslint.org/docs/latest/use/configure/parser-deprecated)
*/
parser?: string | undefined;
/**
* Parser options.
*
* @see [Working with Custom Parsers](https://eslint.org/docs/latest/extend/custom-parsers)
* @see [Specifying Parser Options](https://eslint.org/docs/latest/use/configure/language-options-deprecated#specifying-parser-options)
*/
parserOptions?: JavaScriptParserOptionsConfig | undefined;
/**
* Which third-party plugins define additional rules, environments, configs, etc. for ESLint to use.
*
* @see [Configuring Plugins](https://eslint.org/docs/latest/use/configure/plugins-deprecated#configure-plugins)
*/
plugins?: string[] | undefined;
/**
* Specifying processor.
*
* @see [processor](https://eslint.org/docs/latest/use/configure/plugins-deprecated#specify-a-processor)
*/
processor?: string | undefined;
/**
* Report unused eslint-disable comments as warning.
*
* @see [Report unused eslint-disable comments](https://eslint.org/docs/latest/use/configure/rules-deprecated#report-unused-eslint-disable-comments)
*/
reportUnusedDisableDirectives?: boolean | undefined;
/**
* Settings.
*
* @see [Settings](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated#adding-shared-settings)
*/
settings?: { [name: string]: any } | undefined;
}
> = CoreBaseConfig<Rules, OverrideRules>;
/**
* The overwrites that apply more differing configuration to specific files or directories.
@ -1477,18 +980,7 @@ export namespace Linter {
reportUnusedDisableDirectives?: boolean | undefined;
}
// TODO: Once exported from @eslint/core, remove this and use that instead
interface LintSuggestion {
/** A short description. */
desc: string;
/** Fix result info. */
fix: Rule.Fix;
/** Id referencing a message for the description. */
messageId?: string | undefined;
}
type LintSuggestion = CoreLintSuggestion;
type LintMessage = CoreLintMessage;
interface LintSuppression {

15
node_modules/eslint/package.json generated vendored
View File

@ -1,6 +1,6 @@
{
"name": "eslint",
"version": "9.38.0",
"version": "9.39.0",
"author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
"description": "An AST-based pattern checker for JavaScript.",
"type": "commonjs",
@ -83,8 +83,9 @@
"*": "trunk check --fix",
"lib/rules/*.js": [
"node tools/update-eslint-all.js",
"node tools/update-eslint-recommended.js",
"node tools/update-rule-type-headers.js",
"git add packages/js/src/configs/eslint-all.js lib/types/rules.d.ts"
"git add packages/js/src/configs/*.js lib/types/rules.d.ts"
],
"docs/src/rules/*.md": [
"node tools/check-rule-examples.js",
@ -108,11 +109,11 @@
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.1",
"@eslint/config-helpers": "^0.4.1",
"@eslint/core": "^0.16.0",
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.38.0",
"@eslint/plugin-kit": "^0.4.0",
"@eslint/js": "9.39.0",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@ -145,7 +146,7 @@
"@babel/core": "^7.4.3",
"@babel/preset-env": "^7.4.3",
"@cypress/webpack-preprocessor": "^6.0.2",
"@eslint/json": "^0.13.0",
"@eslint/json": "^0.13.2",
"@trunkio/launcher": "^1.3.4",
"@types/esquery": "^1.5.4",
"@types/node": "^22.13.14",

50
package-lock.json generated
View File

@ -24,7 +24,7 @@
"prom-client": "^15.1.3"
},
"devDependencies": {
"eslint": "^9.38.0",
"eslint": "^9.39.0",
"jest": "^30.2.0",
"nodemon": "^3.1.10",
"supertest": "^7.1.4"
@ -650,7 +650,7 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/config-helpers/node_modules/@eslint/core": {
"node_modules/@eslint/core": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
@ -663,19 +663,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
"integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
@ -701,9 +688,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.38.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz",
"integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==",
"version": "9.39.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.0.tgz",
"integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==",
"dev": true,
"license": "MIT",
"engines": {
@ -737,19 +724,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@ -2905,20 +2879,20 @@
}
},
"node_modules/eslint": {
"version": "9.38.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz",
"integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==",
"version": "9.39.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz",
"integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.1",
"@eslint/config-helpers": "^0.4.1",
"@eslint/core": "^0.16.0",
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.38.0",
"@eslint/plugin-kit": "^0.4.0",
"@eslint/js": "9.39.0",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",

View File

@ -8,7 +8,7 @@
"start": "node index.js",
"dev": "nodemon index.js",
"lint": "eslint .",
"test": "jest --coverage",
"test": "jest",
"test:integration": "jest --config jest.integration.config.js"
},
"keywords": [],
@ -30,7 +30,7 @@
"prom-client": "^15.1.3"
},
"devDependencies": {
"eslint": "^9.38.0",
"eslint": "^9.39.0",
"jest": "^30.2.0",
"nodemon": "^3.1.10",
"supertest": "^7.1.4"

9
test/app.test.js Normal file
View File

@ -0,0 +1,9 @@
const request = require('supertest');
const app = require('../index'); // ton serveur express
describe('Test API health', () => {
it('GET /health doit répondre 200', async () => {
const res = await request(app).get('/health');
expect(res.statusCode).toBe(200);
});
});