{"_id":"@api-extractor-tools/eslint-plugin","_rev":"5-25ee94b390da4cbe5f83f0d6733633ad","name":"@api-extractor-tools/eslint-plugin","dist-tags":{"alpha":"0.1.0-alpha.0","latest":"0.1.1"},"versions":{"0.1.0-alpha.0":{"name":"@api-extractor-tools/eslint-plugin","version":"0.1.0-alpha.0","keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"author":"","license":"MIT","_id":"@api-extractor-tools/eslint-plugin@0.1.0-alpha.0","maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"dist":{"shasum":"bac7d6a44e682c9e776bec069d0afacfbd8f0cca","tarball":"https://registry.npmjs.org/@api-extractor-tools/eslint-plugin/-/eslint-plugin-0.1.0-alpha.0.tgz","fileCount":76,"integrity":"sha512-ePHYhurlbnSbxw1kkx0xDGkBAhTB4p/uFlYEttSAjkMkSrSPEL1JUWE9QeHOh25aY3MhN14A+52oNQl1onR/aQ==","signatures":[{"sig":"MEQCIFBAbLSkWjd6sPBaRJzJP0NV0fSmcTNQqPyAOYT05AoBAiB98AqH4H3rVH13Z9xM2vrAuZpdV/gGSeg9KeYo0Faq0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149076},"main":"dist/index.js","_from":"file:api-extractor-tools-eslint-plugin-0.1.0-alpha.0.tgz","types":"dist/eslint-plugin-public.d.ts","scripts":{"test":"vitest run","build":"tsc","check":"pnpm check:eslint && pnpm check:typecheck-tests && pnpm check:api-report","check:eslint":"eslint src","test:coverage":"vitest run --coverage","check:api-report":"api-extractor run","generate:api-report":"api-extractor run --local --verbose","check:typecheck-tests":"tsc -p test/tsconfig.json"},"_npmUser":{"name":"northm","email":"michael.l.north@gmail.com"},"_resolved":"/tmp/d54a22feb3451c009e99d19ed4b6b86f/api-extractor-tools-eslint-plugin-0.1.0-alpha.0.tgz","_integrity":"sha512-ePHYhurlbnSbxw1kkx0xDGkBAhTB4p/uFlYEttSAjkMkSrSPEL1JUWE9QeHOh25aY3MhN14A+52oNQl1onR/aQ==","_npmVersion":"10.8.2","description":"ESLint plugin providing authoring-time feedback for API Extractor","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@microsoft/tsdoc":"^0.15.1","@typescript-eslint/utils":"^8.48.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","typescript":"5.8.3","@types/node":"^22.10.2","@vitest/coverage-v8":"^4.0.15","@microsoft/api-extractor":"^7.55.1","@typescript-eslint/parser":"^8.48.1","@typescript-eslint/rule-tester":"^8.48.1"},"peerDependencies":{"eslint":">=8.0.0","typescript":">=5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.0-alpha.0_1765153641761_0.728992118303933","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.1":{"name":"@api-extractor-tools/eslint-plugin","version":"0.1.0-alpha.1","keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"author":"","license":"MIT","_id":"@api-extractor-tools/eslint-plugin@0.1.0-alpha.1","maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"dist":{"shasum":"2172b41c5755db46e8a1e940abe6ba3605dbf560","tarball":"https://registry.npmjs.org/@api-extractor-tools/eslint-plugin/-/eslint-plugin-0.1.0-alpha.1.tgz","fileCount":115,"integrity":"sha512-hdgpy56ptcm3Nuftl0P0Pcr+MjPc7S8zq0TwPAnzMfq9+CtRhg7lhDEzmKlGpY4E8lRnHb35Lh+O2nmDyafQyw==","signatures":[{"sig":"MEUCIQDv9dAU7JwdJIpCTjrxOg9azEdMTDzC+I1L/a4qO+4neAIgD2eICWNJQYT9EoynGw4umq7CpGj7/B5Vvv1EVS21O7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":334416},"main":"dist/index.js","_from":"file:api-extractor-tools-eslint-plugin-0.1.0-alpha.1.tgz","types":"dist/eslint-plugin-public.d.ts","exports":{".":{"types":"./dist/eslint-plugin-public.d.ts","default":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","default":"./dist/node.js"}},"scripts":{"test":"vitest run && pnpm test:types","build":"tsc && node ../declaration-file-normalizer/dist/cli.js dist/index.d.ts","check":"pnpm check:eslint && pnpm check:typecheck-tests && pnpm check:api-report","clean":"rm -rf dist","test:types":"tsd --files 'test/**/*.test-d.ts' --typings src/index.ts","check:eslint":"eslint src test","test:coverage":"vitest run --coverage","check:api-report":"api-extractor run","generate:api-report":"api-extractor run --local --verbose","check:typecheck-tests":"tsc -p test/tsconfig.json"},"_npmUser":{"name":"northm","email":"michael.l.north@gmail.com"},"_resolved":"/tmp/a6a7af76ec7c028eb6077735537e8da3/api-extractor-tools-eslint-plugin-0.1.0-alpha.1.tgz","_integrity":"sha512-hdgpy56ptcm3Nuftl0P0Pcr+MjPc7S8zq0TwPAnzMfq9+CtRhg7lhDEzmKlGpY4E8lRnHb35Lh+O2nmDyafQyw==","_npmVersion":"10.8.2","description":"ESLint plugin providing authoring-time feedback for API Extractor","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@microsoft/tsdoc":"^0.15.1"},"_hasShrinkwrap":false,"devDependencies":{"tsd":"^0.33.0","eslint":"^9.39.1","vitest":"^4.0.15","typescript":"5.8.3","@types/node":"^22.10.2","@vitest/coverage-v8":"^4.0.15","@microsoft/api-extractor":"^7.55.1","@typescript-eslint/utils":"^8.48.1","@typescript-eslint/parser":"^8.48.1","@typescript-eslint/rule-tester":"^8.48.1","@api-extractor-tools/declaration-file-normalizer":"0.0.1-alpha.2"},"peerDependencies":{"eslint":">=8.0.0","typescript":">=5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.0-alpha.1_1767304041471_0.9025737241115908","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.2":{"name":"@api-extractor-tools/eslint-plugin","version":"0.1.0-alpha.2","keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"author":"","license":"MIT","_id":"@api-extractor-tools/eslint-plugin@0.1.0-alpha.2","maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"dist":{"shasum":"722611c6caaeffcda34d960ebd53f7f39a711033","tarball":"https://registry.npmjs.org/@api-extractor-tools/eslint-plugin/-/eslint-plugin-0.1.0-alpha.2.tgz","fileCount":115,"integrity":"sha512-AhNERi0AeRIgZ2srMCymxFusICWpow++quxUizNE4M4YGAK0kETMaW1PSPFkIGTljMrGvgxO1hxTocRF3gmJBQ==","signatures":[{"sig":"MEUCIGKB0mdkXUtODwDoN/hQBBzUUPkHN6LXLldLKVC6MVC5AiEArmgPdKkrACFwyr1a0NrnDQtldy+h7wKsRXCOzDr+dlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":341352},"main":"dist/index.js","_from":"file:api-extractor-tools-eslint-plugin-0.1.0-alpha.2.tgz","types":"dist/eslint-plugin-public.d.ts","exports":{".":{"types":"./dist/eslint-plugin-public.d.ts","default":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","default":"./dist/node.js"}},"scripts":{"test":"vitest run && pnpm test:types","build":"tsc && node ../declaration-file-normalizer/dist/cli.js dist/index.d.ts","check":"pnpm check:eslint && pnpm check:typecheck-tests && pnpm check:api-report","clean":"rm -rf dist","test:types":"tsd --files 'test/**/*.test-d.ts' --typings src/index.ts","check:eslint":"eslint src test","test:coverage":"vitest run --coverage","check:api-report":"api-extractor run","generate:api-report":"api-extractor run --local --verbose","check:typecheck-tests":"tsc -p test/tsconfig.json"},"_npmUser":{"name":"northm","email":"michael.l.north@gmail.com"},"_resolved":"/tmp/a107d7f625e4646fdfdfe4cefaabbb4a/api-extractor-tools-eslint-plugin-0.1.0-alpha.2.tgz","_integrity":"sha512-AhNERi0AeRIgZ2srMCymxFusICWpow++quxUizNE4M4YGAK0kETMaW1PSPFkIGTljMrGvgxO1hxTocRF3gmJBQ==","_npmVersion":"10.8.2","description":"ESLint plugin providing authoring-time feedback for API Extractor","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@microsoft/tsdoc":"^0.15.1"},"_hasShrinkwrap":false,"devDependencies":{"tsd":"^0.33.0","eslint":"^9.39.1","vitest":"^4.0.15","typescript":"5.8.3","@types/node":"^22.10.2","@vitest/coverage-v8":"^4.0.15","@microsoft/api-extractor":"^7.55.1","@typescript-eslint/utils":"^8.48.1","@typescript-eslint/parser":"^8.48.1","@typescript-eslint/rule-tester":"^8.48.1","@api-extractor-tools/declaration-file-normalizer":"0.1.0-alpha.6"},"peerDependencies":{"eslint":">=8.0.0","typescript":">=5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.0-alpha.2_1770859481431_0.6996906681628587","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@api-extractor-tools/eslint-plugin","version":"0.1.0","keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"author":"","license":"MIT","_id":"@api-extractor-tools/eslint-plugin@0.1.0","maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"dist":{"shasum":"39f1cedaa8e1a8c0c5b95ee1c05a23720c0c3317","tarball":"https://registry.npmjs.org/@api-extractor-tools/eslint-plugin/-/eslint-plugin-0.1.0.tgz","fileCount":115,"integrity":"sha512-1LJRA6SrzJPju8skXrZr6xIkZTkL5drQNIeLePdVyxMb+V6dX3+id8bUenUpZWe1SkdVVi7Q2ZjL8Wo/oLd+xg==","signatures":[{"sig":"MEQCIFdJdDcEnTnCQM3PILlig2upoBRyIwNtbGbhX0RCxULUAiB8jcqZJqLRPZB3ue1ZIY8ZAPDUzB64KhKJ54aNVu6FgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344209},"main":"dist/index.js","_from":"file:api-extractor-tools-eslint-plugin-0.1.0.tgz","types":"dist/eslint-plugin-public.d.ts","exports":{".":{"types":"./dist/eslint-plugin-public.d.ts","default":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","default":"./dist/node.js"}},"scripts":{"test":"vitest run && pnpm test:types","build":"tsc && node ../declaration-file-normalizer/dist/cli.js dist/index.d.ts","check":"pnpm check:eslint && pnpm check:typecheck-tests && pnpm check:api-report","clean":"rm -rf dist","test:types":"tsd --files 'test/**/*.test-d.ts' --typings src/index.ts","check:eslint":"eslint src test","test:coverage":"vitest run --coverage","check:api-report":"api-extractor run","generate:api-report":"api-extractor run --local --verbose","check:typecheck-tests":"tsc -p test/tsconfig.json"},"_npmUser":{"name":"northm","email":"michael.l.north@gmail.com"},"_resolved":"/tmp/e41028412ef6b723cce4b420b78dee1a/api-extractor-tools-eslint-plugin-0.1.0.tgz","_integrity":"sha512-1LJRA6SrzJPju8skXrZr6xIkZTkL5drQNIeLePdVyxMb+V6dX3+id8bUenUpZWe1SkdVVi7Q2ZjL8Wo/oLd+xg==","_npmVersion":"10.8.2","description":"ESLint plugin providing authoring-time feedback for API Extractor","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@microsoft/tsdoc":"^0.15.1"},"_hasShrinkwrap":false,"devDependencies":{"tsd":"^0.33.0","eslint":"^9.39.1","vitest":"^4.0.15","typescript":"5.8.3","@types/node":"^22.10.2","@vitest/coverage-v8":"^4.0.15","@microsoft/api-extractor":"^7.55.1","@typescript-eslint/utils":"^8.48.1","@typescript-eslint/parser":"^8.48.1","@typescript-eslint/rule-tester":"^8.48.1","@api-extractor-tools/declaration-file-normalizer":"0.1.0"},"peerDependencies":{"eslint":">=8.0.0","typescript":">=5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin_0.1.0_1771015666271_0.6975667819150244","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@api-extractor-tools/eslint-plugin","version":"0.1.1","description":"ESLint plugin providing authoring-time feedback for API Extractor","main":"dist/index.js","types":"dist/eslint-plugin-public.d.ts","exports":{".":{"types":"./dist/eslint-plugin-public.d.ts","default":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","default":"./dist/node.js"}},"keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"author":"","license":"MIT","peerDependencies":{"eslint":">=8.0.0","typescript":">=5.5.0"},"dependencies":{"@microsoft/tsdoc":"^0.15.1"},"devDependencies":{"@microsoft/api-extractor":"^7.55.1","@types/node":"^22.10.2","@typescript-eslint/parser":"^8.48.1","@typescript-eslint/rule-tester":"^8.48.1","@typescript-eslint/utils":"^8.48.1","@vitest/coverage-v8":"^4.0.15","eslint":"^9.39.1","tsd":"^0.33.0","typescript":"5.8.3","vitest":"^4.0.15","@api-extractor-tools/declaration-file-normalizer":"0.1.0"},"scripts":{"clean":"rm -rf dist","build":"tsc && node ../declaration-file-normalizer/dist/cli.js dist/index.d.ts","generate:api-report":"api-extractor run --local --verbose","test":"vitest run && pnpm test:types","test:types":"tsd --files 'test/**/*.test-d.ts' --typings src/index.ts","test:coverage":"vitest run --coverage","check":"pnpm check:eslint && pnpm check:typecheck-tests && pnpm check:api-report","check:eslint":"eslint src test","check:typecheck-tests":"tsc -p test/tsconfig.json","check:api-report":"api-extractor run"},"_id":"@api-extractor-tools/eslint-plugin@0.1.1","_integrity":"sha512-2VY3LhHIoucP6RLVVq7WA7t1jAXPTfFWs/3zBaZptmGn0iWPGQZ/O33A/HnZaYqgIM6M7KG7uuzOq0UXAlpHGQ==","_resolved":"/tmp/27d4fdffb4fffc0cb14512e1a00e10e3/api-extractor-tools-eslint-plugin-0.1.1.tgz","_from":"file:api-extractor-tools-eslint-plugin-0.1.1.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-2VY3LhHIoucP6RLVVq7WA7t1jAXPTfFWs/3zBaZptmGn0iWPGQZ/O33A/HnZaYqgIM6M7KG7uuzOq0UXAlpHGQ==","shasum":"5a18cd8dd2f07b81010c8c6cb5b30826769c7c9f","tarball":"https://registry.npmjs.org/@api-extractor-tools/eslint-plugin/-/eslint-plugin-0.1.1.tgz","fileCount":116,"unpackedSize":350816,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAvx8lfa/ejhGgZvyB7WeMAoyJNQI1mJSZjqycF1vQlrAiAVQY9wv63D5VAxVaPhMJohwxTEbivREOhuwmG6Wr3WzA=="}]},"_npmUser":{"name":"northm","email":"michael.l.north@gmail.com"},"directories":{},"maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin_0.1.1_1776214350392_0.9329290026980961"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-08T00:27:21.637Z","modified":"2026-04-15T00:52:30.854Z","0.1.0-alpha.0":"2025-12-08T00:27:21.915Z","0.1.0-alpha.1":"2026-01-01T21:47:21.626Z","0.1.0-alpha.2":"2026-02-12T01:24:41.584Z","0.1.0":"2026-02-13T20:47:46.487Z","0.1.1":"2026-04-15T00:52:30.715Z"},"license":"MIT","keywords":["eslint","eslint-plugin","api-extractor","tsdoc","typescript"],"description":"ESLint plugin providing authoring-time feedback for API Extractor","maintainers":[{"name":"northm","email":"michael.l.north@gmail.com"}],"readme":"# @api-extractor-tools/eslint-plugin\n\n[![npm version](https://img.shields.io/npm/v/%40api-extractor-tools%2Feslint-plugin)](https://www.npmjs.com/package/@api-extractor-tools/eslint-plugin)\n\nESLint plugin providing authoring-time feedback for [API Extractor](https://api-extractor.com/). Catch common API Extractor issues during development rather than waiting for the build step.\n\n## Installation\n\n```bash\nnpm install --save-dev @api-extractor-tools/eslint-plugin\n# or\npnpm add -D @api-extractor-tools/eslint-plugin\n# or\nyarn add -D @api-extractor-tools/eslint-plugin\n```\n\n## Usage\n\n### Flat Config (eslint.config.js) - Recommended\n\n```js\nimport apiExtractorPlugin from '@api-extractor-tools/eslint-plugin'\n\nexport default [\n  // Use the recommended configuration\n  apiExtractorPlugin.configs.recommended,\n\n  // Or configure rules individually\n  {\n    plugins: {\n      '@api-extractor-tools': apiExtractorPlugin,\n    },\n    rules: {\n      '@api-extractor-tools/missing-release-tag': 'error',\n      '@api-extractor-tools/override-keyword': 'error',\n      '@api-extractor-tools/package-documentation': 'warn',\n      '@api-extractor-tools/forgotten-export': 'warn',\n      '@api-extractor-tools/incompatible-release-tags': 'warn',\n      '@api-extractor-tools/extra-release-tag': 'error',\n      '@api-extractor-tools/public-on-private-member': 'error',\n      '@api-extractor-tools/public-on-non-exported': 'error',\n      '@api-extractor-tools/valid-enum-type': 'warn',\n    },\n  },\n]\n```\n\n### Legacy Config (.eslintrc.js)\n\n```js\nmodule.exports = {\n  plugins: ['@api-extractor-tools'],\n  extends: ['plugin:@api-extractor-tools/recommended-legacy'],\n}\n```\n\nOr configure rules individually:\n\n```js\nmodule.exports = {\n  plugins: ['@api-extractor-tools'],\n  rules: {\n    '@api-extractor-tools/missing-release-tag': 'error',\n    '@api-extractor-tools/override-keyword': 'error',\n    '@api-extractor-tools/package-documentation': 'warn',\n    '@api-extractor-tools/forgotten-export': 'warn',\n    '@api-extractor-tools/incompatible-release-tags': 'warn',\n    '@api-extractor-tools/extra-release-tag': 'error',\n    '@api-extractor-tools/public-on-private-member': 'error',\n    '@api-extractor-tools/public-on-non-exported': 'error',\n    '@api-extractor-tools/valid-enum-type': 'warn',\n  },\n}\n```\n\n## Rules\n\n### `@api-extractor-tools/missing-release-tag`\n\nRequires exported symbols to have a release tag (`@public`, `@beta`, `@alpha`, or `@internal`).\n\nThis rule mirrors API Extractor's `ae-missing-release-tag` message. When an `api-extractor.json` is found, the rule severity is automatically determined from the configuration.\n\n```ts\n// ❌ Bad - missing release tag\nexport function myFunction() {}\n\n// ✅ Good\n/**\n * A public function.\n * @public\n */\nexport function myFunction() {}\n```\n\n#### Options\n\n```json\n{\n  \"@api-extractor-tools/missing-release-tag\": [\n    \"error\",\n    {\n      \"configPath\": \"./api-extractor.json\"\n    }\n  ]\n}\n```\n\n- `configPath` (optional): Path to the `api-extractor.json` file. If not provided, the rule will search upward from the linted file.\n\n### `@api-extractor-tools/override-keyword`\n\nRequires the TypeScript `override` keyword when the `@override` TSDoc tag is present.\n\n```ts\n// ❌ Bad - has @override tag but missing override keyword\nclass Child extends Parent {\n  /**\n   * @override\n   */\n  doSomething() {}\n}\n\n// ✅ Good\nclass Child extends Parent {\n  /**\n   * @override\n   */\n  override doSomething() {}\n}\n```\n\nThis rule provides an auto-fix to add the missing `override` keyword.\n\n### `@api-extractor-tools/package-documentation`\n\nRequires package entry point files to have a `@packageDocumentation` comment.\n\nEntry points are determined from `package.json` fields:\n\n- `main`\n- `types` / `typings`\n- `exports`\n\n```ts\n// ❌ Bad - entry point without @packageDocumentation\nexport function foo() {}\n\n// ✅ Good\n/**\n * This package provides utilities for working with APIs.\n *\n * @packageDocumentation\n */\n\nexport function foo() {}\n```\n\n### `@api-extractor-tools/forgotten-export`\n\nRequires that types and symbols referenced by exported APIs are also exported from the entry point.\n\nThis rule mirrors API Extractor's `ae-forgotten-export` message.\n\n```ts\n// ❌ Bad - MyInterface is used but not exported\ninterface MyInterface {\n  name: string\n}\n\nexport function myFunction(param: MyInterface): void {}\n\n// ✅ Good - MyInterface is exported\nexport interface MyInterface {\n  name: string\n}\n\nexport function myFunction(param: MyInterface): void {}\n```\n\n**Options:**\n\n- `severity` (optional): Severity level for forgotten exports. Default: `'warning'`\n\n```json\n{\n  \"@api-extractor-tools/forgotten-export\": [\"warn\", { \"severity\": \"warning\" }]\n}\n```\n\n### `@api-extractor-tools/incompatible-release-tags`\n\nRequires that exported APIs do not reference symbols with less visible release tags.\n\nThis rule mirrors API Extractor's `ae-incompatible-release-tags` message. For example, a `@public` API should not reference an `@internal` type.\n\nRelease tag visibility hierarchy (from least to most visible):\n\n- `@internal` < `@alpha` < `@beta` < `@public`\n\n```ts\n// ❌ Bad - public API using internal type\n/**\n * An internal interface.\n * @internal\n */\ninterface MyInterface {\n  name: string\n}\n\n/**\n * A public function.\n * @public\n */\nexport function myFunction(param: MyInterface): void {}\n\n// ✅ Good - public API using public type\n/**\n * A public interface.\n * @public\n */\nexport interface MyInterface {\n  name: string\n}\n\n/**\n * A public function.\n * @public\n */\nexport function myFunction(param: MyInterface): void {}\n```\n\n**Options:**\n\n- `severity` (optional): Severity level for incompatible release tags. Default: `'warning'`\n\n```json\n{\n  \"@api-extractor-tools/incompatible-release-tags\": [\n    \"error\",\n    { \"severity\": \"warning\" }\n  ]\n}\n```\n\n### `@api-extractor-tools/extra-release-tag`\n\nRequires that symbols have at most one release tag.\n\nThis rule mirrors API Extractor's `ae-extra-release-tag` message. Each symbol should have exactly one release tag (`@public`, `@beta`, `@alpha`, or `@internal`).\n\n```ts\n// ❌ Bad - multiple release tags\n/**\n * A function with multiple tags.\n * @public\n * @beta\n */\nexport function myFunction(): void {}\n\n// ✅ Good - single release tag\n/**\n * A public function.\n * @public\n */\nexport function myFunction(): void {}\n```\n\n**Options:**\n\n- `severity` (optional): Severity level for extra release tags. Default: `'error'`\n\n```json\n{\n  \"@api-extractor-tools/extra-release-tag\": [\"error\", { \"severity\": \"error\" }]\n}\n```\n\n### `@api-extractor-tools/public-on-private-member`\n\nPrevents the use of `@public` tag on private or protected class members.\n\nPrivate and protected members cannot be public API since they are not accessible outside the class or to external consumers.\n\n```ts\n// ❌ Bad - @public on private member\nexport class MyClass {\n  /**\n   * A private property.\n   * @public\n   */\n  private myProperty: string = ''\n}\n\n// ✅ Good - @internal on private member\nexport class MyClass {\n  /**\n   * A private property.\n   * @internal\n   */\n  private myProperty: string = ''\n}\n\n// ✅ Good - @public on public member\nexport class MyClass {\n  /**\n   * A public property.\n   * @public\n   */\n  public myProperty: string = ''\n}\n```\n\n**Options:**\n\n- `severity` (optional): Severity level for public tags on private/protected members. Default: `'error'`\n\n```json\n{\n  \"@api-extractor-tools/public-on-private-member\": [\n    \"error\",\n    { \"severity\": \"error\" }\n  ]\n}\n```\n\n### `@api-extractor-tools/public-on-non-exported`\n\nPrevents the use of `@public` tag on symbols that are not exported.\n\nThe `@public` tag indicates that a symbol is part of the public API, but non-exported symbols cannot be accessed by consumers.\n\n```ts\n// ❌ Bad - @public on non-exported symbol\n/**\n * A function.\n * @public\n */\nfunction myFunction(): void {}\n\n// ✅ Good - @public on exported symbol\n/**\n * A function.\n * @public\n */\nexport function myFunction(): void {}\n\n// ✅ Good - @internal on non-exported symbol\n/**\n * A function.\n * @internal\n */\nfunction myFunction(): void {}\n\n// ✅ Good - exported separately\n/**\n * A function.\n * @public\n */\nfunction myFunction(): void {}\n\nexport { myFunction }\n```\n\n**Options:**\n\n- `severity` (optional): Severity level for public tags on non-exported symbols. Default: `'error'`\n\n```json\n{\n  \"@api-extractor-tools/public-on-non-exported\": [\n    \"error\",\n    { \"severity\": \"error\" }\n  ]\n}\n```\n\n### `@api-extractor-tools/valid-enum-type`\n\nValidates the usage of the `@enumType` TSDoc tag on enum declarations and string literal union type aliases.\n\nThe `@enumType` tag specifies whether an enum is \"open\" (new members may be added) or \"closed\" (the set of members is fixed). This is used by the change detector to properly classify API changes.\n\n```ts\n// ❌ Bad - missing value\n/**\n * @enumType\n */\nexport enum Status {\n  Active,\n  Inactive,\n}\n\n// ❌ Bad - invalid value\n/**\n * @enumType invalid\n */\nexport enum Status {\n  Active,\n  Inactive,\n}\n\n// ❌ Bad - @enumType on invalid construct\n/**\n * @enumType open\n */\nexport function myFunction(): void {}\n\n// ✅ Good - open enum\n/**\n * Status values for a resource.\n * @enumType open\n * @public\n */\nexport enum Status {\n  Active = 'active',\n  Inactive = 'inactive',\n}\n\n// ✅ Good - closed string literal union\n/**\n * Supported formats.\n * @enumType closed\n * @public\n */\nexport type Format = 'json' | 'xml'\n```\n\n**Options:**\n\n- `requireOnExported` (optional): When `true`, requires all exported enums and string literal unions to have an `@enumType` tag. Default: `false`\n\n```json\n{\n  \"@api-extractor-tools/valid-enum-type\": [\n    \"warn\",\n    { \"requireOnExported\": true }\n  ]\n}\n```\n\n## Configuration Discovery\n\nRules that read from `api-extractor.json` use the following strategy:\n\n1. **Explicit option**: Use the `configPath` rule option\n2. **Auto-discovery**: Search upward from the linted file for `api-extractor.json`\n3. **Fallback**: Use sensible defaults (all rules enabled as warnings)\n\n## Recommended Configuration\n\nThe `recommended` configuration enables all rules with these defaults:\n\n| Rule                        | Severity |\n| --------------------------- | -------- |\n| `missing-release-tag`       | warn     |\n| `override-keyword`          | error    |\n| `package-documentation`     | warn     |\n| `forgotten-export`          | warn     |\n| `incompatible-release-tags` | warn     |\n| `extra-release-tag`         | error    |\n| `public-on-private-member`  | error    |\n| `public-on-non-exported`    | error    |\n| `valid-enum-type`           | warn     |\n\n## Requirements\n\n- ESLint >= 8.0.0\n- TypeScript >= 5.5.0\n\n## Related\n\n- [API Extractor](https://api-extractor.com/)\n- [TSDoc](https://tsdoc.org/)\n- [eslint-plugin-tsdoc](https://www.npmjs.com/package/eslint-plugin-tsdoc) - For TSDoc syntax validation\n\n## License\n\nMIT\n","readmeFilename":"README.md"}