{"_id":"effect-oxlint","_rev":"8-6ec0ad91de04e47b821835f28b7a23d9","name":"effect-oxlint","dist-tags":{"latest":"0.3.4"},"versions":{"0.1.0":{"name":"effect-oxlint","version":"0.1.0","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.1.0","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"d0f9b793e342f0ca3870390a00c314ea221eb3e9","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.1.0.tgz","fileCount":16,"integrity":"sha512-FssXikZRWSUnGfjTxrM61217/NmTrZdZV1IDzQsL1O5OZtoqGuI/xDH06/AhlJn93U3zMYhvfLdOYhx01s6fkg==","signatures":[{"sig":"MEYCIQCI8RjIz4/iZTf0C79F30O+z3d3XuVviQ+04ysEUFl6wwIhAJ345kknWAsOwC2nUzz3ZiVpelY58KzHfbwq4rHPEj2j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":115770},"type":"module","$schema":"https://www.schemastore.org/package.json","exports":{".":{"import":"./src/index.ts"}},"gitHead":"943ff0d40c662acd5e98ca5a4ea9e44be3ce275f","scripts":{"test":"vitest run","build":"vp build","check":"vp check --fix","prepare":"effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"mpsuesser","email":"mpsuesser@gmail.com"},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.15","effect":"4.0.0-beta.43"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"10.9.4","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@oxlint/plugins":"^1.57.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.11","devDependencies":{"effect":"4.0.0-beta.43","vitest":"^4.1.0","vite-plus":"^0.1.15","@types/bun":"^1.3.10","typescript":"^5.9.3","@effect/tsgo":"^0.1.1","@effect/vitest":"4.0.0-beta.43","@typescript/native-preview":"^7.0.0-dev.20260401.1"},"peerDependencies":{"effect":"^4.0.0-beta.43"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.1.0_1775085838184_0.38061577981380035","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"effect-oxlint","version":"0.1.1","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.1.1","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"1e0d83ca8ab9733a89d6ab8362da0f22c24a3523","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.1.1.tgz","fileCount":16,"integrity":"sha512-FW09H1cpBoJXGhNiCBKBi4Xy/bTsh2HR7TbHeIpqDdGCyQFXudUiaJhBnLvPu83wcIg84JsBan8jye1YZjKP1A==","signatures":[{"sig":"MEYCIQCxLzy2rsBWm7ZVcbot+TPZ9JmrnMSN0o5jDRGTKkxUyAIhAP1HxUFGRaCL1I4rcKyTdREx2ZcZLoSeWKndOcjFkJCF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116138},"type":"module","$schema":"https://www.schemastore.org/package.json","exports":{".":{"import":"./src/index.ts"}},"gitHead":"69fd184f20fe0cadb7a3526b9fe9fc22dbbccc92","scripts":{"test":"vitest run","build":"vp build","check":"vp check --fix","prepare":"effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"mpsuesser","email":"mpsuesser@gmail.com"},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.15","effect":"4.0.0-beta.47"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"10.9.7","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@oxlint/plugins":"^1.57.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.12","devDependencies":{"effect":"4.0.0-beta.47","vitest":"^4.1.0","vite-plus":"^0.1.15","@types/bun":"^1.3.10","typescript":"^5.9.3","@effect/tsgo":"^0.1.1","@effect/vitest":"4.0.0-beta.47","@typescript/native-preview":"^7.0.0-dev.20260401.1"},"peerDependencies":{"effect":"^4.0.0-beta.47"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.1.1_1776050290706_0.03598403280389739","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"effect-oxlint","version":"0.2.0","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.2.0","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"831f3d68d3e1c591e676bd224feb659732a0bb98","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.2.0.tgz","fileCount":16,"integrity":"sha512-NIUXVDK5tdmVQG7q36BDtlWk/DSewWoFtSOjFmeBQYkYCS869jtLKheSxnMCEDY7PktgFizriAHLoPQ4zy9rrQ==","signatures":[{"sig":"MEUCIFpVaXnlPN11URS0ePqFu4ejebKXpMvT10MPfraQytppAiEAjKhdVoINizAuPnBw/ec3D5/MsIpFygQTl5/2Cke6vAw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":127449},"type":"module","types":"./src/index.ts","$schema":"https://www.schemastore.org/package.json","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./testing":{"types":"./src/Testing.ts","import":"./src/Testing.ts"}},"gitHead":"aa30c910e09b8c2c649926e70a723b5beca51e59","scripts":{"test":"vitest run","build":"bunx --bun vp build","check":"bunx --bun vp check --fix","prepare":"effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"mpsuesser","email":"mpsuesser@gmail.com"},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.15","effect":"4.0.0-beta.57"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"10.9.7","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@oxlint/plugins":"^1.57.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.12","devDependencies":{"effect":"4.0.0-beta.57","vitest":"^4.1.0","vite-plus":"^0.1.15","@types/bun":"^1.3.10","typescript":"^5.9.3","@effect/tsgo":"^0.1.1","@effect/vitest":"4.0.0-beta.57","@typescript/native-preview":"^7.0.0-dev.20260401.1"},"peerDependencies":{"effect":"^4.0.0-beta.57"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.2.0_1777026504599_0.4414777882512282","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"effect-oxlint","version":"0.3.0","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.3.0","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"c77baa1b9de95ec69c3a8a28e6aed1bcac24e93b","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.3.0.tgz","fileCount":23,"integrity":"sha512-qmATldyC0j1r7PVTWhwScp9bmZ88Im/64+I4dzVmvYhf2z0HVbFgkVowyzrjNYulDq8ZV3EdZLvtoUgn8HXang==","signatures":[{"sig":"MEQCIA9gRmXYHu0D/5TSBY8zhUtgIAHru/KLVQD2TJmEWgf+AiAq5mv7gsES9FVPnxIHLc7m9ZVPTC/fub99w6Fgl1/UrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256403},"type":"module","types":"./dist/index.d.ts","$schema":"https://www.schemastore.org/package.json","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"6d8b5d7f45af7aa0e1e82405ef18085659bc3e81","scripts":{"test":"vitest run","build":"tsdown","check":"bunx --bun vp check --fix","prepack":"bun run build","prepare":"bunx --bun effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"mpsuesser","email":"mpsuesser@gmail.com"},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.22","effect":"4.0.0-beta.70"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"11.12.1","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@oxlint/plugins":"^1.66.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"effect":"4.0.0-beta.70","tsdown":"^0.22.0","vitest":"^4.1.7","vite-plus":"^0.1.22","@types/bun":"^1.3.14","typescript":"^6.0.3","@effect/tsgo":"^0.11.0","@effect/vitest":"4.0.0-beta.70","@typescript/native-preview":"^7.0.0-dev.20260523.1"},"peerDependencies":{"effect":"^4.0.0-beta.70"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.3.0_1779532533812_0.3237146485209015","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"effect-oxlint","version":"0.3.1","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.3.1","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"97ac1d11fc0cb341cca6aee62c16761bd846a372","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.3.1.tgz","fileCount":23,"integrity":"sha512-ocVyRRx/sGEvDqEREe1/ygXzAJoA2bbdcqeNL7yPdz6zwzR3U7LalVu9n+XjDsc4panUSYVD5wQhh6bp1I2ieg==","signatures":[{"sig":"MEQCIDBBs9MZQwRswEZ5LgY2q9LG3VvZ3rBx4AhAufw3reN/AiBYTJ66Wc4bRqVlcD2Ptnu0t8kluN6BPWgsCND5YoT6Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257857},"type":"module","types":"./dist/index.d.ts","$schema":"https://www.schemastore.org/package.json","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"91fac4e85d4beeaffc0d2458b75d8efffdf52139","scripts":{"test":"vitest run","build":"tsdown","check":"bunx --bun vp check --fix","prepack":"bun run build","prepare":"bunx --bun effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"mpsuesser","email":"mpsuesser@gmail.com"},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.22","effect":"4.0.0-beta.70"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"11.12.1","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@oxlint/plugins":"^1.66.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"effect":"4.0.0-beta.70","tsdown":"^0.22.0","vitest":"^4.1.7","vite-plus":"^0.1.22","@types/bun":"^1.3.14","typescript":"^6.0.3","@effect/tsgo":"^0.11.0","@effect/vitest":"4.0.0-beta.70","@typescript/native-preview":"^7.0.0-dev.20260523.1"},"peerDependencies":{"effect":"^4.0.0-beta.70"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.3.1_1779534410614_0.7884507691888376","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"effect-oxlint","version":"0.3.2","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.3.2","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"6503b7cb81e543ae1a76c664e25ee72fe294fb2c","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.3.2.tgz","fileCount":23,"integrity":"sha512-IBCRRtcwP9LQVxHNnA6n7LBcrIFnBcCsUyUWo1fHBJqBUQ/Tj2DcDgiPhf0DnE5ClhJYtXMAKh6Fc/EuaG49hQ==","signatures":[{"sig":"MEYCIQC5Eym3a4BDBCAM8I+PnR8G5PUvAqrzptIPpuS8FIeXNgIhAI53a4XfL5tVth6/QDlOwQZ/t7fY8XQ6es8TlDdlW3oL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258146},"type":"module","types":"./dist/index.d.ts","$schema":"https://www.schemastore.org/package.json","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"6ad5a2db5489eb7bf2da1b5d541f27bab2b9f516","scripts":{"test":"vitest run","build":"tsdown","check":"bunx --bun vp check --fix","prepack":"bun run build","prepare":"bunx --bun effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dca90aeb-86d4-4710-867f-fc30ccf0c401"}},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.22","effect":"4.0.0-beta.78"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"11.16.0","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@oxlint/plugins":"^1.66.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"effect":"4.0.0-beta.78","tsdown":"^0.22.0","vitest":"^4.1.7","vite-plus":"^0.1.22","@types/bun":"^1.3.14","typescript":"^6.0.3","@effect/tsgo":"^0.11.0","@effect/vitest":"4.0.0-beta.78","@typescript/native-preview":"^7.0.0-dev.20260523.1"},"peerDependencies":{"effect":"^4.0.0-beta.78"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.3.2_1780955601901_0.14402981202603415","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"effect-oxlint","version":"0.3.3","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"author":{"name":"Marc Suesser"},"license":"MIT","_id":"effect-oxlint@0.3.3","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"dist":{"shasum":"f2c48303c8491f56a339651858cf866a22c13700","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.3.3.tgz","fileCount":23,"integrity":"sha512-J1+0nr0S4mOkPq54Lj2jNpq2iu9UKB+ChhxfT9HANKHKiQaOqjycZqaq8iiZHRGqT36Ir+Lv02LoVLsuA+NfGA==","signatures":[{"sig":"MEUCIQDc/ijvnQtGllgpJbxT/rCjaT+0LWRYBvAlEOj9eeOFowIgLPTugnv+F7Zbl/lr2P4Wmg90W1T1MxWjdbDCErVdPyo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258630},"type":"module","types":"./dist/index.d.ts","$schema":"https://www.schemastore.org/package.json","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"37ea33bf5684c00cf4d6d26a8826329dc6fee1e9","scripts":{"test":"vitest run","build":"tsdown","check":"bunx --bun vp check --fix","prepack":"bun run build","prepare":"bunx --bun effect-tsgo patch","typecheck":"tsgo"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dca90aeb-86d4-4710-867f-fc30ccf0c401"}},"overrides":{"vite":"npm:@voidzero-dev/vite-plus-core@0.1.22","effect":"4.0.0-beta.100"},"repository":{"url":"git+https://github.com/mpsuesser/effect-oxlint.git","type":"git"},"_npmVersion":"12.0.1","description":"Effect-first library for writing oxlint custom lint rules","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@oxlint/plugins":"^1.66.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"effect":"4.0.0-beta.100","tsdown":"^0.22.0","vitest":"^4.1.7","vite-plus":"^0.1.22","@types/bun":"^1.3.14","typescript":"^6.0.3","@effect/tsgo":"^0.11.0","@effect/vitest":"4.0.0-beta.100","@typescript/native-preview":"^7.0.0-dev.20260523.1"},"peerDependencies":{"effect":"^4.0.0-beta.100"},"_npmOperationalInternal":{"tmp":"tmp/effect-oxlint_0.3.3_1784695648510_0.5341200026708266","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"$schema":"https://www.schemastore.org/package.json","name":"effect-oxlint","version":"0.3.4","description":"Effect-first library for writing oxlint custom lint rules","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"homepage":"https://github.com/mpsuesser/effect-oxlint#readme","bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"license":"MIT","author":{"name":"Marc Suesser"},"repository":{"type":"git","url":"git+https://github.com/mpsuesser/effect-oxlint.git"},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"scripts":{"build":"tsdown","check":"bunx --bun vp check --fix","test":"vitest run","typecheck":"tsc","prepare":"bunx --bun effect-tsgo patch","prepack":"bun run build"},"dependencies":{"@oxlint/plugins":"^1.80.0"},"devDependencies":{"@effect/tsgo":"0.38.0","@effect/vitest":"4.0.0-rc.112","@types/bun":"^1.4.0","effect":"4.0.0-rc.112","tsdown":"^0.22.14","typescript":"7.0.2","vite-plus":"0.3.0","vitest":"4.1.11"},"peerDependencies":{"effect":"^4.0.0-rc.112"},"overrides":{"effect":"4.0.0-rc.112","vite":"npm:@voidzero-dev/vite-plus-core@0.3.0","vitest":"4.1.11"},"packageManager":"bun@1.4.0","gitHead":"d8c892f4fedc072409dca290ac44733bf5dc3e87","_id":"effect-oxlint@0.3.4","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-VaI72NhDI+OBk8rkWBxR3D+k8iQN5KX4caiTRtWR/KDlif4KdxmjPelQqflwwprxkGldEpLry9fQvvzlBWY6bA==","shasum":"6422601b8b2d0d4e043be24f2ea7a27d306399b7","tarball":"https://registry.npmjs.org/effect-oxlint/-/effect-oxlint-0.3.4.tgz","fileCount":23,"unpackedSize":258951,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/effect-oxlint@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDqz+R2LeBw745oHuzVcRfhHS62ikwodUnltgaU9t0L3AIgF1+cj1pJUT5EL2UT7B4uO5f1vys7S7OHUM29Yi66U58="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dca90aeb-86d4-4710-867f-fc30ccf0c401"}},"directories":{},"maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/effect-oxlint_0.3.4_1787897709360_0.22366578813672877"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-01T23:23:58.062Z","modified":"2026-08-28T06:15:09.827Z","0.1.0":"2026-04-01T23:23:58.305Z","0.1.1":"2026-04-13T03:18:10.849Z","0.2.0":"2026-04-24T10:28:24.745Z","0.3.0":"2026-05-23T10:35:33.977Z","0.3.1":"2026-05-23T11:06:50.868Z","0.3.2":"2026-06-08T21:53:22.047Z","0.3.3":"2026-07-22T04:47:28.651Z","0.3.4":"2026-08-28T06:15:09.511Z"},"bugs":{"url":"https://github.com/mpsuesser/effect-oxlint/issues"},"author":{"name":"Marc Suesser"},"license":"MIT","homepage":"https://github.com/mpsuesser/effect-oxlint#readme","keywords":["ast","effect","eslint","lint","linter","oxc","oxlint","plugin","rules","typescript"],"repository":{"type":"git","url":"git+https://github.com/mpsuesser/effect-oxlint.git"},"description":"Effect-first library for writing oxlint custom lint rules","maintainers":[{"name":"mpsuesser","email":"mpsuesser@gmail.com"}],"readme":"# effect-oxlint\n\n[![npm](https://img.shields.io/npm/v/effect-oxlint)](https://www.npmjs.com/package/effect-oxlint)\n[![JSR](https://jsr.io/badges/@effect-oxlint/effect-oxlint)](https://jsr.io/@effect-oxlint/effect-oxlint)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)\n\nWrite [oxlint](https://oxc.rs/docs/guide/usage/linter) custom lint rules with [Effect v4](https://effect.website).\n\n`effect-oxlint` wraps `@oxlint/plugins` in Effect idioms so rule authors get typed errors, composable visitors, `Option`-safe AST matching, and `Ref`-based state without any mutable variables.\n\n## Features\n\n- **`Rule.define`** — write `create` as an Effect generator; use `yield*` for state, context, and diagnostics\n- **`Visitor.*`** — composable visitor combinators: `on`, `onExit`, `merge`, `tracked`, `filter`, `accumulate`\n- **`AST.*`** — `Option`-returning matchers with dual API (data-first and data-last): `matchMember`, `matchCallOf`, `matchImport`, `narrow`, `memberPath`\n- **`Diagnostic.*`** — structured diagnostic builders with composable autofixes\n- **`SourceCode.*` / `Scope.*`** — effectful queries over tokens, comments, scope, and variables\n- **`Testing.*`** (from `effect-oxlint/testing`) — mock builders, rule runners, and assertion helpers for `@effect/vitest`\n- **`Plugin.define`** — assemble rules into a plugin that oxlint can load\n\n## Install\n\n```sh\nnpm install effect-oxlint effect@4.0.0-rc.112\n```\n\n```sh\nbun add effect-oxlint effect@4.0.0-rc.112\n```\n\n```sh\ndeno add jsr:@effect-oxlint/effect-oxlint\n```\n\n## Quick Start\n\n### 1. Define a rule\n\n```ts\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport { AST, Diagnostic, Rule, RuleContext } from 'effect-oxlint';\n\nconst noJsonParse = Rule.define({\n\tname: 'no-json-parse',\n\tmeta: Rule.meta({\n\t\ttype: 'suggestion',\n\t\tdescription: 'Use Schema for JSON decoding instead of JSON.parse'\n\t}),\n\tcreate: function* () {\n\t\tconst ctx = yield* RuleContext;\n\t\treturn {\n\t\t\t// node is typed as ESTree.MemberExpression automatically\n\t\t\tMemberExpression: (node) =>\n\t\t\t\tOption.match(\n\t\t\t\t\tAST.matchMember(node, 'JSON', ['parse', 'stringify']),\n\t\t\t\t\t{\n\t\t\t\t\t\tonNone: () => Effect.void,\n\t\t\t\t\t\tonSome: (matched) =>\n\t\t\t\t\t\t\tctx.report(\n\t\t\t\t\t\t\t\tDiagnostic.make({\n\t\t\t\t\t\t\t\t\tnode: matched,\n\t\t\t\t\t\t\t\t\tmessage: 'Use Schema for JSON'\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t};\n\t}\n});\n```\n\n### 2. Use convenience factories for common patterns\n\n```ts\nimport { Rule } from 'effect-oxlint';\n\n// Ban a member expression\nconst noMathRandom = Rule.banMember('Math', 'random', {\n\tmessage: 'Use the Effect Random service instead'\n});\n\n// Ban an import\nconst noNodeFs = Rule.banImport('node:fs', {\n\tmessage: 'Use the Effect FileSystem service instead'\n});\n\n// Ban a statement type\nconst noThrow = Rule.banStatement('ThrowStatement', {\n\tmessage: 'Use Effect.fail instead of throw'\n});\n\n// Ban bare identifier calls (e.g. fetch(), useState())\nconst noFetch = Rule.banCallOf('fetch', {\n\tmessage: 'Use Effect HTTP client instead'\n});\n\n// Ban new expressions (e.g. new Date(), new Error())\nconst noNewDate = Rule.banNewExpr('Date', {\n\tmessage: 'Use Clock service instead'\n});\n\n// Ban obj.prop(...) method calls (e.g. Effect.runSync, console.log)\nconst noRunSync = Rule.banCallOfMember('Effect', ['runSync', 'runPromise'], {\n\tmessage: 'Keep effects composable — run only at the entry point'\n});\n\n// Ban multiple patterns with one rule\nconst noImperativeLoops = Rule.banMultiple(\n\t{\n\t\tstatements: [\n\t\t\t'ForStatement',\n\t\t\t'ForInStatement',\n\t\t\t'ForOfStatement',\n\t\t\t'WhileStatement',\n\t\t\t'DoWhileStatement'\n\t\t]\n\t},\n\t{ message: 'Use Arr.map / Effect.forEach instead' }\n);\n\n// Combine different ban types in a single rule\nconst useClockService = Rule.banMultiple(\n\t{\n\t\tnewExprs: 'Date',\n\t\tmembers: [['Date', 'now']]\n\t},\n\t{ message: 'Use Clock service' }\n);\n```\n\n### 3. Assemble into a plugin\n\n```ts\nimport { Plugin } from 'effect-oxlint';\n\nexport default Plugin.define({\n\tname: 'my-effect-rules',\n\tspecifier: 'oxlint-plugin-my-effect-rules',\n\trules: {\n\t\t'no-json-parse': noJsonParse,\n\t\t'no-math-random': noMathRandom,\n\t\t'no-node-fs': noNodeFs,\n\t\t'no-throw': noThrow\n\t}\n});\n```\n\n`specifier` should match the npm package name users put in oxlint's `jsPlugins` array. When it is present, `Plugin.define` also creates `configs.recommended` and `configs.all` for `oxlint.config.ts` users:\n\n```ts\nimport { defineConfig } from 'oxlint';\nimport plugin from 'oxlint-plugin-my-effect-rules';\n\nexport default defineConfig({\n\textends: [plugin.configs.recommended]\n});\n```\n\nThe generated configs use oxlint's `jsPlugins` field plus explicit fully-qualified rule names. They do not rely on ESLint-only `docs.recommended` metadata or oxlint native `categories`.\n\nBy default, every rule is recommended at `error` severity. To publish a curated recommended set, pass `recommended.rules`; TypeScript checks those names against the keys of `rules`, so typos fail during plugin development:\n\n```ts\nexport default Plugin.define({\n\tname: 'my-effect-rules',\n\tspecifier: 'oxlint-plugin-my-effect-rules',\n\trules: {\n\t\t'no-json-parse': noJsonParse,\n\t\t'no-math-random': noMathRandom\n\t},\n\trecommended: {\n\t\tseverity: 'warn',\n\t\trules: ['no-json-parse']\n\t}\n});\n```\n\n## Visitor Combinators\n\nVisitors are `Record<string, (node) => Effect<void>>` maps. The `Visitor` module provides combinators to build and compose them.\n\n### Merge multiple visitors\n\n```ts\nimport { Visitor } from 'effect-oxlint';\n\nconst combined = Visitor.merge(importVisitor, memberVisitor, statementVisitor);\n```\n\nWhen two visitors handle the same node type, both handlers run sequentially.\n\n### Track depth with `Ref`\n\nReplace mutable `let depth = 0` counters with `Visitor.tracked`:\n\n```ts\nimport * as Ref from 'effect/Ref';\nimport { AST, Visitor } from 'effect-oxlint';\n\nconst depthRef = yield * Ref.make(0);\nconst tracker = Visitor.tracked(\n\t'CallExpression',\n\t// node is typed as ESTree.CallExpression\n\t(node) => AST.isCallOf(node, 'Effect', 'gen'),\n\tdepthRef\n);\n// depthRef increments on enter, decrements on exit\n```\n\n### Accumulate and analyze\n\nCollect data during traversal, then analyze at `Program:exit`:\n\n```ts\nimport { Visitor, AST } from 'effect-oxlint';\n\nconst visitor =\n\tyield *\n\tVisitor.accumulate(\n\t\t'ExportNamedDeclaration',\n\t\t(node) => AST.narrow(node, 'ExportNamedDeclaration'),\n\t\tfunction* (exports) {\n\t\t\t// all exports collected — analyze them here\n\t\t}\n\t);\n```\n\n### Filter by filename\n\nRestrict a visitor to specific files:\n\n```ts\nimport { Visitor } from 'effect-oxlint';\n\nconst visitor =\n\tyield *\n\tVisitor.filter((filename) => !filename.endsWith('.test.ts'), mainVisitor);\n```\n\n## AST Matching\n\nEvery matcher returns `Option` for safe composition with `pipe`, `Option.map`, and `Option.flatMap`. All public matchers support dual API (data-first and data-last).\n\n```ts\nimport { pipe } from 'effect';\nimport * as Option from 'effect/Option';\nimport type { ESTree } from 'effect-oxlint';\nimport { AST } from 'effect-oxlint';\n\n// Data-first (pass a MemberExpression directly)\ndeclare const memberNode: ESTree.MemberExpression;\nAST.matchMember(memberNode, 'JSON', ['parse', 'stringify']);\n\n// Data-last (pipe-friendly)\npipe(memberNode, AST.matchMember('Effect', 'gen'));\n\n// Chain: narrow an ESTree.Node, then match\ndeclare const node: ESTree.Node;\npipe(\n\tAST.narrow(node, 'CallExpression'),\n\tOption.flatMap(AST.matchCallOf('Effect', 'gen'))\n);\n\n// Extract member path: a.b.c -> Some(['a', 'b', 'c'])\nAST.memberPath(memberNode);\n\n// Match imports by string or predicate\ndeclare const importNode: ESTree.ImportDeclaration;\nAST.matchImport(importNode, (src) => src.startsWith('node:'));\n```\n\n## Diagnostics and Autofixes\n\n```ts\nimport { Diagnostic } from 'effect-oxlint';\n\n// Basic diagnostic\nconst diag = Diagnostic.make({ node, message: 'Avoid this pattern' });\n\n// With autofix\nconst fixed = Diagnostic.withFix(\n\tdiag,\n\tDiagnostic.replaceText(node, 'replacement')\n);\n\n// Compose multiple fixes\nconst multiFix = Diagnostic.composeFixes(\n\tDiagnostic.insertBefore(node, 'prefix'),\n\tDiagnostic.insertAfter(node, 'suffix')\n);\n```\n\n## Handler Error Channel\n\nVisitor handlers — and the `create` generator itself — have a fixed error channel of `never`. That is, a rule **cannot fail** via `Effect.fail`; oxlint's plugin API is synchronous and `effect-oxlint` bridges it with `Effect.runSync`, which has no way to surface typed failures.\n\nIf a handler needs to run a fallible sub-effect, catch the failure inside the handler and decide how to surface it — typically as a reported diagnostic:\n\n```ts\nconst ctx = yield * RuleContext;\n\nconst handler = (node: ESTree.Node) =>\n\tfallibleEffect(node).pipe(\n\t\tEffect.catch(() =>\n\t\t\tctx.report(\n\t\t\t\tmakeDiagnostic({ node, message: 'could not analyse node' })\n\t\t\t)\n\t\t)\n\t);\n```\n\nSee the JSDoc on `Rule.define` and `EffectHandler` in `src/Visitor.ts` for the full contract.\n\n## Types\n\n`effect-oxlint` re-exports all `@oxlint/plugins` types so consumers don't need a direct dependency for type imports:\n\n```ts\nimport type { ESTree, OxlintPlugin, CreateRule } from 'effect-oxlint';\n\n// ESTree namespace includes all AST node types\nconst node: ESTree.CallExpression = /* ... */;\n```\n\n## Testing\n\n`effect-oxlint` ships a `Testing` module with mock AST builders, rule runners, and assertion helpers. It's exposed as a dedicated subpath export so production bundles don't pull in test-only code:\n\n```ts\nimport { describe, expect, test } from '@effect/vitest';\nimport * as Option from 'effect/Option';\nimport { Rule } from 'effect-oxlint';\nimport * as Testing from 'effect-oxlint/testing';\n\ndescribe('no-json-parse', () => {\n\ttest('reports JSON.parse', () => {\n\t\tconst result = Testing.runRule(\n\t\t\tnoJsonParse,\n\t\t\t'MemberExpression',\n\t\t\tTesting.memberExpr('JSON', 'parse')\n\t\t);\n\t\tTesting.expectDiagnostics(result, [{ message: 'Use Schema for JSON' }]);\n\t\t// Or use the messages() helper — returns Option per diagnostic\n\t\texpect(Testing.messages(result)).toEqual([\n\t\t\tOption.some('Use Schema for JSON')\n\t\t]);\n\t});\n\n\ttest('ignores other member expressions', () => {\n\t\tconst result = Testing.runRule(\n\t\t\tnoJsonParse,\n\t\t\t'MemberExpression',\n\t\t\tTesting.memberExpr('console', 'log')\n\t\t);\n\t\tTesting.expectNoDiagnostics(result);\n\t});\n});\n```\n\n### Node builders accept ergonomic shorthands\n\n```ts\n// newExpr accepts a string — auto-wrapped in id()\nTesting.newExpr('Date'); // equivalent to Testing.newExpr(Testing.id('Date'))\n\n// ifStmt params are all optional — useful for enter/exit tracking tests\nTesting.ifStmt(); // minimal IfStatement node\n\n// program() accepts a comments parameter for comment-based rules\nTesting.program(\n\t[Testing.exprStmt(Testing.callExpr('foo'))],\n\t[Testing.comment('Line', ' eslint-disable')]\n);\n```\n\nAvailable builders include `id`, `memberExpr`, `computedMemberExpr`, `chainedMemberExpr`, `callExpr`, `callOfMember`, `importDecl`, `newExpr`, `throwStmt`, `tryStmt`, `ifStmt`, `program`, `objectExpr`, and more.\n\n## Modules\n\n| Module        | Purpose                                                                                                                                     |\n| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |\n| `Rule`        | Core rule builder (`define`, `meta`, `banMember`, `banImport`, `banStatement`, `banCallOf`, `banCallOfMember`, `banNewExpr`, `banMultiple`) |\n| `Visitor`     | Composable visitors (`on`, `onExit`, `merge`, `tracked`, `filter`, `accumulate`)                                                            |\n| `AST`         | `Option`-returning pattern matchers (`matchMember`, `matchCallOf`, `matchImport`, `narrow`, `memberPath`, `findAncestor`)                   |\n| `Diagnostic`  | Diagnostic construction and autofix helpers                                                                                                 |\n| `RuleContext` | Effect service with access to file info, source code, and `report`                                                                          |\n| `SourceCode`  | Effectful queries: text, tokens, comments, scope, node location                                                                             |\n| `Scope`       | Variable lookup and reference analysis with `Option`                                                                                        |\n| `Plugin`      | `define` and `merge` for plugin assembly                                                                                                    |\n| `Comment`     | Comment type predicates (`isLine`, `isBlock`, `isJSDoc`, `isDisableDirective`)                                                              |\n| `Token`       | Token type predicates (`isKeyword`, `isPunctuator`, `isIdentifier`, `isString`)                                                             |\n| `Testing`     | Mock builders, `runRule`, `expectDiagnostics`, `messages` for test harnesses — **import from `effect-oxlint/testing`**                      |\n\n## Development\n\n```sh\nbun install                # install dependencies\nbun run check              # lint + format + typecheck (auto-fix)\nbun run test               # run all tests\nbun run typecheck          # patched TypeScript type-check only\n# Single test file\nbunx vitest run test/Rule.test.ts\n\n# By test name\nbunx vitest run -t \"reports for matching\"\n```\n\n## Requirements\n\nThe npm package publishes built ESM JavaScript and declaration files under `dist/`, so Node-based tools such as oxlint can load plugins from `node_modules` without TypeScript source loading or type stripping. The JSR package continues to publish the TypeScript source entrypoints.\n\nSupported consumers:\n\n- **Node.js / oxlint** — works from the npm package exports.\n- **Bun** — works from the npm package exports.\n- **Deno** — use the JSR package.\n\n`effect` is a peer dependency and must be installed alongside `effect-oxlint` at a matching version.\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}