{"_id":"@benjavicente/lint-angular","_rev":"6-ed619968cee4a073866d7e9d612b0dfc","name":"@benjavicente/lint-angular","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"@benjavicente/lint-angular","version":"0.0.1","keywords":["angular","eslint","oxlint"],"license":"MIT","_id":"@benjavicente/lint-angular@0.0.1","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"dist":{"shasum":"6c54a1ed0f616dd6a77b2e605d1fb5508883028f","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.1.tgz","fileCount":4,"integrity":"sha512-JTvBYXY7Y3yaT1A31Ta4pHLmw/TGSYjh+1JJeKHfxLiyV1sGCaJ/gVTKJfI0rR4IH4flCNGe0Jx41YwQVNmRVg==","signatures":[{"sig":"MEUCIB3i5Mb36RowAagPEzuKbMIu74ly9OwvLTExQcCK/0toAiEA6tin0IlSNuaGo7t8OJnw4h0CHSfkaEJUZHY8OUWCGkA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51407},"main":"dist/index.mjs","type":"module","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"66525f4aeb5a347e1a5dd16263696de28c6a01b8","scripts":{"fmt":"vp fmt src","lint":"vp lint src","test":"vp test run","build":"vp pack"},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"_npmVersion":"11.8.0","description":"Oxlint/ESLint-compatible rules for Angular.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"@oxlint/plugins":"^1.61.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"catalog:","vite-plus":"catalog:","typescript":"^6.0.3","@types/estree":"^1.0.8","oxlint-vitest-rule-tester":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint-angular_0.0.1_1777250864162_0.5111574555091221","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@benjavicente/lint-angular","version":"0.0.2","keywords":["angular","eslint","oxlint"],"license":"MIT","_id":"@benjavicente/lint-angular@0.0.2","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"dist":{"shasum":"39048814549e7a2ff3e4f641a6ce577ec25c8338","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.2.tgz","fileCount":4,"integrity":"sha512-If3CUClpL/V94bGVAmfi7OMUEYPAlVdiM/Gf1oxVPWL64zUz9ObNKl9HREfF8Yak6NiX5YR93wUTLRdXKPOg+g==","signatures":[{"sig":"MEUCIDUY9ek7W5jIuqjhDbth2RaJxU/6VhMUiS1y9FifcAWdAiEAmvM+q3G8JE5EK2b5mcSrR/yTCQnuc7lBNsaHzzAr0ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120351},"main":"dist/index.mjs","type":"module","_from":"file:benjavicente-lint-angular-0.0.2.tgz","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"scripts":{"fmt":"vp fmt src","lint":"vp lint src","test":"vp test run","build":"vp pack"},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"_resolved":"/private/var/folders/xw/hc4rqcqx51bg7h5zc48w4jy80000gn/T/ef69be4a1a1a8675ca444f6dfba640de/benjavicente-lint-angular-0.0.2.tgz","_integrity":"sha512-If3CUClpL/V94bGVAmfi7OMUEYPAlVdiM/Gf1oxVPWL64zUz9ObNKl9HREfF8Yak6NiX5YR93wUTLRdXKPOg+g==","_npmVersion":"11.8.0","description":"Oxlint/ESLint-compatible rules for Angular.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"@oxlint/plugins":"^1.61.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"npm:@voidzero-dev/vite-plus-test@latest","vite-plus":"latest","typescript":"^6.0.3","@types/estree":"^1.0.8","oxlint-vitest-rule-tester":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/lint-angular_0.0.2_1777731320306_0.27491880677675185","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@benjavicente/lint-angular","version":"0.0.3","keywords":["angular","eslint","oxlint"],"license":"MIT","_id":"@benjavicente/lint-angular@0.0.3","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"dist":{"shasum":"184d490682ec000d24d573bf275a6da78eea28a9","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.3.tgz","fileCount":4,"integrity":"sha512-G46zDp5VziyPw4A00+9vzi8sGM67jlp/2sQIIZmsReiD238weQ/bpMd/7/kS3oyiVu007buDlV1YT2Rl/am3/g==","signatures":[{"sig":"MEUCIC7XYbHDJe7S6a4Um5Ck5/1LDqMQwUMGS760/MSz3u2bAiEAnxK/Uf+Uy7dpkgMohIHGF5FvXIaHD8cif4cOuOvt1uk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111783},"main":"dist/index.mjs","type":"module","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"b4f6077d39de9f3edbd7db7d08b5c6940630dd36","scripts":{"fmt":"vp fmt src","lint":"vp lint src","test":"vp test run","build":"vp pack"},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"_npmVersion":"11.8.0","description":"Oxlint/ESLint-compatible rules for Angular.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"@oxlint/plugins":"^1.63.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"catalog:","vite-plus":"catalog:","typescript":"catalog:","@types/estree":"^1.0.9","oxlint-vitest-rule-tester":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint-angular_0.0.3_1778432576721_0.995398668243257","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@benjavicente/lint-angular","version":"0.0.4","keywords":["angular","eslint","oxlint"],"license":"MIT","_id":"@benjavicente/lint-angular@0.0.4","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"dist":{"shasum":"053b699cc1ceaf37da3fb13ef796c8da036d39ee","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.4.tgz","fileCount":4,"integrity":"sha512-QdJzr/ZJiD/ftSRQWNt4Rpr+nzD/MYejTgvpqcjS21gt9lBA6DWkP6y8WxguKCCY/bL/k8f3bQFNEG5Ft+D0Ug==","signatures":[{"sig":"MEUCIB01vJ9OO5WzGA7UiNFUNXXIlhCojCVXKNL9vFf1OahOAiEAm21fN28O7O34kFwzUnqULqkoE9mUP2H63rDvUrb8zqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123642},"main":"dist/index.mjs","type":"module","_from":"file:benjavicente-lint-angular-0.0.4.tgz","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"scripts":{"fmt":"vp fmt src","lint":"vp lint src","test":"vp test run","build":"vp pack"},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"_resolved":"/private/var/folders/xw/hc4rqcqx51bg7h5zc48w4jy80000gn/T/60c539cef10e7e5b6d5897ee6867ee50/benjavicente-lint-angular-0.0.4.tgz","_integrity":"sha512-QdJzr/ZJiD/ftSRQWNt4Rpr+nzD/MYejTgvpqcjS21gt9lBA6DWkP6y8WxguKCCY/bL/k8f3bQFNEG5Ft+D0Ug==","_npmVersion":"11.8.0","description":"Oxlint/ESLint-compatible rules for Angular.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"@oxlint/plugins":"^1.63.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"npm:@voidzero-dev/vite-plus-test@^0.1.20","vite-plus":"^0.1.20","typescript":"^6.0.3","@types/estree":"^1.0.9","oxlint-vitest-rule-tester":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/lint-angular_0.0.4_1779192758764_0.7413793083115716","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@benjavicente/lint-angular","version":"0.0.5","keywords":["angular","eslint","oxlint"],"license":"MIT","_id":"@benjavicente/lint-angular@0.0.5","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"dist":{"shasum":"451db741f6563021bae3bef5c0f415a04d03ecaf","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.5.tgz","fileCount":4,"integrity":"sha512-9eQTNnsv34anyudlL+mrnbdU45jxkw5zScJxon8FIt7mZjPj9JTezdY6Qn1j8vTt6ByooBsDZD9z9Fe710lvGg==","signatures":[{"sig":"MEUCIB1lQSAH7mEjYpAa/8qCiBU0uAXMPWf6sJyZZsCrYFBRAiEA1MPp7+HJwg2vw+4YGx7v+mbnGnfPqFjZDMAT5SFZImE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145823},"main":"dist/index.mjs","type":"module","_from":"file:benjavicente-lint-angular-0.0.5.tgz","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"scripts":{"fmt":"vp fmt src","lint":"vp lint src","test":"vp test run","build":"vp pack"},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"_resolved":"/private/var/folders/xw/hc4rqcqx51bg7h5zc48w4jy80000gn/T/aa7b4d32e40f748bed5c9ceeb33478ed/benjavicente-lint-angular-0.0.5.tgz","_integrity":"sha512-9eQTNnsv34anyudlL+mrnbdU45jxkw5zScJxon8FIt7mZjPj9JTezdY6Qn1j8vTt6ByooBsDZD9z9Fe710lvGg==","_npmVersion":"11.8.0","description":"Oxlint/ESLint-compatible rules for Angular.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"@oxlint/plugins":"^1.63.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"npm:@voidzero-dev/vite-plus-test@^0.1.20","vite-plus":"^0.1.22","typescript":"^6.0.3","@types/estree":"^1.0.9","oxlint-vitest-rule-tester":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/lint-angular_0.0.5_1779553757077_0.6077749124961322","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@benjavicente/lint-angular","version":"0.0.6","description":"Oxlint/ESLint-compatible rules for Angular.","keywords":["angular","eslint","oxlint"],"license":"MIT","type":"module","main":"dist/index.mjs","types":"dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"publishConfig":{"access":"public"},"dependencies":{"@oxlint/plugins":"^1.63.0"},"devDependencies":{"@types/estree":"^1.0.9","typescript":"^6.0.3","vite-plus":"^0.1.22","vitest":"npm:@voidzero-dev/vite-plus-test@^0.1.20","oxlint-vitest-rule-tester":"0.0.1"},"scripts":{"build":"vp pack","fmt":"vp fmt src","lint":"vp lint src","test":"vp test run"},"_id":"@benjavicente/lint-angular@0.0.6","_integrity":"sha512-0Ll3ltKuAm6WiPCW6K8DM9SDWwukR0NYYo8C9SEvTuAKV3M3abqwsmDig3uKDa8TW3y38omgDg+pdjVFY8pCIw==","_resolved":"/private/var/folders/xw/hc4rqcqx51bg7h5zc48w4jy80000gn/T/94937e3fc0a93d823579901adedd8a9f/benjavicente-lint-angular-0.0.6.tgz","_from":"file:benjavicente-lint-angular-0.0.6.tgz","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-0Ll3ltKuAm6WiPCW6K8DM9SDWwukR0NYYo8C9SEvTuAKV3M3abqwsmDig3uKDa8TW3y38omgDg+pdjVFY8pCIw==","shasum":"655bdfe2ca7f21b96bf80274bf0374296009fc86","tarball":"https://registry.npmjs.org/@benjavicente/lint-angular/-/lint-angular-0.0.6.tgz","fileCount":4,"unpackedSize":149532,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFl82n/AwICxUNpPbA7ERmbfNpSsj1Qq2qc1hPzeU3enAiEAgX8XcGGzIJbjW0PWrPDTPISRlb0tXjr2h7nHyS69YdI="}]},"_npmUser":{"name":"benjavicente","email":"bvicentegoecke@gmail.com"},"directories":{},"maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lint-angular_0.0.6_1779757225278_0.3173683920020478"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-27T00:47:44.088Z","modified":"2026-05-26T01:00:25.536Z","0.0.1":"2026-04-27T00:47:44.296Z","0.0.2":"2026-05-02T14:15:20.462Z","0.0.3":"2026-05-10T17:02:56.863Z","0.0.4":"2026-05-19T12:12:38.921Z","0.0.5":"2026-05-23T16:29:17.213Z","0.0.6":"2026-05-26T01:00:25.424Z"},"license":"MIT","keywords":["angular","eslint","oxlint"],"description":"Oxlint/ESLint-compatible rules for Angular.","maintainers":[{"name":"benjavicente","email":"bvicentegoecke@gmail.com"}],"readme":"# `@benjavicente/lint-angular`\n\nOpinated Oxlint/ESLint-compatible plugin for Angular project rules.\n\n## Rules\n\n| Rule                                                                                                          | Default | Fixable | Description                                                                                   |\n| ------------------------------------------------------------------------------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------- |\n| [`class-member-order`](./src/rules/class-member-order/)                                                       | ✅      |         | Enforce a consistent member order for Angular classes.                                        |\n| [`class-matches-filename`](./src/rules/class-matches-filename/)                                               | ✅      |         | Require Angular class names to match component, directive, and service filenames.             |\n| [`component-resource-filenames`](./src/rules/component-resource-filenames/)                                   | ✅      |         | Require component resource filenames to match the component TypeScript filename.              |\n| [`decorator-filename-suffix`](./src/rules/decorator-filename-suffix/)                                         | ✅      |         | Require Angular decorators to be declared in files with matching filename suffixes.           |\n| [`no-component-providers`](./src/rules/no-component-providers/)                                                 |         |         | Disallow `providers` on `@Component` (DI initialization footguns with inputs).                |\n| [`no-explicit-injection-context`](./src/rules/no-explicit-injection-context/)                                | ✅      |         | Avoid explicit injection-context APIs such as `inject(Injector)` and `runInInjectionContext`. |\n| [`no-explicit-subscription-management`](./src/rules/no-explicit-subscription-management/)                     | ✅      |         | Avoid storing and manually managing RxJS subscriptions in Angular classes.                    |\n| [`no-fake-async`](./src/rules/no-fake-async/)                                                                 | ✅      |         | Disallow Zone.js fake-async testing APIs from `@angular/core/testing` (Vitest-incompatible).  |\n| [`no-inappropriate-intimacy`](./src/rules/no-inappropriate-intimacy/)                                         | ✅      |         | Avoid passing Angular component, directive, and service instances as function arguments.      |\n| [`no-manual-change-detection`](./src/rules/no-manual-change-detection/)                                       | ✅      |         | Avoid manual Angular change detection through `ChangeDetectorRef`.                            |\n| [`no-ng-modules`](./src/rules/no-ng-modules/)                                                                 | ✅      |         | Avoid NgModules in favor of standalone Angular APIs.                                          |\n| [`no-resource-api`](./src/rules/no-resource-api/)                                                             | ✅      |         | Avoid Angular resource APIs for server state.                                                 |\n| [`no-route-resolvers`](./src/rules/no-route-resolvers/)                                                       | ✅      |         | Avoid Angular route resolvers for data loading.                                               |\n| [`no-rxjs-state-in-component`](./src/rules/no-rxjs-state-in-component/)                                       | ✅      |         | Avoid RxJS subjects for component and directive-local state.                                  |\n| [`no-ui-inheritance`](./src/rules/no-ui-inheritance/)                                                         | ✅      |         | Avoid inheritance for Angular components and directives.                                      |\n| [`no-writing-signals-in-reactive-context`](./src/rules/no-writing-signals-in-reactive-context/)               | ✅      |         | Avoid writing to signals from reactive Angular contexts.                                      |\n| [`prefer-load-component-over-load-children`](./src/rules/prefer-load-component-over-load-children/)           | ✅      |         | Prefer `loadComponent` for lazy routes that load a standalone component.                      |\n| [`prefer-private-elements`](./src/rules/prefer-private-elements/)                                             | ✅      | ✅      | Prefer ECMAScript private elements over TypeScript `private` members.                         |\n| [`prefer-style-url`](./src/rules/prefer-style-url/)                                                           | ✅      | ✅      | Prefer `styleUrl` when a component has exactly one stylesheet.                                |\n| [`public-component-interface`](./src/rules/public-component-interface/)                                       | ✅      | ✅      | Keep component and directive signal interfaces public while hiding injected dependencies.     |\n| [`restrict-injectable-provided-in`](./src/rules/restrict-injectable-provided-in/)                             | ✅      |         | Restrict `@Injectable` `providedIn` values to `root` or `platform`.                           |\n| [`rules-of-inject`](./src/rules/rules-of-inject/)                                                             | ✅      |         | Restrict `inject()` usage to valid Angular injection contexts.                                |\n| [`tanstack-query-injects-only-in-component-body`](./src/rules/tanstack-query-injects-only-in-component-body/) | ✅      |         | Require TanStack Query inject helpers to be direct component/directive class fields.          |\n| [`tanstack-query-inlined-keys`](./src/rules/tanstack-query-inlined-keys/)                                     | ✅      |         | Require TanStack Query query option keys to be inline arrays.                                 |\n| [`tanstack-query-prefer-query-options`](./src/rules/tanstack-query-prefer-query-options/)                     | ✅      |         | Prefer `queryOptions()` to co-locate TanStack Query query keys and functions.                 |\n\n## Oxlint setup\n\n### Recommended (all default rules)\n\nSpread the preset in `oxlint.config.ts`:\n\n```ts\nimport { defineConfig } from \"oxlint\";\nimport lintAngular from \"@benjavicente/lint-angular\";\n\nexport default defineConfig({\n  jsPlugins: [\"@benjavicente/lint-angular\"],\n  rules: {\n    ...lintAngular.configs.recommended.rules,\n  },\n});\n```\n\n### Individual rules\n\n```jsonc\n{\n  \"jsPlugins\": [\"@benjavicente/lint-angular\"],\n  \"rules\": {\n    \"@benjavicente/lint-angular/rules-of-inject\": \"error\",\n  },\n}\n```\n","readmeFilename":"README.md"}