{"_id":"@alephic/eslint-plugin","_rev":"3-94695b43cbb5add639476d9e1d52947c","name":"@alephic/eslint-plugin","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@alephic/eslint-plugin","version":"0.1.0","keywords":["eslint","eslintplugin","eslint-plugin"],"license":"MIT","_id":"@alephic/eslint-plugin@0.1.0","maintainers":[{"name":"gmathieu","email":"contact@gmathieu.com"}],"homepage":"https://github.com/alephic-ai/eslint-plugin#readme","bugs":{"url":"https://github.com/alephic-ai/eslint-plugin/issues"},"dist":{"shasum":"ecab25c0b2e17aff11e4aa4762b0bfe73e50ad82","tarball":"https://registry.npmjs.org/@alephic/eslint-plugin/-/eslint-plugin-0.1.0.tgz","fileCount":15,"integrity":"sha512-URA9f2fM274P/iOeU3PtAGxgvJGYrwEq4yWLVnNhHzYYUAT25rMZswJlGalGzgYOdwg9CacTqgkjTV7ZcPx9Yg==","signatures":[{"sig":"MEQCIBO8Po1PBMP/ZwhKKmOiEIabOauozFtdBf0Exz65SBa2AiAgf0FGs9Bae0IWCFCVJp8wb9yH1qNUc4Fz+qimA/+rWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99911},"type":"module","engines":{"node":"24.x"},"exports":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"scripts":{"lint":"eslint --fix . && prettier --write --log-level=error . && tsc6","test":"vitest","build":"tsdown"},"_npmUser":{"name":"gmathieu","email":"contact@gmathieu.com"},"repository":{"url":"git+https://github.com/alephic-ai/eslint-plugin.git","type":"git"},"_npmVersion":"11.16.0","description":"Alephic's custom ESLint rules","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@typescript-eslint/utils":"8.65.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d","devDependencies":{"eslint":"10.7.0","tsdown":"0.22.13","vitest":"4.1.10","prettier":"3.9.6","@eslint/js":"10.0.1","typescript":"npm:@typescript/typescript6@6.0.2","@changesets/cli":"2.31.1","eslint-plugin-n":"18.2.2","typescript-eslint":"8.65.0","eslint-doc-generator":"3.7.0","eslint-plugin-import-x":"4.17.1","prettier-plugin-sort-json":"4.2.0","eslint-plugin-eslint-plugin":"7.5.0","eslint-plugin-perfectionist":"5.10.0","prettier-plugin-packagejson":"3.0.2","@changesets/changelog-github":"0.7.0","@typescript-eslint/rule-tester":"8.65.0","eslint-import-resolver-typescript":"4.4.5"},"peerDependencies":{"eslint":">=9"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.0_1785446500284_0.017990117122422822","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alephic/eslint-plugin","version":"0.1.1","keywords":["eslint","eslintplugin","eslint-plugin"],"license":"MIT","_id":"@alephic/eslint-plugin@0.1.1","maintainers":[{"name":"gmathieu","email":"contact@gmathieu.com"}],"dist":{"shasum":"13d9abec370533b525d11ef9519684e971aefd82","tarball":"https://registry.npmjs.org/@alephic/eslint-plugin/-/eslint-plugin-0.1.1.tgz","fileCount":15,"integrity":"sha512-NVc+H2TFz05ITxthnwvqT2aaBxwl4zc3qtB9j1oxFgzO+hX+kjLpcawfPdEuX9KDG2sbgJ2lk4+qWpyWWhMDwQ==","signatures":[{"sig":"MEUCIQCBIhmiXYfd3BGhq8Xwm8lUq2izFBB07fy9FiAVdrKUqgIgdR1cKf5bSk1Bh13Ofik46O2LxZhjr0tVDxS2dVHWAZo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alephic%2feslint-plugin@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":99738},"type":"module","engines":{"node":"24.x"},"exports":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"scripts":{"lint":"eslint --fix . && prettier --write --log-level=error . && tsc6","test":"vitest","build":"tsdown"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1fa4dfac-7faf-4d10-9336-9a5913234db2"}},"repository":{"url":"git+https://github.com/alephic-ai/eslint-plugin.git","type":"git"},"description":"Alephic's custom ESLint rules","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@typescript-eslint/utils":"8.65.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"10.7.0","tsdown":"0.22.13","vitest":"4.1.10","prettier":"3.9.6","@eslint/js":"10.0.1","typescript":"npm:@typescript/typescript6@6.0.2","@changesets/cli":"2.31.1","eslint-plugin-n":"18.2.2","typescript-eslint":"8.65.0","eslint-doc-generator":"3.7.0","eslint-plugin-import-x":"4.17.1","prettier-plugin-sort-json":"4.2.0","eslint-plugin-eslint-plugin":"7.5.0","eslint-plugin-perfectionist":"5.10.0","prettier-plugin-packagejson":"3.0.2","@changesets/changelog-github":"0.7.0","@typescript-eslint/rule-tester":"8.65.0","eslint-import-resolver-typescript":"4.4.5"},"peerDependencies":{"eslint":">=9"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.1_1785447163212_0.2214243922726684","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alephic/eslint-plugin","version":"0.1.2","description":"Alephic's custom ESLint rules","keywords":["eslint","eslintplugin","eslint-plugin"],"repository":{"type":"git","url":"git+https://github.com/alephic-ai/eslint-plugin.git"},"license":"MIT","type":"module","exports":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"dependencies":{"@typescript-eslint/utils":"8.65.0"},"devDependencies":{"@changesets/changelog-github":"0.7.0","@changesets/cli":"2.31.1","@eslint/js":"10.0.1","@typescript-eslint/rule-tester":"8.65.0","eslint":"10.7.0","eslint-doc-generator":"3.7.0","eslint-import-resolver-typescript":"4.4.5","eslint-plugin-eslint-plugin":"7.5.0","eslint-plugin-import-x":"4.17.1","eslint-plugin-n":"18.2.2","eslint-plugin-perfectionist":"5.10.0","prettier":"3.9.6","prettier-plugin-packagejson":"3.0.2","prettier-plugin-sort-json":"4.2.0","tsdown":"0.22.13","typescript":"npm:@typescript/typescript6@6.0.2","typescript-eslint":"8.65.0","vitest":"4.1.10"},"peerDependencies":{"eslint":">=9"},"engines":{"node":"24.x"},"publishConfig":{"access":"public"},"scripts":{"build":"tsdown","lint":"eslint --fix . && prettier --write --log-level=error . && tsc6","test":"vitest"},"_nodeVersion":"24.18.0","_id":"@alephic/eslint-plugin@0.1.2","dist":{"integrity":"sha512-uh3DiN3hmh2L9yFjwwr44XHfJZNAomRfM4kSfHaBSHL0KZ6pG7yVRFGSJDHhMfm/WVFzWwVAg3e1qA6gjkolfg==","shasum":"eb9d281910828e709b0fd0720853d09a767ba4f6","tarball":"https://registry.npmjs.org/@alephic/eslint-plugin/-/eslint-plugin-0.1.2.tgz","fileCount":15,"unpackedSize":100641,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alephic%2feslint-plugin@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDQ1N3edyFqQvn5ApplQ7Bw6yADmAds30OD7oO38F5gZAIhAO7HUDhr0b1MUT4jKdtEjTIW+BFi2TsVB2C7Pp/v9T2q"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1fa4dfac-7faf-4d10-9336-9a5913234db2"}},"directories":{},"maintainers":[{"name":"gmathieu","email":"contact@gmathieu.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin_0.1.2_1785509014164_0.5216123027022757"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-30T21:21:40.115Z","modified":"2026-07-31T14:43:34.661Z","0.1.0":"2026-07-30T21:21:40.438Z","0.1.1":"2026-07-30T21:32:43.337Z","0.1.2":"2026-07-31T14:43:34.334Z"},"license":"MIT","keywords":["eslint","eslintplugin","eslint-plugin"],"repository":{"type":"git","url":"git+https://github.com/alephic-ai/eslint-plugin.git"},"description":"Alephic's custom ESLint rules","maintainers":[{"name":"gmathieu","email":"contact@gmathieu.com"}],"readme":"# @alephic/eslint-plugin\n\nAlephic's custom ESLint rules.\n\n## Installation\n\n```bash\npnpm add -D @alephic/eslint-plugin\n```\n\nRequires ESLint >= 9 (flat config).\n\n## Usage\n\n```js\n// eslint.config.js\nimport alephic from '@alephic/eslint-plugin'\nimport { defineConfig } from 'eslint/config'\n\nexport default defineConfig([...alephic.configs.recommended])\n```\n\nOr configure rules individually:\n\n```js\nimport alephic from '@alephic/eslint-plugin'\nimport { defineConfig } from 'eslint/config'\n\nexport default defineConfig([\n  {\n    plugins: { '@alephic': alephic },\n    rules: {\n      '@alephic/symmetric-never-exclusions': 'error',\n    },\n  },\n])\n```\n\n## Rules\n\n<!-- begin auto-generated rules list -->\n\n💼 Configurations enabled in.\\\n✅ Set in the `recommended` configuration.\\\n🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\n\n| Name                                                                   | Description                                                                                                                                                                                                                                                                                                      | 💼 | 🔧 |\n| :--------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :- | :- |\n| [symmetric-never-exclusions](docs/rules/symmetric-never-exclusions.md) | Enforce symmetric ?: never exclusions in discriminated union types                                                                                                                                                                                                                                               | ✅  | 🔧 |\n| [test-exercises-code](docs/rules/test-exercises-code.md)               | Require test describe/it titles to name identifiers that the file actually references, so tests exercise the real code instead of a parallel reimplementation.                                                                                                                                                   | ✅  |    |\n| [use-step-exports-only](docs/rules/use-step-exports-only.md)           | In files that contain a 'use step' function, only step functions and type-only exports are allowed, and module-level statements must be pure. Non-step exports and side-effectful top-level statements survive the Workflow DevKit's step-stubbing and drag the file's import chain into the workflow VM bundle. | ✅  |    |\n\n<!-- end auto-generated rules list -->\n\n## Contributing\n\n```bash\npnpm install\npnpm test    # vitest rule-tester suites (watch mode locally, single run in CI)\npnpm lint    # eslint --fix + prettier --write + typecheck\npnpm build   # tsdown → dist/ (ESM)\npnpm build && pnpm eslint-doc-generator   # regenerate rules docs\n```\n\nNew rules go in `src/rules/<rule-name>.ts` with a colocated\n`<rule-name>.test.ts` and a `docs/rules/<rule-name>.md` page, and must be\nregistered in `src/index.ts` (both `rules` and `configs.recommended` — default\nseverity is `error`). After adding or editing a rule, run\n`pnpm build && pnpm eslint-doc-generator` to regenerate the README rules table\nand `docs/rules` headers (the generator loads the plugin from `dist/`); CI\nfails if they're stale.\n\n## Publishing an update\n\nReleases are automated with\n[changesets](https://github.com/changesets/changesets):\n\n1. In your PR, run `pnpm changeset` and pick a bump. Adding or tightening a rule\n   is **breaking for consumers** (new CI failures) — use a major bump for that\n   once past 1.0; bug fixes that only remove false positives are a patch.\n2. Merge the PR. The release job in `ci.yml` opens (or updates) a\n   `chore: release` PR that accumulates pending changesets and their changelog\n   entries.\n3. Merge the release PR. Once the CI job passes on main, the release job\n   publishes the new version to npmjs (via trusted publishing/OIDC, with\n   provenance).\n\nNo npm tokens are involved: npmjs trusts the `ci.yml` workflow directly.\n\n## License\n\nMIT\n","readmeFilename":""}