{"_id":"@dobroslavlabs/oxlint","_rev":"5-c30617205b43e8c5303f1679fad1f37e","name":"@dobroslavlabs/oxlint","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@dobroslavlabs/oxlint","version":"0.1.0","keywords":["design-system","dobroslavlabs","eslint","jsx","linter","oxlint","plugin","preset","react"],"author":{"url":"https://github.com/dobroslavlabs","name":"Dobroslav Radosavljevic"},"license":"MIT","_id":"@dobroslavlabs/oxlint@0.1.0","maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"homepage":"https://github.com/dobroslavlabs/oxlint#readme","bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"dist":{"shasum":"c69459ff37972191c35bb8e79577ad7841e84b74","tarball":"https://registry.npmjs.org/@dobroslavlabs/oxlint/-/oxlint-0.1.0.tgz","fileCount":15,"integrity":"sha512-aW6kwWIugXsX7WMng7GeKqsjjqRnATLrYfWZ1w/MOHfQi5m3evcYm07+6Q3DPhoDs3XdkpxXFFZ5Z/UOfE6NWA==","signatures":[{"sig":"MEUCIQCZbVarG5lkbnlOuU8FVynWIaBY/dJKyfpMan6WOEQ82gIgQ+8r+m7mYFAzWHXGPVPzqcf5UhNWSDVDC5hjXwL+nok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23678},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./core":{"types":"./dist/presets/core.d.ts","import":"./dist/presets/core.js","default":"./dist/presets/core.js"},"./react":{"types":"./dist/presets/react.d.ts","import":"./dist/presets/react.js","default":"./dist/presets/react.js"},"./recommended":{"types":"./dist/presets/recommended.d.ts","import":"./dist/presets/recommended.js","default":"./dist/presets/recommended.js"},"./package.json":"./package.json"},"gitHead":"9efb6172d48bdd060785ccb75cd56b1346c5ba3b","scripts":{"dev":"tsdown --watch","fmt":"oxfmt","lint":"bun run build && ultracite check","test":"vitest run","build":"tsdown","check":"bun run typecheck && bun run test && bun run build && bun run fmt:check && ultracite check","login":"npm login --auth-type=web","prepack":"bun run build","release":"npm publish --access public","lint:fix":"bun run build && ultracite fix","pack:dry":"bun run check && npm pack --dry-run","fmt:check":"oxfmt --check","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"bun run check"},"_npmUser":{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"},"repository":{"url":"git+https://github.com/dobroslavlabs/oxlint.git","type":"git"},"_npmVersion":"10.9.4","description":"Custom Oxlint rules and presets for JS/TS and React/JSX codebases","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@oxlint/plugins":"^1.74.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.59.0","oxlint":"^1.74.0","tsdown":"^0.22.9","vitest":"^4.1.10","publint":"^0.3.21","ultracite":"^7.9.4","typescript":"^7","@types/node":"^26.1.1","unplugin-unused":"^0.5.7","@dobroslavlabs/oxlint":".","@arethetypeswrong/core":"^0.18.5"},"peerDependencies":{"oxlint":">=1.74.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxlint_0.1.0_1784300306976_0.9622580413145072","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dobroslavlabs/oxlint","version":"0.1.1","keywords":["design-system","dobroslavlabs","eslint","jsx","linter","oxlint","plugin","preset","react"],"author":{"url":"https://github.com/dobroslavlabs","name":"Dobroslav Radosavljevic"},"license":"MIT","_id":"@dobroslavlabs/oxlint@0.1.1","maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"homepage":"https://github.com/dobroslavlabs/oxlint#readme","bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"dist":{"shasum":"727c1601b6b178bec2c3ce1c7da7eea054d45cf5","tarball":"https://registry.npmjs.org/@dobroslavlabs/oxlint/-/oxlint-0.1.1.tgz","fileCount":15,"integrity":"sha512-6zy8P0O0JdmsG8I2wLkZWWgzOOfXQG9lo7QrITTIJW/+YHT20YIE2xxpyu8TPfXaXVjKBASUmR3q58JnDv7mqQ==","signatures":[{"sig":"MEUCIQCMOCBXLS8I5x+fWtXlvAFR3hBxQIHsf7+AO+ucaDbR9AIgQ2aisxcmr6S9Oxl2umWduMdSVh8cJeHB/ydiXkUEqsY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45235},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./core":{"types":"./dist/presets/core.d.ts","import":"./dist/presets/core.js","default":"./dist/presets/core.js"},"./react":{"types":"./dist/presets/react.d.ts","import":"./dist/presets/react.js","default":"./dist/presets/react.js"},"./recommended":{"types":"./dist/presets/recommended.d.ts","import":"./dist/presets/recommended.js","default":"./dist/presets/recommended.js"},"./package.json":"./package.json"},"gitHead":"aeb2b415fc4e17c00c5a3c31e2eb0138d7b181ce","scripts":{"dev":"tsdown --watch","fmt":"oxfmt","lint":"bun run build && ultracite check","test":"vitest run","build":"tsdown","check":"bun run build && bun run typecheck && bun run test && bun run fmt:check && ultracite check","login":"npm login --auth-type=web","prepack":"bun run build","release":"npm publish --access public","lint:fix":"bun run build && ultracite fix","pack:dry":"bun run check && npm pack --dry-run","fmt:check":"oxfmt --check","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"bun run check"},"_npmUser":{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"},"repository":{"url":"git+https://github.com/dobroslavlabs/oxlint.git","type":"git"},"_npmVersion":"10.9.4","description":"Custom Oxlint rules and presets for JS/TS and React/JSX codebases","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@oxlint/plugins":"^1.74.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.59.0","oxlint":"^1.74.0","tsdown":"^0.22.9","vitest":"^4.1.10","publint":"^0.3.21","ultracite":"^7.9.4","typescript":"^7","@types/node":"^26.1.1","unplugin-unused":"^0.5.7","@dobroslavlabs/oxlint":".","@arethetypeswrong/core":"^0.18.5"},"peerDependencies":{"oxlint":">=1.74.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxlint_0.1.1_1784306143493_0.12937015509436067","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dobroslavlabs/oxlint","version":"0.1.2","keywords":["bun","design-system","dobroslavlabs","effect","elysia","eslint","jsx","linter","oxlint","plugin","preset","react","typescript","zod"],"author":{"url":"https://github.com/dobroslavlabs","name":"Dobroslav Radosavljevic"},"license":"MIT","_id":"@dobroslavlabs/oxlint@0.1.2","maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"homepage":"https://github.com/dobroslavlabs/oxlint#readme","bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"dist":{"shasum":"4455420d1397413788de5e8846d4d7c57e3036eb","tarball":"https://registry.npmjs.org/@dobroslavlabs/oxlint/-/oxlint-0.1.2.tgz","fileCount":28,"integrity":"sha512-W5mZw5ZOT2F7I8fbbFy8bgzhKQBi1qMbqSyIV3orEixWcTwz1/0zhjb5hiCFT+kuQUwYsBZ65dCIVbWpj44c/Q==","signatures":[{"sig":"MEUCIQCnQIIx1fqpHaZBc+ChUbsewA93HshdP+Yz6XbXU5K9PwIgVq4ZLyYxhqY/0T7F/vKDd6TkjZxqRGAiQI42SJ16Dmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":508820},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./bun":{"types":"./dist/presets/bun.d.ts","import":"./dist/presets/bun.js","default":"./dist/presets/bun.js"},"./zod":{"types":"./dist/presets/zod.d.ts","import":"./dist/presets/zod.js","default":"./dist/presets/zod.js"},"./core":{"types":"./dist/presets/core.d.ts","import":"./dist/presets/core.js","default":"./dist/presets/core.js"},"./react":{"types":"./dist/presets/react.d.ts","import":"./dist/presets/react.js","default":"./dist/presets/react.js"},"./effect":{"types":"./dist/presets/effect.d.ts","import":"./dist/presets/effect.js","default":"./dist/presets/effect.js"},"./elysia":{"types":"./dist/presets/elysia.d.ts","import":"./dist/presets/elysia.js","default":"./dist/presets/elysia.js"},"./recommended":{"types":"./dist/presets/recommended.d.ts","import":"./dist/presets/recommended.js","default":"./dist/presets/recommended.js"},"./package.json":"./package.json"},"gitHead":"4bcb4a1a7cdfc57c6691a41a1c0bcb766c4060aa","scripts":{"dev":"tsdown --watch","fmt":"oxfmt","lint":"bun run build && ultracite check","test":"vitest run","build":"tsdown","check":"bun run build && bun run typecheck && bun run test && bun run fmt:check && ultracite check","login":"npm login --auth-type=web","prepack":"bun run build","release":"npm publish --access public","lint:fix":"bun run build && ultracite fix","pack:dry":"bun run check && npm pack --dry-run","fmt:check":"oxfmt --check","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"bun run check"},"_npmUser":{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"},"repository":{"url":"git+https://github.com/dobroslavlabs/oxlint.git","type":"git"},"_npmVersion":"10.9.4","description":"Custom Oxlint JS plugin and Ultracite-style presets for JS/TS, React, Effect, Elysia, Bun, and Zod","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@oxlint/plugins":"^1.74.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.59.0","oxlint":"^1.74.0","tsdown":"^0.22.9","vitest":"^4.1.10","publint":"^0.3.21","ultracite":"^7.9.4","typescript":"^7","@types/node":"^26.1.1","unplugin-unused":"^0.5.7","@dobroslavlabs/oxlint":".","@arethetypeswrong/core":"^0.18.5"},"peerDependencies":{"oxlint":">=1.74.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxlint_0.1.2_1784415361378_0.6974802827437085","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dobroslavlabs/oxlint","version":"0.1.3","keywords":["bun","design-system","dobroslavlabs","effect","elysia","eslint","jsx","linter","oxlint","plugin","preset","react","typescript","zod"],"author":{"url":"https://github.com/dobroslavlabs","name":"Dobroslav Radosavljevic"},"license":"MIT","_id":"@dobroslavlabs/oxlint@0.1.3","maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"homepage":"https://github.com/dobroslavlabs/oxlint#readme","bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"dist":{"shasum":"945ca867de26daa0f5ccf6537b903d9b834db7c5","tarball":"https://registry.npmjs.org/@dobroslavlabs/oxlint/-/oxlint-0.1.3.tgz","fileCount":28,"integrity":"sha512-tm2+JDdSqK0Z2ENLpS0QVKxmqgX32jnDqTHKStLTYAe3D0sV5Xx9syHkgyTppKMYI6wjO8ow/y91cdkcbbsDZQ==","signatures":[{"sig":"MEUCIFNvSdCh9QYOZjX0aJs53Ge7tP44+HBRuGLzD/kY3YuKAiEA5bh+IRc3LsWvDZKkSiyr5dyou8F1hZaEOoQmf4GL6j4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514920},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./bun":{"types":"./dist/presets/bun.d.ts","import":"./dist/presets/bun.js","default":"./dist/presets/bun.js"},"./zod":{"types":"./dist/presets/zod.d.ts","import":"./dist/presets/zod.js","default":"./dist/presets/zod.js"},"./core":{"types":"./dist/presets/core.d.ts","import":"./dist/presets/core.js","default":"./dist/presets/core.js"},"./react":{"types":"./dist/presets/react.d.ts","import":"./dist/presets/react.js","default":"./dist/presets/react.js"},"./effect":{"types":"./dist/presets/effect.d.ts","import":"./dist/presets/effect.js","default":"./dist/presets/effect.js"},"./elysia":{"types":"./dist/presets/elysia.d.ts","import":"./dist/presets/elysia.js","default":"./dist/presets/elysia.js"},"./recommended":{"types":"./dist/presets/recommended.d.ts","import":"./dist/presets/recommended.js","default":"./dist/presets/recommended.js"},"./package.json":"./package.json"},"gitHead":"cf4e23e6356b51d6cb78bafe10664d7c2f67c327","scripts":{"dev":"tsdown --watch","fmt":"oxfmt","lint":"bun run build && ultracite check","test":"vitest run","build":"tsdown","check":"bun run build && bun run typecheck && bun run test && bun run fmt:check && ultracite check","login":"npm login --auth-type=web","prepack":"bun run build","release":"npm publish --access public","lint:fix":"bun run build && ultracite fix","pack:dry":"bun run check && npm pack --dry-run","fmt:check":"oxfmt --check","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"bun run check"},"_npmUser":{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"},"repository":{"url":"git+https://github.com/dobroslavlabs/oxlint.git","type":"git"},"_npmVersion":"10.9.4","description":"Custom Oxlint JS plugin and Ultracite-style presets for JS/TS, React, Effect, Elysia, Bun, and Zod","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@oxlint/plugins":"^1.74.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.59.0","oxlint":"^1.74.0","tsdown":"^0.22.9","vitest":"^4.1.10","publint":"^0.3.21","ultracite":"^7.9.4","typescript":"^7","@types/node":"^26.1.1","unplugin-unused":"^0.5.7","@dobroslavlabs/oxlint":".","@arethetypeswrong/core":"^0.18.5"},"peerDependencies":{"oxlint":">=1.74.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/oxlint_0.1.3_1784453648104_0.29060420963595646","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dobroslavlabs/oxlint","version":"0.1.4","description":"Custom Oxlint JS plugin and Ultracite-style presets for JS/TS, React, Effect, Elysia, Bun, Zod, and TanStack Router","keywords":["bun","design-system","dobroslavlabs","effect","elysia","eslint","jsx","linter","oxlint","plugin","preset","react","tanstack-router","typescript","zod"],"homepage":"https://github.com/dobroslavlabs/oxlint#readme","bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"license":"MIT","author":{"name":"Dobroslav Radosavljevic","url":"https://github.com/dobroslavlabs"},"repository":{"type":"git","url":"git+https://github.com/dobroslavlabs/oxlint.git"},"type":"module","sideEffects":false,"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./core":{"types":"./dist/presets/core.d.ts","import":"./dist/presets/core.js","default":"./dist/presets/core.js"},"./react":{"types":"./dist/presets/react.d.ts","import":"./dist/presets/react.js","default":"./dist/presets/react.js"},"./effect":{"types":"./dist/presets/effect.d.ts","import":"./dist/presets/effect.js","default":"./dist/presets/effect.js"},"./bun":{"types":"./dist/presets/bun.d.ts","import":"./dist/presets/bun.js","default":"./dist/presets/bun.js"},"./elysia":{"types":"./dist/presets/elysia.d.ts","import":"./dist/presets/elysia.js","default":"./dist/presets/elysia.js"},"./zod":{"types":"./dist/presets/zod.d.ts","import":"./dist/presets/zod.js","default":"./dist/presets/zod.js"},"./tanstack-router":{"types":"./dist/presets/tanstack-router.d.ts","import":"./dist/presets/tanstack-router.js","default":"./dist/presets/tanstack-router.js"},"./recommended":{"types":"./dist/presets/recommended.d.ts","import":"./dist/presets/recommended.js","default":"./dist/presets/recommended.js"},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"scripts":{"build":"tsdown","dev":"tsdown --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","lint":"bun run build && ultracite check","lint:fix":"bun run build && ultracite fix","fmt":"oxfmt","fmt:check":"oxfmt --check","check":"bun run build && bun run typecheck && bun run test && bun run fmt:check && ultracite check","pack:dry":"bun run check && npm pack --dry-run","login":"npm login --auth-type=web","release":"npm publish --access public","prepack":"bun run build","prepublishOnly":"bun run check"},"dependencies":{"@oxlint/plugins":"^1.74.0"},"devDependencies":{"@arethetypeswrong/core":"^0.18.5","@dobroslavlabs/oxlint":".","@types/node":"^26.1.1","oxfmt":"^0.59.0","oxlint":"^1.74.0","publint":"^0.3.21","tsdown":"^0.22.9","typescript":"^7","ultracite":"^7.9.4","unplugin-unused":"^0.5.7","vitest":"^4.1.10"},"peerDependencies":{"oxlint":">=1.74.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"engines":{"node":">=20"},"_id":"@dobroslavlabs/oxlint@0.1.4","gitHead":"7cd7aa59594adb884cb92d3005080ae5e0de7625","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-/8it8+Mz2kEAoBElZH+DdRlfZ8yTznojJL8BNyfakf3BsoyRf2ovdc6L6OLlgVu9yShxuybuAc7seNgzRttiJw==","shasum":"8bccf8dfbc6ebda36bb3e898f2b92a090ed11310","tarball":"https://registry.npmjs.org/@dobroslavlabs/oxlint/-/oxlint-0.1.4.tgz","fileCount":31,"unpackedSize":593143,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIASsBigyi4XoTnLSHsjs87PUifByxuylP/JctWhuETSaAiAtShkcm7FuAT60q3kdB9U0GkTtsqev9s6xZxkFJ4s84w=="}]},"_npmUser":{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"},"directories":{},"maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oxlint_0.1.4_1784843579692_0.34267751973661453"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-17T14:58:26.833Z","modified":"2026-07-23T21:53:00.003Z","0.1.0":"2026-07-17T14:58:27.115Z","0.1.1":"2026-07-17T16:35:43.633Z","0.1.2":"2026-07-18T22:56:01.571Z","0.1.3":"2026-07-19T09:34:08.225Z","0.1.4":"2026-07-23T21:52:59.833Z"},"bugs":{"url":"https://github.com/dobroslavlabs/oxlint/issues"},"author":{"name":"Dobroslav Radosavljevic","url":"https://github.com/dobroslavlabs"},"license":"MIT","homepage":"https://github.com/dobroslavlabs/oxlint#readme","keywords":["bun","design-system","dobroslavlabs","effect","elysia","eslint","jsx","linter","oxlint","plugin","preset","react","tanstack-router","typescript","zod"],"repository":{"type":"git","url":"git+https://github.com/dobroslavlabs/oxlint.git"},"description":"Custom Oxlint JS plugin and Ultracite-style presets for JS/TS, React, Effect, Elysia, Bun, Zod, and TanStack Router","maintainers":[{"name":"dobroslavr","email":"dobroslav.radosavljevic@gmail.com"}],"readme":"# @dobroslavlabs/oxlint\n\nCustom [Oxlint](https://oxc.rs/docs/guide/usage/linter) **JS plugin + Ultracite-style presets** for JS/TS, React/JSX, Effect, Elysia, Bun, and Zod.\n\n- **Package:** [`@dobroslavlabs/oxlint`](https://www.npmjs.com/package/@dobroslavlabs/oxlint) (`0.1.3`)\n- **Repo:** [github.com/dobroslavlabs/oxlint](https://github.com/dobroslavlabs/oxlint)\n- **Author:** [Dobroslav Radosavljevic](https://github.com/dobroslavlabs)\n- **Rule IDs:** `dobroslavlabs/<rule>`\n- **Changelog:** [CHANGELOG.md](./CHANGELOG.md)\n\n## Quick start\n\n```bash\nbun add -d oxlint @dobroslavlabs/oxlint\n```\n\n```ts\n// oxlint.config.ts\nimport { defineConfig } from \"oxlint\";\nimport recommended from \"@dobroslavlabs/oxlint/recommended\";\n\nexport default defineConfig({\n  extends: [recommended],\n});\n```\n\nOr pick surfaces:\n\n```ts\nimport { defineConfig } from \"oxlint\";\nimport core from \"@dobroslavlabs/oxlint/core\"; // JS/TS\nimport react from \"@dobroslavlabs/oxlint/react\"; // JSX/TSX + hooks\nimport effect from \"@dobroslavlabs/oxlint/effect\"; // Effect (opt-in)\nimport elysia from \"@dobroslavlabs/oxlint/elysia\"; // Elysia (opt-in)\nimport bun from \"@dobroslavlabs/oxlint/bun\"; // Bun (opt-in)\nimport zod from \"@dobroslavlabs/oxlint/zod\"; // Zod (opt-in)\nimport tanstackRouter from \"@dobroslavlabs/oxlint/tanstack-router\"; // TanStack Router (opt-in)\n\nexport default defineConfig({\n  extends: [core, react, effect, elysia, bun, zod, tanstackRouter],\n});\n```\n\n## Presets\n\n| Import | Scope | Enables |\n| --- | --- | --- |\n| `@dobroslavlabs/oxlint/recommended` | core + react | Default JS/TS + React set |\n| `@dobroslavlabs/oxlint/core` | all files | Plain JS/TS rules |\n| `@dobroslavlabs/oxlint/react` | React/JSX (+ hooks) | Component / JSX / hook rules |\n| `@dobroslavlabs/oxlint/effect` | all files | Effect / tagged-error rules (opt-in) |\n| `@dobroslavlabs/oxlint/elysia` | all files | ElysiaJS best-practice rules (opt-in) |\n| `@dobroslavlabs/oxlint/bun` | all files | Prefer Bun-native APIs (opt-in) |\n| `@dobroslavlabs/oxlint/zod` | all files | Zod schema rules (opt-in) |\n| `@dobroslavlabs/oxlint/tanstack-router` | all files | TanStack Router typed-nav rules (opt-in) |\n| `@dobroslavlabs/oxlint` | — | Plugin only; enable `dobroslavlabs/*` yourself |\n\nEach preset sets `jsPlugins: [\"@dobroslavlabs/oxlint\"]` and turns on the matching rules. `/effect`, `/elysia`, `/bun`, `/zod`, and `/tanstack-router` are **not** included in `/recommended`.\n\n## Rules\n\n### Core\n\n| Rule | Summary |\n| --- | --- |\n| `require-jsdoc` | Descriptive JSDoc on complex functions (defaults: statements ≥4, params ≥3, complexity ≥3) |\n| `no-double-type-assertion` | Ban nested / `as unknown as` assertions |\n| `no-response-json-type-assertion` | Ban asserting any `*.json()` call output |\n| `no-dom-target-type-assertion` | Ban casting `event.target` / `e.target` to DOM elements |\n| `no-direct-process-env` | Ban `process.env` (allows `NODE_ENV`, `VITEST`, `JEST_WORKER_ID` by default) |\n| `no-index-barrels` | Ban `index.*` barrel files (`allow` for package entrypoints) |\n| `no-index-imports` | Ban imports with an explicit `/index` path segment |\n| `no-pure-re-export-files` | Ban non-index files that only re-export |\n| `no-forbidden-imports` | Configurable import denylist (`paths` / `patterns`) — no-op until configured |\n\nMost core rules accept `{ allow?: string[] }` (path substrings — use distinctive fragments). `no-direct-process-env` also takes `allowKeys` (`[]` bans all keys; does not fall back to defaults).\n\n**Notes:** `no-index-imports` only flags explicit `/index` paths (directory imports like `./components` are allowed).\n\n```ts\n\"dobroslavlabs/require-jsdoc\": [\"error\", { minStatements: 5, minParams: 4 }],\n\"dobroslavlabs/no-index-barrels\": [\"error\", { allow: [\"src/index.ts\"] }],\n\"dobroslavlabs/no-direct-process-env\": [\"error\", { allowKeys: [\"NODE_ENV\", \"CI\"] }],\n\"dobroslavlabs/no-forbidden-imports\": [\n  \"error\",\n  {\n    paths: [{ name: \"lucide-react\", message: \"Use Hugeicons instead.\" }],\n    patterns: [{ regex: \"^@unpic/react\", message: \"Use the shared Image component.\" }],\n  },\n],\n```\n\n### React\n\n| Rule | Summary |\n| --- | --- |\n| `no-native-html` | Ban high-confidence native HTML; suggest UI components by name |\n| `no-react-namespace` | Ban `import React` / `import * as React` and `React.*` access |\n| `component-file-name-match` | First primary exported component matches kebab file basename |\n| `no-multi-component-files` | One module-level primary component per file (`*Impl` / `*Provider` / `*Context` ignored) |\n| `hook-file-name-match` | Hook in `use-*.ts(x)` matches basename |\n| `no-multi-hook-files` | One hook per `use-*.ts(x)` file |\n| `no-jsx-module-constants` | No module-level JSX `const` |\n| `no-jsx-local-constants-in-components` | No local JSX `const` inside components |\n| `no-jsx-variable-reassignment-in-components` | No JSX via local reassignment |\n| `no-jsx-iife-in-components` | No JSX-returning IIFEs in components |\n| `no-render-helper-functions-in-components` | No nested JSX-returning helpers in components |\n\nReact JSX rules are scoped to `**/*.{jsx,tsx}` in the react preset. Hook rules and `no-react-namespace` also apply to plain `.ts` (React types / hooks). Most accept `{ allow?: string[] }`.\n\n**Limits (v1):** class components and `forwardRef` wrappers are not covered by file-shape / JSX-hygiene rules. Secondary named exports after the first primary component are ignored by `component-file-name-match`.\n\n**`no-native-html` default ban list:**  \n`button` · `a` · `input` · `textarea` · `select` · `option` · `optgroup` · `label` · `img` · `video` · `audio` · `picture` · `source` · `iframe` · `dialog` · `details` · `summary` · `progress` · `ul` · `ol` · `li` · `table` · `thead` · `tbody` · `tfoot` · `tr` · `th` · `td` · `caption` · `hr`\n\n```ts\n\"dobroslavlabs/no-native-html\": [\"error\", { tags: [\"button\", \"a\"] }],\n```\n\n### Effect (opt-in — `@dobroslavlabs/oxlint/effect`)\n\n| Rule | Summary |\n| --- | --- |\n| `no-run-promise-in-domain` | Ban `runPromise*` outside boundary paths (defaults: `/routes/`, `/runtime/`, `/cli/`, `/main.ts`, …) |\n| `no-run-promise-in-effect-tests` | Ban `runPromise*` in tests — prefer `@effect/vitest` `it.effect` |\n| `no-run-effect-inside-effect` | Ban runners inside `Effect.gen` / `Effect.fn` |\n| `no-try-catch-in-effect-gen` | Ban `try`/`catch` inside gen/fn — use `Effect.try` / `catchTag` |\n| `prefer-return-yield-star` | Prefer `return yield*` for the **terminal** yield in a gen/fn body |\n| `no-outdated-effect-api` | Ban curated Effect v3 APIs (`Effect.catchAll`, `Context.Tag`, …) |\n| `no-effect-run-sync-at-module-scope` | Ban top-level `runSync` / `Effect.runSync` / `*.runSync` |\n| `no-singleton-service-export` | Ban `export const fooService = new FooService()` |\n| `require-tagged-error-class` | Prefer `Schema.TaggedErrorClass` over `extends Error` / `Schema.TaggedError` |\n| `require-tagged-error-message` | Require `message` on `TaggedErrorClass()(tag, schema)` schemas |\n| `no-effect-wrapper-helpers` | Ban unwrap / fromResult bridges (narrow filenames: `from-nullable`, `effect-result`, …) |\n| `no-multiple-effect-provide` | Prefer one composed Layer over many `Effect.provide` in a pipe chain |\n| `prefer-effect-fn` | Prefer `Effect.fn(\"Name\")` over bare module-scope `Effect.gen` (skips `program`/`main`/boundaries) |\n| `no-tagged-error-instanceof` | Ban `instanceof SomeError` for tagged/domain errors (use `catchTag`) |\n| `no-generic-error-in-fail` | Ban `new Error(...)` in `Effect.fail` / `Result.err` (configurable `methods`) |\n\nMost accept `{ allow?: string[] }`. Pair with `@effect/language-service` for type-aware checks (floating Effect, full outdated API catalog, etc.).\n\n```ts\nimport effect from \"@dobroslavlabs/oxlint/effect\";\n\nexport default defineConfig({\n  extends: [recommended, effect],\n});\n```\n\n### Zod (opt-in — `@dobroslavlabs/oxlint/zod`)\n\n| Rule | Summary |\n| --- | --- |\n| `zod-modern-format-validators` | Prefer `z.email()` / `z.url()` / `z.uuid()` over `z.string().email()` style |\n| `zod-schema-naming` | Exported `z.*` schema defs must be PascalCase `*Schema` |\n\n`zod-schema-naming` flags definitional `z.object()` / `z.string()` etc., not `UserSchema.pick()` or `makeUserSchema()`.\n\n```ts\nimport zod from \"@dobroslavlabs/oxlint/zod\";\n\nexport default defineConfig({\n  extends: [recommended, zod],\n});\n```\n\n### Elysia (opt-in — `@dobroslavlabs/oxlint/elysia`)\n\nRules only run in files that `import` from `elysia`.\n\n| Rule | Summary |\n| --- | --- |\n| `no-context-param` | Ban typing handler params as `Context` — destructure fields |\n| `prefer-status-helper` | Prefer `status(code, value)` over `set.status` in handlers/hooks |\n| `require-route-schema` | Require `body`/`query`/`params`/… on `post`/`put`/`patch` (honors `.guard()` / `.group()`) |\n| `require-plugin-name` | Require `{ name }` on **exported** `new Elysia()` plugins (skips `.listen` / entry/`modules` paths) |\n| `no-functional-plugin-callback` | Prefer `new Elysia()` over `.use((app) => …)` |\n| `no-controller-context-class` | Ban class methods typed with `Context` |\n| `prefer-throw-status` | Prefer `status()` / `throw status()` over `throw new Error` / string throws |\n| `no-cookie-undefined-check` | Check `cookie.x.value`, not `cookie.x` as optional |\n| `require-response-schema` | When handler uses bare `status()`, declare a `response` schema |\n\n```ts\nimport elysia from \"@dobroslavlabs/oxlint/elysia\";\n\nexport default defineConfig({\n  extends: [recommended, elysia],\n});\n```\n\n### Bun (opt-in — `@dobroslavlabs/oxlint/bun`)\n\nFor Bun apps. Prefer Bun-native APIs over Node fallbacks (docs: `Bun.file` / `Bun.write` / `Bun.spawn` / `bun:sqlite`). Does **not** ban `node:fs` directory APIs (`readdir`, `mkdir`, …). Use `{ allow }` for isomorphic packages.\n\n| Rule | Summary |\n| --- | --- |\n| `prefer-bun-file-read` | `fs.readFile*` → `Bun.file(…).text()` / `.json()` / `.bytes()` |\n| `prefer-bun-write` | `fs.writeFile*` → `Bun.write` (not `appendFile`) |\n| `prefer-bun-spawn` | `child_process.spawn/fork/execFile*` → `Bun.spawn` / `Bun.spawnSync` |\n| `prefer-import-meta-paths` | `__dirname` / `__filename` → `import.meta.dir` / `import.meta.path` |\n| `no-node-http-server` | Ban `http(s).createServer` — use `Bun.serve` or Elysia/Hono |\n| `prefer-bun-sqlite` | Ban `better-sqlite3` / `sqlite3` / `node:sqlite` → `bun:sqlite` |\n| `prefer-bun-sqlite-strict` | Prefer `new Database(…, { strict: true })` |\n| `prefer-bun-shell` | `execa` / `child_process.exec*` shell strings → `` $`…` `` |\n| `prefer-response-json` | `JSON.stringify` + `end`/`send`/`Response` → `Response.json` |\n| `no-bun-sleep-sync-in-async` | No `Bun.sleepSync` inside `async` — use `await Bun.sleep` |\n\n```ts\nimport bun from \"@dobroslavlabs/oxlint/bun\";\n\nexport default defineConfig({\n  extends: [recommended, bun],\n});\n```\n\n### TanStack Router (opt-in — `@dobroslavlabs/oxlint/tanstack-router`)\n\nSuper-strict typed navigation. Rules only run in files that `import` from `@tanstack/react-router`, `@tanstack/solid-router`, or Start re-exports. Prefer string-literal `to` + `params`/`search`, or typed `linkOptions` (spread / pass-through).\n\n| Rule | Summary |\n| --- | --- |\n| `no-dynamic-router-to` | Ban non-literal `to` (templates with `${}`, concat, variables) on `Link` / `Navigate` / `navigate` / `redirect` / `linkOptions` / `router.navigate` |\n| `no-router-href` | Ban `href` except external URL literals (`http(s):`, `mailto:`, `tel:`, `//`) |\n| `no-relative-router-to-without-from` | Relative `to` (`.`, `..`, non-`/` paths) requires `from` |\n| `no-router-type-assertion` | Ban casts / annotations / generics that bypass router inference on `to`/`from` and hook returns |\n| `require-router-hook-from` | Bare `useNavigate` / `useParams` / `useSearch` / … need `from` or `strict: false` (`Route.useX()` OK) |\n| `no-imperative-location-navigation` | Ban `location` / `history` / `router.history` for in-app navigation |\n\n```ts\nimport tanstackRouter from \"@dobroslavlabs/oxlint/tanstack-router\";\n\nexport default defineConfig({\n  extends: [recommended, tanstackRouter],\n});\n```\n\n## Develop\n\n```bash\nbun install\nbun run test        # Vitest + Oxlint RuleTester (Node 22+)\nbun run typecheck   # strict TypeScript 7\nbun run fmt         # oxfmt\nbun run lint        # build + ultracite check (dogfoods this package)\nbun run build       # tsdown → dist (publint + attw + unused)\nbun run check       # build → typecheck → test → fmt:check → lint\n```\n\nStack: [Bun](https://bun.sh) · TypeScript 7 · [Ultracite](https://www.ultracite.ai/) (oxlint + oxfmt) · [tsdown](https://tsdown.dev/) · [Vitest](https://vitest.dev) · `@oxlint/plugins`\n\nCI (`.github/workflows/ci.yml`) runs `check` on **`main`** push/PR. It does **not** publish.\n\nEditor: Oxc VS Code extension (format + fix on save — import sort via oxfmt, unused-import removal via oxlint).\n\n## Publish (local only)\n\n```bash\nbun run login      # npm login --auth-type=web (browser / 2FA)\nbun run pack:dry   # check + npm pack --dry-run\nbun run release    # npm publish --access public\n```\n\n`prepublishOnly` runs `check`; `prepack` runs `build`. See [CHANGELOG.md](./CHANGELOG.md) for release notes.\n","readmeFilename":"README.md"}