{"_id":"@cmdniels/eslint-config","_rev":"5-c4c45440a8198a41aec9337491c1ed1d","name":"@cmdniels/eslint-config","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"@cmdniels/eslint-config","version":"1.0.0","keywords":["eslint","eslint-config","prettier"],"author":{"name":"cmdNiels"},"license":"MIT","_id":"@cmdniels/eslint-config@1.0.0","maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"homepage":"https://github.com/cmdniels/eslint-config","bugs":{"url":"https://github.com/cmdniels/eslint-config/issues"},"dist":{"shasum":"7b47e559c45fbc3542f28cb2113ec2d7360a66ef","tarball":"https://registry.npmjs.org/@cmdniels/eslint-config/-/eslint-config-1.0.0.tgz","fileCount":6,"integrity":"sha512-uEqi6RrSgtp2LxOGl/mviwt28SKv23NQoeSETbZHogHw9ScnNpD5xLsCT6qV49Lp4Lat+6kX1A+c7VZmf2Eqmg==","signatures":[{"sig":"MEQCIFVkfVpGf+bxZo10ZWxaiHx0PP3uFBCQWh6s7/thVtEbAiBJ515MYC7rLBR8/JcAKFCHdEQWCHek+0DImHH09C0M8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14543},"type":"module","_from":"file:cmdniels-eslint-config-1.0.0.tgz","exports":{"./ts":"./ts.eslint.config.mjs","./web":"./web.eslint.config.mjs","./prettier":"./prettier.config.mjs"},"private":false,"scripts":{"fix":"pnpm lint:fix && pnpm format","lint":"eslint .","format":"prettier --write .","lint:fix":"eslint --fix .","format:check":"prettier --check ."},"_npmUser":{"name":"cmdniels","email":"nielspaashuis@gmail.com"},"_resolved":"/tmp/ee14dd91b83476c824b0922d00015c79/cmdniels-eslint-config-1.0.0.tgz","_integrity":"sha512-uEqi6RrSgtp2LxOGl/mviwt28SKv23NQoeSETbZHogHw9ScnNpD5xLsCT6qV49Lp4Lat+6kX1A+c7VZmf2Eqmg==","repository":{"url":"git+https://github.com/cmdniels/eslint-config.git","type":"git"},"_npmVersion":"11.4.2","description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","directories":{},"_nodeVersion":"20.19.3","dependencies":{"eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@next/eslint-plugin-next":"^16.0.7","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-unused-imports":"^4.3.0","@typescript-eslint/eslint-plugin":"^8.48.1","eslint-plugin-better-tailwindcss":"^3.8.0","eslint-import-resolver-typescript":"^4.4.4","@dword-design/eslint-plugin-import-alias":"^6.0.3"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.18.0","prettier":"^3.7.4","typescript":"^5.7.3"},"peerDependencies":{"eslint":"^9.0.0","prettier":"^3.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_1.0.0_1765816346666_0.5294604763563624","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@cmdniels/eslint-config","version":"1.0.1","keywords":["eslint","eslint-config","prettier"],"author":{"name":"cmdNiels"},"license":"MIT","_id":"@cmdniels/eslint-config@1.0.1","maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"homepage":"https://github.com/cmdniels/eslint-config","bugs":{"url":"https://github.com/cmdniels/eslint-config/issues"},"dist":{"shasum":"719b776d4853ab932187852d48bc874002374fc0","tarball":"https://registry.npmjs.org/@cmdniels/eslint-config/-/eslint-config-1.0.1.tgz","fileCount":6,"integrity":"sha512-no8KeHU9YNSuSCN3VBl/sVXTIvP3wmpPnPEBRHTEEiZBXhMWrb1XrNH29lo0p9gUMUazBQyT2AP4zycvdjT00w==","signatures":[{"sig":"MEYCIQC7FFirbQsdjM9wZ8MqgGjzlF0T5eCGyFYEx/rhTxsNggIhAKHK83VBfQYH6ygZx49RasNE5ce4DlBJ1sN0KdVysCZA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14600},"type":"module","_from":"file:cmdniels-eslint-config-1.0.1.tgz","exports":{"./ts":"./ts.eslint.config.mjs","./web":"./web.eslint.config.mjs","./prettier":"./prettier.config.mjs"},"private":false,"scripts":{"fix":"pnpm lint:fix && pnpm format","lint":"eslint .","format":"prettier --write .","lint:fix":"eslint --fix .","format:check":"prettier --check ."},"_npmUser":{"name":"cmdniels","email":"nielspaashuis@gmail.com"},"_resolved":"/tmp/389df98c838fbda767771b1f16d083c4/cmdniels-eslint-config-1.0.1.tgz","_integrity":"sha512-no8KeHU9YNSuSCN3VBl/sVXTIvP3wmpPnPEBRHTEEiZBXhMWrb1XrNH29lo0p9gUMUazBQyT2AP4zycvdjT00w==","repository":{"url":"git+https://github.com/cmdniels/eslint-config.git","type":"git"},"_npmVersion":"11.4.2","description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","directories":{},"_nodeVersion":"20.19.3","dependencies":{"eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@next/eslint-plugin-next":"^16.0.7","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-unused-imports":"^4.3.0","@typescript-eslint/eslint-plugin":"^8.48.1","eslint-plugin-better-tailwindcss":"^3.8.0","eslint-import-resolver-typescript":"^4.4.4","@dword-design/eslint-plugin-import-alias":"^6.0.3"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.18.0","prettier":"^3.7.4","typescript":"^5.7.3"},"peerDependencies":{"eslint":"^9.0.0","prettier":"^3.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_1.0.1_1765981063926_0.3666785398791226","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@cmdniels/eslint-config","version":"1.1.0","keywords":["eslint","eslint-config","prettier"],"author":{"name":"cmdNiels"},"license":"MIT","_id":"@cmdniels/eslint-config@1.1.0","maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"homepage":"https://github.com/cmdniels/eslint-config","bugs":{"url":"https://github.com/cmdniels/eslint-config/issues"},"dist":{"shasum":"d068e7a44d553b6e9aea4b086939cffe43bd3827","tarball":"https://registry.npmjs.org/@cmdniels/eslint-config/-/eslint-config-1.1.0.tgz","fileCount":7,"integrity":"sha512-dHhJoiw6DfzTiHm8TdjaUEC5WsY5Azgu5CqVTqOtdIaKYp8Lmfrksr1NwieIfoWoxN4IodwnHJF9D20vlz19Ag==","signatures":[{"sig":"MEUCIQCwsYMjA3Q2nYL+qaJfK7kFI60YM0oSn3AQlnftS2W+WwIgbWusDcT1TntqClwbiB2zaJlyWmPEXleDVEXX3sAgxSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18729},"type":"module","_from":"file:cmdniels-eslint-config-1.1.0.tgz","exports":{"./ts":"./ts.eslint.config.mjs","./web":"./web.eslint.config.mjs","./expo":"./expo.eslint.config.mjs","./prettier":"./prettier.config.mjs"},"private":false,"scripts":{"fix":"pnpm lint:fix && pnpm format","lint":"eslint .","format":"prettier --write .","lint:fix":"eslint --fix .","format:check":"prettier --check ."},"_npmUser":{"name":"cmdniels","email":"nielspaashuis@gmail.com"},"_resolved":"/tmp/4944a8a5df506a1253274a5c822b3cb7/cmdniels-eslint-config-1.1.0.tgz","_integrity":"sha512-dHhJoiw6DfzTiHm8TdjaUEC5WsY5Azgu5CqVTqOtdIaKYp8Lmfrksr1NwieIfoWoxN4IodwnHJF9D20vlz19Ag==","repository":{"url":"git+https://github.com/cmdniels/eslint-config.git","type":"git"},"_npmVersion":"11.4.2","description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","directories":{},"_nodeVersion":"20.19.3","dependencies":{"eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","eslint-plugin-jsx-a11y":"^6.10.2","@next/eslint-plugin-next":"^16.0.7","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-native":"^5.0.0","eslint-plugin-unused-imports":"^4.3.0","@typescript-eslint/eslint-plugin":"^8.48.1","eslint-plugin-better-tailwindcss":"^3.8.0","eslint-import-resolver-typescript":"^4.4.4","@dword-design/eslint-plugin-import-alias":"^6.0.3"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.18.0","prettier":"^3.7.4","typescript":"^5.7.3"},"peerDependencies":{"eslint":"^9.0.0","prettier":"^3.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_1.1.0_1767121660633_0.7884070983056577","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@cmdniels/eslint-config","version":"1.2.0","keywords":["eslint","eslint-config","prettier"],"author":"cmdNiels","license":"MIT","_id":"@cmdniels/eslint-config@1.2.0","maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"homepage":"https://github.com/cmdniels/eslint-config","dist":{"shasum":"16eb81d404fb761566d85ccaf37355607fee99e4","tarball":"https://registry.npmjs.org/@cmdniels/eslint-config/-/eslint-config-1.2.0.tgz","fileCount":7,"integrity":"sha512-Rkt3Kqo1RjzBkXAScjPx9q4gjO2tB5BxnzXQ5jxY2R9Et6APy8e3zGwb42f+QoOQM66iPUiZ3h+NyPqBX/iZPA==","signatures":[{"sig":"MEUCIQCE/TVv31gYnowggITe9Gi9Jkt/DnPJ3CR0oMzYENOCkQIgF4jdBD3oP40+eZgCCXo7sBySMTJlY6mt2jCUApxmatE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19189},"type":"module","shasum":"16eb81d404fb761566d85ccaf37355607fee99e4","engines":{"bun":"^1.3.0","node":"^20.0.0"},"exports":{"./ts":"./ts.eslint.config.mjs","./web":"./web.eslint.config.mjs","./expo":"./expo.eslint.config.mjs","./prettier":"./prettier.config.mjs"},"private":false,"scripts":{"fix":"bun lint:fix && bun format","lint":"eslint .","format":"prettier --write . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache","lint:fix":"eslint --fix .","format:check":"prettier --check . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache"},"_npmUser":{"name":"cmdniels","email":"nielspaashuis@gmail.com"},"_integrity":"sha512-Rkt3Kqo1RjzBkXAScjPx9q4gjO2tB5BxnzXQ5jxY2R9Et6APy8e3zGwb42f+QoOQM66iPUiZ3h+NyPqBX/iZPA==","repository":{"url":"https://github.com/cmdniels/eslint-config.git","type":"git"},"_npmVersion":"10.8.3","description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","directories":{},"_nodeVersion":"24.3.0","dependencies":{"minimatch":"^10.1.1","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","eslint-plugin-jsx-a11y":"^6.10.2","@next/eslint-plugin-next":"^16.0.7","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-native":"^5.0.0","prettier-plugin-packagejson":"^2.5.20","eslint-plugin-unused-imports":"^4.3.0","@typescript-eslint/eslint-plugin":"^8.48.1","eslint-plugin-better-tailwindcss":"^3.8.0","eslint-import-resolver-typescript":"^4.4.4","@dword-design/eslint-plugin-import-alias":"^6.0.3"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","devDependencies":{"eslint":"^9.18.0","prettier":"^3.7.4","typescript":"^5.7.3"},"peerDependencies":{"eslint":"^9.0.0","prettier":"^3.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_1.2.0_1767648877153_0.3533822907784745","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@cmdniels/eslint-config","version":"1.2.1","private":false,"description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","keywords":["eslint","eslint-config","prettier"],"homepage":"https://github.com/cmdniels/eslint-config","repository":{"type":"git","url":"https://github.com/cmdniels/eslint-config.git"},"license":"MIT","author":"cmdNiels","type":"module","exports":{"./eslint/ts":"./eslint/ts.eslint.config.mjs","./eslint/web":"./eslint/web.eslint.config.mjs","./eslint/expo":"./eslint/expo.eslint.config.mjs","./prettier":"./prettier.config.mjs","./rules/default":"./rules/default.md","./rules/spacetimedb":"./rules/spacetimedb.md","./rules/ts":"./rules/ts.md","./rules/web":"./rules/web.md","./rules/expo":"./rules/expo.md"},"scripts":{"fix":"bun lint:fix && bun format","format":"prettier --write . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache","format:check":"prettier --check . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache","lint":"eslint .","lint:fix":"eslint --fix ."},"dependencies":{"@dword-design/eslint-plugin-import-alias":"^6.0.3","@next/eslint-plugin-next":"^16.0.7","@typescript-eslint/eslint-plugin":"^8.48.1","@typescript-eslint/parser":"^8.48.1","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-better-tailwindcss":"^3.8.0","eslint-plugin-import":"^2.32.0","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-native":"^5.0.0","eslint-plugin-unused-imports":"^4.3.0","minimatch":"^10.1.1","prettier-plugin-packagejson":"^2.5.20"},"devDependencies":{"eslint":"^9.18.0","prettier":"^3.7.4","typescript":"^5.7.3"},"peerDependencies":{"eslint":"^9.0.0","prettier":"^3.0.0","typescript":"^5.0.0"},"packageManager":"bun@1.3.5","engines":{"bun":"^1.3.0","node":"^20.0.0"},"_id":"@cmdniels/eslint-config@1.2.1","_integrity":"sha512-czwXuAaWMuK6rT/lS2FMetJ2IgTA2tIh0oDK7qJ+x5Rdd5brwR1j9msXeS4z1qiAIG9yg4x/EwBI3Wf3ynQxmg==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"ff1c76bbd8be77223b3f62cacff0d84dd7e3cef2","dist":{"integrity":"sha512-czwXuAaWMuK6rT/lS2FMetJ2IgTA2tIh0oDK7qJ+x5Rdd5brwR1j9msXeS4z1qiAIG9yg4x/EwBI3Wf3ynQxmg==","shasum":"ff1c76bbd8be77223b3f62cacff0d84dd7e3cef2","tarball":"https://registry.npmjs.org/@cmdniels/eslint-config/-/eslint-config-1.2.1.tgz","fileCount":11,"unpackedSize":50783,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHu/WAnlAUIhsdzcGt839NUuSWCO1+kdjAwJ0JZWMkTyAiAdSdmfVQgTVYjI4ZNf6DV4+DRtiYfNJwqc/tivKN5uFg=="}]},"_npmUser":{"name":"cmdniels","email":"nielspaashuis@gmail.com"},"directories":{},"maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-config_1.2.1_1779113737964_0.9458672949805846"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-15T16:32:26.612Z","modified":"2026-05-18T14:15:38.212Z","1.0.0":"2025-12-15T16:32:26.797Z","1.0.1":"2025-12-17T14:17:44.064Z","1.1.0":"2025-12-30T19:07:40.792Z","1.2.0":"2026-01-05T21:34:37.335Z","1.2.1":"2026-05-18T14:15:38.116Z"},"author":"cmdNiels","license":"MIT","homepage":"https://github.com/cmdniels/eslint-config","keywords":["eslint","eslint-config","prettier"],"repository":{"type":"git","url":"https://github.com/cmdniels/eslint-config.git"},"description":"Opinionated ESLint configs for TypeScript and web (React/Next.js/Tailwind) projects","maintainers":[{"name":"cmdniels","email":"nielspaashuis@gmail.com"}],"readme":"# @cmdniels/eslint-config\n\nOpinionated ESLint configurations for TypeScript and web (React/Next.js/Tailwind) projects with opinionated code quality, best practices, and formatting rules.\n\n## Installation\n\nInstall the package and its peer dependencies:\n\n```bash\n# npm\nnpm install -D @cmdniels/eslint-config eslint prettier typescript\n\n# bun\nbun install --dev @cmdniels/eslint-config eslint prettier typescript\n```\n\n## Usage\n\n### TypeScript Only\n\nFor TypeScript projects (backend, libraries, etc.):\n\n```js\n// eslint.config.mjs\nimport { defineConfig } from \"eslint/config\";\n\nimport tsConfig from \"@cmdniels/eslint-config/ts\";\n\nexport default defineConfig([\n\ttsConfig,\n\t{\n\t\tignores: [\"node_modules/**\"],\n\t},\n]);\n```\n\n### Web Projects (React/Next.js/Tailwind)\n\nFor web projects, combine both configs:\n\n```js\n// eslint.config.mjs\nimport { defineConfig } from \"eslint/config\";\n\nimport tsConfig from \"@cmdniels/eslint-config/ts\";\nimport webConfig from \"@cmdniels/eslint-config/web\";\n\nexport default defineConfig([\n\ttsConfig,\n\twebConfig,\n\t{\n\t\tignores: [\"node_modules/**\", \".next/**\"],\n\t},\n]);\n```\n\n### Extending the Configuration\n\nYou can extend or override rules:\n\n```js\n// eslint.config.mjs\nimport { defineConfig } from \"eslint/config\";\n\nimport tsConfig from \"@cmdniels/eslint-config/ts\";\nimport webConfig from \"@cmdniels/eslint-config/web\";\n\nexport default defineConfig([\n\ttsConfig,\n\twebConfig,\n\t{\n\t\tignores: [\"node_modules/**\", \".next/**\"],\n\t\trules: {\n\t\t\t// Your custom rules\n\t\t\t\"no-console\": \"off\",\n\t\t},\n\t},\n]);\n```\n\n### TypeScript Configuration\n\nMake sure you have a `tsconfig.json` in your project root. The ESLint config expects it to be there for type-aware linting.\n\n**Important:** This config enforces `@` import aliases. You must configure path mapping in your `tsconfig.json`:\n\n```json\n{\n\t\"compilerOptions\": {\n\t\t\"baseUrl\": \".\",\n\t\t\"paths\": {\n\t\t\t\"@/*\": [\"./*\"]\n\t\t}\n\t\t// ... other options\n\t}\n}\n```\n\nThis allows you to import modules like `import { foo } from \"@/lib/utils\"` instead of relative paths like `\"../../lib/utils\"`.\n\n### Prettier Configuration\n\nThis package includes a shareable Prettier config. Import it in your `prettier.config.mjs`:\n\n```js\n// .prettierrc.mjs\nexport { default } from \"@cmdniels/eslint-config/prettier\";\n```\n\n## Scripts\n\nAdd these scripts to your `package.json`:\n\n```json\n{\n\t\"scripts\": {\n\t\t\"lint\": \"eslint .\",\n\t\t\"lint:fix\": \"eslint --fix .\",\n\t\t\"format\": \"prettier --write . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache\",\n\t\t\"format:check\": \"prettier --check . --log-level warn --cache --cache-location node_modules/.cache/prettier/.prettier-cache\",\n\t\t\"fix\": \"bun lint:fix && bun format\"\n\t}\n}\n```\n\n**Recommended workflow:**\n\n- `bun fix` - Fix all linting and formatting issues in one command\n\n## Ignored Files\n\nThe following files and directories are automatically ignored:\n\n- `.*/**` (hidden directories)\n- `node_modules/**`\n- `build/**`, `dist/**`, `out/**`\n- `coverage/**`\n- `*.log`, `.env*`, `*.env.*`\n- `*.tsbuildinfo`\n- `**/*.generated.*`, `**/generated/**`\n- `*.config.*` (all config files like `vite.config.ts`, `prettier.config.mjs`)\n- `.prettierrc.*` (prettier config files)\n\nConfig files are ignored because they often aren't included in `tsconfig.json` and would cause TypeScript parser errors.\n\n## OpenCode Integration\n\nThis package includes custom coding rules for [OpenCode](https://opencode.ai). The rules are automatically applied when OpenCode detects the `opencode.jsonc` configuration file:\n\n```jsonc\n{\n\t\"$schema\": \"https://opencode.ai/config.json\",\n\t\"instructions\": [\n\t\t\"https://raw.githubusercontent.com/cmdNiels/eslint-config/main/rules/default.md\",\n\t\t\"https://raw.githubusercontent.com/cmdNiels/eslint-config/main/rules/ts.md\",\n\t\t\"https://raw.githubusercontent.com/cmdNiels/eslint-config/main/rules/web.md\",\n\t\t\"https://raw.githubusercontent.com/cmdNiels/eslint-config/main/rules/expo.md\",\n\t],\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}