diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..6ec57629 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "env": { + "node": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "ignorePatterns": ["**/dist/*", "**/coverage/*", "node_modules"] +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a81c496..eb133aea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,6 +42,5 @@ jobs: - name: Run formatting check run: npm run format:check - - name: Lint check - run: npm run lint - + - name: Check linting + run: npm run lint -- --max-warnings=0 diff --git a/.github/workflows/eslint.config.js b/.github/workflows/eslint.config.js index 6986896c..f9b2b8d6 100644 --- a/.github/workflows/eslint.config.js +++ b/.github/workflows/eslint.config.js @@ -1,6 +1,7 @@ import globals from "globals"; import pluginJs from "@eslint/js"; import tseslint from "@typescript-eslint/eslint-plugin"; +import pluginSecurity from "eslint-plugin-security"; /** @type {import('eslint').Linter.Config} */ export default { @@ -10,8 +11,8 @@ export default { }, extends: [ pluginJs.configs.recommended, - tseslint.configs.recommended, // Ensure @typescript-eslint is installed -and configured + ...tseslint.configs.recommended, + pluginSecurity.configs.recommended, ], }; diff --git a/eslint b/eslint new file mode 100644 index 00000000..e69de29b diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..f508c029 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,29 @@ +import js from "@eslint/js"; +import ts from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import globals from "globals"; + +/** @type {import("eslint").Linter.FlatConfig[]} */ +export default [ + // ✅ JavaScript Recommended Rules + js.configs.recommended, + + // ✅ TypeScript Rules (Flat Config) + { + files: ["**/*.{ts,tsx}"], + languageOptions: { + parser: tsParser, + globals: { + ...globals.browser, + ...globals.node, // 👈 Fix: Adds `process` and other Node.js globals + }, + }, + plugins: { + "@typescript-eslint": ts, + }, + rules: { + ...(ts.configs.recommended.rules ?? {}), + }, + }, +]; + diff --git a/learn-cicd-typescript-starter@1.0.0 b/learn-cicd-typescript-starter@1.0.0 new file mode 100644 index 00000000..e69de29b diff --git a/package-lock.json b/package-lock.json index bc78eb1b..72e9ec7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,13 +16,15 @@ "uuid": "^11.0.3" }, "devDependencies": { - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.19.0", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.9.0", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", "@vitest/coverage-v8": "^2.1.8", "drizzle-kit": "^0.28.1", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "globals": "^15.14.0", "prettier": "3.4.2", "tsx": "^4.19.2", @@ -1109,9 +1111,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", "dev": true, "license": "MIT", "engines": { @@ -3014,9 +3016,9 @@ } }, "node_modules/eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", "dev": true, "license": "MIT", "dependencies": { @@ -3025,7 +3027,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", + "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7014,9 +7016,9 @@ } }, "@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", "dev": true }, "@eslint/object-schema": { @@ -8198,9 +8200,9 @@ "dev": true }, "eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", @@ -8208,7 +8210,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", + "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", diff --git a/package.json b/package.json index fdbd8dfe..bc51c3b0 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,15 @@ "dev": "npx tsc && node dist/main.js" }, "devDependencies": { - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.19.0", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.9.0", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", "@vitest/coverage-v8": "^2.1.8", "drizzle-kit": "^0.28.1", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "globals": "^15.14.0", "prettier": "3.4.2", "tsx": "^4.19.2", diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 00000000..9fdf2536 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,8 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ] +}