diff --git a/eslint.config.js b/eslint.config.js
index 0434c3a..9fda677 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -3,6 +3,8 @@ import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from "typescript-eslint";
+import htmlEslint from "@html-eslint/eslint-plugin";
+import htmlParser from "@html-eslint/parser";
import customRules from "./eslint-rules/index.js";
export default tseslint.config(
@@ -28,5 +30,19 @@ export default tseslint.config(
"@typescript-eslint/no-unused-vars": "off",
"custom/no-placeholder-comments": "error",
},
+ },
+ {
+ files: ["**/*.html"],
+ plugins: {
+ "@html-eslint": htmlEslint,
+ },
+ languageOptions: {
+ parser: htmlParser,
+ },
+ rules: {
+ "@html-eslint/require-title": "error",
+ "@html-eslint/require-meta-charset": "error",
+ "@html-eslint/require-meta-viewport": "error",
+ },
}
);
diff --git a/index.html b/index.html
index 4e870e3..22f6ccf 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,6 @@
- mkstack
diff --git a/package-lock.json b/package-lock.json
index f1fe78b..d40c755 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -63,6 +63,8 @@
},
"devDependencies": {
"@eslint/js": "^9.9.0",
+ "@html-eslint/eslint-plugin": "^0.41.0",
+ "@html-eslint/parser": "^0.41.0",
"@tailwindcss/typography": "^0.5.15",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
@@ -857,6 +859,80 @@
"react-hook-form": "^7.0.0"
}
},
+ "node_modules/@html-eslint/eslint-plugin": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.41.0.tgz",
+ "integrity": "sha512-kZhOdLOx5xGogw9CE/uGKkoo8t7fNK9PxU6kosIvu9Yveir3r2VhGYC4II/2OEGQ+O4cPk2LxV1fCpYt7XFMtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint/plugin-kit": "^0.3.1",
+ "@html-eslint/parser": "^0.41.0",
+ "@html-eslint/template-parser": "^0.41.0",
+ "@html-eslint/template-syntax-parser": "^0.41.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@html-eslint/eslint-plugin/node_modules/@eslint/core": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
+ "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/@html-eslint/eslint-plugin/node_modules/@eslint/plugin-kit": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.14.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@html-eslint/parser": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.41.0.tgz",
+ "integrity": "sha512-QQJeq2G11T/SGYcG09+XOajm+X8XX6bVVSouB3SVlGmm3exvJis0B6tBnb+5Rz2kC/q3C21z1ZuCc/AXcFKzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@html-eslint/template-syntax-parser": "^0.41.0",
+ "es-html-parser": "0.2.0"
+ }
+ },
+ "node_modules/@html-eslint/template-parser": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.41.0.tgz",
+ "integrity": "sha512-ntZNMh+G13lPvwSSkr2U0XqWWDFLSZPeidcztgVCjxthwgSMdefL4au/YicnlB+h1WNBw8Pk0bAjczJXEbp85g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-html-parser": "0.2.0"
+ }
+ },
+ "node_modules/@html-eslint/template-syntax-parser": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.41.0.tgz",
+ "integrity": "sha512-dgiE30uXWCoD89chi6KdjYOF+143bImJ3GNl3j2iy6/ZM8enTqCQVHZ48+Esf6Tx2rLBBBdxx4Rb0fG11myHsw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -4447,6 +4523,13 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/es-html-parser": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.2.0.tgz",
+ "integrity": "sha512-snJ7uJC8Dkx/yT0eYZrWcY57rkPU6Zui6YphPynw8r52AWf57gjqMC0GWe7OxSDipwXowFpa3rqckEeAPTOz7w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/es-module-lexer": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
diff --git a/package.json b/package.json
index fec5e68..280c532 100644
--- a/package.json
+++ b/package.json
@@ -65,6 +65,8 @@
},
"devDependencies": {
"@eslint/js": "^9.9.0",
+ "@html-eslint/eslint-plugin": "^0.41.0",
+ "@html-eslint/parser": "^0.41.0",
"@tailwindcss/typography": "^0.5.15",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",