{"id":13801017,"url":"https://github.com/ember-cli/eslint-plugin-ember","last_synced_at":"2026-04-28T05:01:56.862Z","repository":{"id":38185283,"uuid":"75928556","full_name":"ember-cli/eslint-plugin-ember","owner":"ember-cli","description":"An ESLint plugin that provides set of rules for Ember applications based on commonly known good practices.","archived":false,"fork":false,"pushed_at":"2026-04-27T01:27:37.000Z","size":11441,"stargazers_count":262,"open_issues_count":148,"forks_count":212,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-04-27T03:30:32.133Z","etag":null,"topics":["best-practices","ember","eslint","eslint-plugin","linting"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ember-cli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"emberjs","open_collective":"emberjs"}},"created_at":"2016-12-08T10:40:40.000Z","updated_at":"2026-04-27T01:27:11.000Z","dependencies_parsed_at":"2023-12-28T22:32:23.983Z","dependency_job_id":"0bd51d82-547f-4bcd-8799-a391aff1695a","html_url":"https://github.com/ember-cli/eslint-plugin-ember","commit_stats":{"total_commits":2148,"total_committers":143,"mean_commits":"15.020979020979022","dds":0.701582867783985,"last_synced_commit":"18a1715775b1e60532e45d61a98fd1e4d27cde75"},"previous_names":[],"tags_count":199,"template":false,"template_full_name":null,"purl":"pkg:github/ember-cli/eslint-plugin-ember","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-cli%2Feslint-plugin-ember","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-cli%2Feslint-plugin-ember/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-cli%2Feslint-plugin-ember/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-cli%2Feslint-plugin-ember/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ember-cli","download_url":"https://codeload.github.com/ember-cli/eslint-plugin-ember/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-cli%2Feslint-plugin-ember/sbom","scorecard":{"id":374803,"data":{"date":"2025-08-11","repo":{"name":"github.com/ember-cli/eslint-plugin-ember","commit":"4a75afebaec22452a9bb50a60d9a682a77c20c06"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Code-Review","score":6,"reason":"Found 4/6 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"13 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/plan-release.yml:39","Info: jobLevel 'issues' permission set to 'read': .github/workflows/plan-release.yml:40","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish.yml:42","Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/plan-release.yml:1","Warn: no topLevel permission defined: .github/workflows/publish.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/plan-release.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/plan-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/plan-release.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/plan-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/plan-release.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/plan-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/plan-release.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/plan-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/plan-release.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/plan-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/ember-cli/eslint-plugin-ember/publish.yml/master?enable=pin","Info:   0 out of  14 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:36"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 22 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"14 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-x574-m823-4x7w","Warn: Project is vulnerable to: GHSA-4r4m-qw57-chr8","Warn: Project is vulnerable to: GHSA-xcj6-pq6g-qj4x","Warn: Project is vulnerable to: GHSA-356w-63v5-8wf4","Warn: Project is vulnerable to: GHSA-859w-5945-r5v3","Warn: Project is vulnerable to: GHSA-9crc-q9x8-hgqq"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T13:59:02.318Z","repository_id":38185283,"created_at":"2025-08-18T13:59:02.318Z","updated_at":"2025-08-18T13:59:02.318Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32355569,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"ssl_error","status_checked_at":"2026-04-27T20:07:00.910Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["best-practices","ember","eslint","eslint-plugin","linting"],"created_at":"2024-08-04T00:01:18.622Z","updated_at":"2026-04-28T05:01:56.854Z","avatar_url":"https://github.com/ember-cli.png","language":"JavaScript","funding_links":["https://github.com/sponsors/emberjs","https://opencollective.com/emberjs"],"categories":["Plugins","Tools"],"sub_categories":["Frameworks","Code Quality"],"readme":"# eslint-plugin-ember\n\n[![NPM version](https://img.shields.io/npm/v/eslint-plugin-ember.svg?style=flat)](https://npmjs.org/package/eslint-plugin-ember)\n[![NPM downloads](https://img.shields.io/npm/dm/eslint-plugin-ember.svg?style=flat)](https://npmjs.org/package/eslint-plugin-ember)\n![CI](https://github.com/ember-cli/eslint-plugin-ember/workflows/CI/badge.svg)\n\n\u003e An ESLint plugin that provides a set of rules for Ember applications based on commonly known good practices.\n\n## ❗️Requirements\n\n- [ESLint](https://eslint.org/) `\u003e= 8.40.0`\n- [Node.js](https://nodejs.org/) `\u003e= 20.19`\n\n## 🚀 Usage\n\n### 1. Install plugin\n\n```shell\nnpm install --save-dev eslint-plugin-ember\n```\n\n### 2. Update your config\n\n```js\n// eslint.config.js (flat config)\nconst eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended');\n\nmodule.exports = [\n  ...eslintPluginEmberRecommended,\n];\n```\n\nor\n\n```js\n// .eslintrc.js (legacy config)\nmodule.exports = {\n  plugins: ['ember'],\n  extends: [\n    'eslint:recommended',\n    'plugin:ember/recommended' // or other configuration\n  ],\n  rules: {\n    // override / enable optional rules\n    'ember/no-replace-test-comments': 'error'\n  }\n};\n```\n\n## gts/gjs\n\nlint files having `First-Class Component Templates` (fcct)\n\nlearn more at [ember-template-imports](https://github.com/ember-template-imports/ember-template-imports)\n\n\u003e [!NOTE]\n\u003e special care should be used when setting up parsers, since they cannot be overwritten. thus they should be used in override only and specific to file types\n\ngjs/gts support is provided by the [ember-eslint-parser](https://github.com/NullVoxPopuli/ember-eslint-parser)\n\n\u003e [!NOTE]\n\u003e if you import .gts files in .ts files, then `ember-eslint-parser` is required for .ts as well to enable typed linting\n\n```js\n// .eslintrc.js\nmodule.exports = {\n  overrides: [\n    {\n      files: ['**/*.{js,ts}'],\n      plugins: ['ember'],\n      parser: '@typescript-eslint/parser',\n      extends: [\n        'eslint:recommended',\n        'plugin:ember/recommended', // or other configuration\n      ],\n      rules: {\n        // override / enable optional rules\n        'ember/no-replace-test-comments': 'error'\n      }\n    },\n    {\n      files: ['**/*.gts'],\n      parser: 'ember-eslint-parser',\n      plugins: ['ember'],\n      extends: [\n        'eslint:recommended',\n        'plugin:@typescript-eslint/recommended',\n        'plugin:ember/recommended',\n        'plugin:ember/recommended-gts',\n      ],\n    },\n    {\n      files: ['**/*.gjs'],\n      parser: 'ember-eslint-parser',\n      plugins: ['ember'],\n      extends: [\n        'eslint:recommended',\n        'plugin:ember/recommended',\n        'plugin:ember/recommended-gjs',\n      ],\n    },\n    {\n      files: ['tests/**/*.{js,ts,gjs,gts}'],\n      rules: {\n        // override / enable optional rules\n        'ember/no-replace-test-comments': 'error'\n      }\n    },\n  ],\n};\n```\n\n### rules applied to fcct templates\n\n- semi rule, same as [prettier plugin](https://github.com/gitKrystan/prettier-plugin-ember-template-tag/issues/1)\n- no-undef rule will take effect for template vars (includes js scope)\n- no-unused rule will take effect for template block params\n\nrules in templates can be disabled with eslint directives with mustache or html comments:\n\n```hbs\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    {{!eslint-disable-next-line}}\n    {{test}}\n  \u003c/div\u003e\n  \u003cdiv\u003e\n    {{!--eslint-disable--}}\n    {{test}}\n    {{test}}\n    {{test}}\n    {{!--eslint-enable--}}\n  \u003c/div\u003e\n\u003c/template\u003e\n```\n\n```hbs\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    \u003c!--eslint-disable-next-line--\u003e\n    {{test}}\n  \u003c/div\u003e\n  \u003cdiv\u003e\n    \u003c!-- eslint-disable --\u003e\n    {{test}}\n    {{test}}\n    {{test}}\n    \u003c!-- eslint-enable --\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n```\n\n## 🧰 Configurations\n\n\u003c!-- begin auto-generated configs list --\u003e\n\n|                                 | Name              |\n| :------------------------------ | :---------------- |\n|                                 | `base`            |\n| ✅                               | `recommended`     |\n| ![gjs logo](/docs/svgs/gjs.svg) | `recommended-gjs` |\n| ![gts logo](/docs/svgs/gts.svg) | `recommended-gts` |\n\n\u003c!-- end auto-generated configs list --\u003e\n\n## 🍟 Rules\n\n\u003c!-- begin auto-generated rules list --\u003e\n\n💼 [Configurations](https://github.com/ember-cli/eslint-plugin-ember#-configurations) enabled in.\\\n✅ Set in the `recommended` [configuration](https://github.com/ember-cli/eslint-plugin-ember#-configurations).\\\n![gjs logo](/docs/svgs/gjs.svg) Set in the `recommended-gjs` [configuration](https://github.com/ember-cli/eslint-plugin-ember#-configurations).\\\n![gts logo](/docs/svgs/gts.svg) Set in the `recommended-gts` [configuration](https://github.com/ember-cli/eslint-plugin-ember#-configurations).\\\n🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\\\n💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\n\n### Accessibility\n\n| Name                                                                                                             | Description                                                                      | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------- | :- | :- | :- |\n| [template-link-href-attributes](docs/rules/template-link-href-attributes.md)                                     | require href attribute on link elements                                          |    |    |    |\n| [template-no-abstract-roles](docs/rules/template-no-abstract-roles.md)                                           | disallow abstract ARIA roles                                                     |    |    |    |\n| [template-no-accesskey-attribute](docs/rules/template-no-accesskey-attribute.md)                                 | disallow accesskey attribute                                                     |    | 🔧 |    |\n| [template-no-aria-hidden-body](docs/rules/template-no-aria-hidden-body.md)                                       | disallow aria-hidden on body element                                             |    | 🔧 |    |\n| [template-no-aria-unsupported-elements](docs/rules/template-no-aria-unsupported-elements.md)                     | disallow ARIA roles, states, and properties on elements that do not support them |    |    |    |\n| [template-no-autofocus-attribute](docs/rules/template-no-autofocus-attribute.md)                                 | disallow autofocus attribute                                                     |    | 🔧 |    |\n| [template-no-duplicate-landmark-elements](docs/rules/template-no-duplicate-landmark-elements.md)                 | disallow duplicate landmark elements without unique labels                       |    |    |    |\n| [template-no-empty-headings](docs/rules/template-no-empty-headings.md)                                           | disallow empty heading elements                                                  |    |    |    |\n| [template-no-heading-inside-button](docs/rules/template-no-heading-inside-button.md)                             | disallow heading elements inside button elements                                 |    |    |    |\n| [template-no-invalid-aria-attributes](docs/rules/template-no-invalid-aria-attributes.md)                         | disallow invalid aria-* attributes                                               |    |    |    |\n| [template-no-invalid-interactive](docs/rules/template-no-invalid-interactive.md)                                 | disallow non-interactive elements with interactive handlers                      |    |    |    |\n| [template-no-invalid-link-text](docs/rules/template-no-invalid-link-text.md)                                     | disallow invalid or uninformative link text content                              |    |    |    |\n| [template-no-invalid-link-title](docs/rules/template-no-invalid-link-title.md)                                   | disallow invalid title attributes on link elements                               |    |    |    |\n| [template-no-invalid-role](docs/rules/template-no-invalid-role.md)                                               | disallow invalid ARIA roles                                                      |    |    |    |\n| [template-no-nested-interactive](docs/rules/template-no-nested-interactive.md)                                   | disallow nested interactive elements                                             |    |    |    |\n| [template-no-nested-landmark](docs/rules/template-no-nested-landmark.md)                                         | disallow nested landmark elements                                                |    |    |    |\n| [template-no-pointer-down-event-binding](docs/rules/template-no-pointer-down-event-binding.md)                   | disallow pointer down event bindings                                             |    |    |    |\n| [template-no-positive-tabindex](docs/rules/template-no-positive-tabindex.md)                                     | disallow positive tabindex values                                                |    |    |    |\n| [template-no-redundant-role](docs/rules/template-no-redundant-role.md)                                           | disallow redundant role attributes                                               |    | 🔧 |    |\n| [template-no-unsupported-role-attributes](docs/rules/template-no-unsupported-role-attributes.md)                 | disallow ARIA attributes that are not supported by the element role              |    | 🔧 |    |\n| [template-no-whitespace-within-word](docs/rules/template-no-whitespace-within-word.md)                           | disallow excess whitespace within words (e.g. \"W e l c o m e\")                   |    |    |    |\n| [template-require-aria-activedescendant-tabindex](docs/rules/template-require-aria-activedescendant-tabindex.md) | require non-interactive elements with aria-activedescendant to have tabindex     |    | 🔧 |    |\n| [template-require-context-role](docs/rules/template-require-context-role.md)                                     | require ARIA roles to be used in appropriate context                             |    |    |    |\n| [template-require-iframe-title](docs/rules/template-require-iframe-title.md)                                     | require iframe elements to have a title attribute                                |    |    |    |\n| [template-require-input-label](docs/rules/template-require-input-label.md)                                       | require label for form input elements                                            |    |    |    |\n| [template-require-lang-attribute](docs/rules/template-require-lang-attribute.md)                                 | require lang attribute on html element                                           |    |    |    |\n| [template-require-mandatory-role-attributes](docs/rules/template-require-mandatory-role-attributes.md)           | require mandatory ARIA attributes for ARIA roles                                 |    |    |    |\n| [template-require-media-caption](docs/rules/template-require-media-caption.md)                                   | require captions for audio and video elements                                    |    |    |    |\n| [template-require-presentational-children](docs/rules/template-require-presentational-children.md)               | require presentational elements to only contain presentational children          |    |    |    |\n| [template-require-valid-alt-text](docs/rules/template-require-valid-alt-text.md)                                 | require valid alt text for images and other elements                             |    |    |    |\n| [template-require-valid-form-groups](docs/rules/template-require-valid-form-groups.md)                           | require grouped form controls to have fieldset/legend or WAI-ARIA group labeling |    |    |    |\n| [template-table-groups](docs/rules/template-table-groups.md)                                                     | require table elements to use table grouping elements                            |    |    |    |\n\n### Best Practices\n\n| Name                                                                                                               | Description                                                                  | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :- | :- | :- |\n| [template-builtin-component-arguments](docs/rules/template-builtin-component-arguments.md)                         | disallow setting certain attributes on builtin components                    |    |    |    |\n| [template-no-action-modifiers](docs/rules/template-no-action-modifiers.md)                                         | disallow usage of {{action}} modifiers                                       |    | 🔧 |    |\n| [template-no-action-on-submit-button](docs/rules/template-no-action-on-submit-button.md)                           | disallow action attribute on submit buttons                                  |    |    |    |\n| [template-no-args-paths](docs/rules/template-no-args-paths.md)                                                     | disallow args.foo paths in templates, use @foo instead                       |    | 🔧 |    |\n| [template-no-arguments-for-html-elements](docs/rules/template-no-arguments-for-html-elements.md)                   | disallow @arguments on HTML elements                                         |    |    |    |\n| [template-no-array-prototype-extensions](docs/rules/template-no-array-prototype-extensions.md)                     | disallow usage of Ember Array prototype extensions                           |    | 🔧 |    |\n| [template-no-at-ember-render-modifiers](docs/rules/template-no-at-ember-render-modifiers.md)                       | disallow usage of @ember/render-modifiers                                    |    |    |    |\n| [template-no-bare-strings](docs/rules/template-no-bare-strings.md)                                                 | disallow bare strings in templates (require translation/localization)        |    |    |    |\n| [template-no-bare-yield](docs/rules/template-no-bare-yield.md)                                                     | disallow templates whose only meaningful content is a bare {{yield}}         |    |    |    |\n| [template-no-block-params-for-html-elements](docs/rules/template-no-block-params-for-html-elements.md)             | disallow block params on HTML elements                                       |    |    |    |\n| [template-no-builtin-form-components](docs/rules/template-no-builtin-form-components.md)                           | disallow usage of built-in form components                                   |    |    |    |\n| [template-no-capital-arguments](docs/rules/template-no-capital-arguments.md)                                       | disallow capital arguments (use lowercase @arg instead of @Arg)              |    |    |    |\n| [template-no-chained-this](docs/rules/template-no-chained-this.md)                                                 | disallow redundant `this.this` in templates                                  |    | 🔧 |    |\n| [template-no-class-bindings](docs/rules/template-no-class-bindings.md)                                             | disallow passing classBinding or classNameBindings as arguments in templates |    |    |    |\n| [template-no-curly-component-invocation](docs/rules/template-no-curly-component-invocation.md)                     | disallow curly component invocation, use angle bracket syntax instead        |    | 🔧 |    |\n| [template-no-debugger](docs/rules/template-no-debugger.md)                                                         | disallow {{debugger}} in templates                                           |    |    |    |\n| [template-no-duplicate-attributes](docs/rules/template-no-duplicate-attributes.md)                                 | disallow duplicate attribute names in templates                              |    | 🔧 |    |\n| [template-no-duplicate-id](docs/rules/template-no-duplicate-id.md)                                                 | disallow duplicate id attributes                                             |    |    |    |\n| [template-no-dynamic-subexpression-invocations](docs/rules/template-no-dynamic-subexpression-invocations.md)       | disallow dynamic subexpression invocations                                   |    |    |    |\n| [template-no-element-event-actions](docs/rules/template-no-element-event-actions.md)                               | disallow element event actions (use {{on}} modifier instead)                 |    |    |    |\n| [template-no-forbidden-elements](docs/rules/template-no-forbidden-elements.md)                                     | disallow specific HTML elements                                              |    |    |    |\n| [template-no-html-comments](docs/rules/template-no-html-comments.md)                                               | disallow HTML comments in templates                                          |    | 🔧 |    |\n| [template-no-implicit-this](docs/rules/template-no-implicit-this.md)                                               | require explicit `this` in property access                                   |    |    |    |\n| [template-no-index-component-invocation](docs/rules/template-no-index-component-invocation.md)                     | disallow index component invocations                                         |    |    |    |\n| [template-no-inline-event-handlers](docs/rules/template-no-inline-event-handlers.md)                               | disallow DOM event handler attributes                                        |    |    |    |\n| [template-no-inline-linkto](docs/rules/template-no-inline-linkto.md)                                               | disallow inline form of LinkTo component                                     |    | 🔧 |    |\n| [template-no-inline-styles](docs/rules/template-no-inline-styles.md)                                               | disallow inline styles                                                       |    |    |    |\n| [template-no-input-block](docs/rules/template-no-input-block.md)                                                   | disallow block usage of {{input}} helper                                     |    |    |    |\n| [template-no-input-tagname](docs/rules/template-no-input-tagname.md)                                               | disallow tagName attribute on {{input}} helper                               |    |    |    |\n| [template-no-invalid-meta](docs/rules/template-no-invalid-meta.md)                                                 | disallow invalid meta tags                                                   |    |    |    |\n| [template-no-log](docs/rules/template-no-log.md)                                                                   | disallow {{log}} in templates                                                |    |    |    |\n| [template-no-model-argument-in-route-templates](docs/rules/template-no-model-argument-in-route-templates.md)       | disallow @model argument in route templates                                  |    | 🔧 |    |\n| [template-no-multiple-empty-lines](docs/rules/template-no-multiple-empty-lines.md)                                 | disallow multiple consecutive empty lines in templates                       |    | 🔧 |    |\n| [template-no-mut-helper](docs/rules/template-no-mut-helper.md)                                                     | disallow usage of (mut) helper                                               |    |    |    |\n| [template-no-negated-condition](docs/rules/template-no-negated-condition.md)                                       | disallow negated conditions in if/unless                                     |    | 🔧 |    |\n| [template-no-nested-splattributes](docs/rules/template-no-nested-splattributes.md)                                 | disallow nested ...attributes usage                                          |    |    |    |\n| [template-no-obscure-array-access](docs/rules/template-no-obscure-array-access.md)                                 | disallow obscure array access patterns like `objectPath.@each.property`      |    | 🔧 |    |\n| [template-no-obsolete-elements](docs/rules/template-no-obsolete-elements.md)                                       | disallow obsolete HTML elements                                              |    |    |    |\n| [template-no-outlet-outside-routes](docs/rules/template-no-outlet-outside-routes.md)                               | disallow {{outlet}} outside of route templates                               |    |    |    |\n| [template-no-page-title-component](docs/rules/template-no-page-title-component.md)                                 | disallow usage of ember-page-title component                                 |    |    |    |\n| [template-no-passed-in-event-handlers](docs/rules/template-no-passed-in-event-handlers.md)                         | disallow passing event handlers directly as component arguments              |    |    |    |\n| [template-no-positional-data-test-selectors](docs/rules/template-no-positional-data-test-selectors.md)             | disallow positional data-test-* params in curly invocations                  |    | 🔧 |    |\n| [template-no-potential-path-strings](docs/rules/template-no-potential-path-strings.md)                             | disallow potential path strings in attribute values                          |    |    |    |\n| [template-no-redundant-fn](docs/rules/template-no-redundant-fn.md)                                                 | disallow unnecessary usage of (fn) helper                                    |    | 🔧 |    |\n| [template-no-restricted-invocations](docs/rules/template-no-restricted-invocations.md)                             | disallow certain components, helpers or modifiers from being used            |    |    |    |\n| [template-no-splattributes-with-class](docs/rules/template-no-splattributes-with-class.md)                         | disallow splattributes with class attribute                                  |    |    |    |\n| [template-no-this-in-template-only-components](docs/rules/template-no-this-in-template-only-components.md)         | disallow this in template-only components                                    |    | 🔧 |    |\n| [template-no-trailing-spaces](docs/rules/template-no-trailing-spaces.md)                                           | disallow trailing whitespace at the end of lines in templates                |    | 🔧 |    |\n| [template-no-unavailable-this](docs/rules/template-no-unavailable-this.md)                                         | disallow `this` in templates that are not inside a class or function         |    |    |    |\n| [template-no-unnecessary-component-helper](docs/rules/template-no-unnecessary-component-helper.md)                 | disallow unnecessary component helper                                        |    | 🔧 |    |\n| [template-no-unnecessary-concat](docs/rules/template-no-unnecessary-concat.md)                                     | disallow unnecessary string concatenation                                    |    | 🔧 |    |\n| [template-no-unnecessary-curly-parens](docs/rules/template-no-unnecessary-curly-parens.md)                         | disallow unnecessary parentheses enclosing statements in curlies             |    | 🔧 |    |\n| [template-no-unused-block-params](docs/rules/template-no-unused-block-params.md)                                   | disallow unused block parameters in templates                                |    |    |    |\n| [template-no-valueless-arguments](docs/rules/template-no-valueless-arguments.md)                                   | disallow valueless named arguments                                           |    |    |    |\n| [template-no-whitespace-for-layout](docs/rules/template-no-whitespace-for-layout.md)                               | disallow using whitespace for layout purposes                                |    |    |    |\n| [template-no-yield-block-params-to-else-inverse](docs/rules/template-no-yield-block-params-to-else-inverse.md)     | disallow yielding block params to else or inverse block                      |    |    |    |\n| [template-no-yield-only](docs/rules/template-no-yield-only.md)                                                     | disallow components that only yield                                          |    |    |    |\n| [template-no-yield-to-default](docs/rules/template-no-yield-to-default.md)                                         | disallow yield to default block                                              |    |    |    |\n| [template-require-button-type](docs/rules/template-require-button-type.md)                                         | require button elements to have a valid type attribute                       |    | 🔧 |    |\n| [template-require-each-key](docs/rules/template-require-each-key.md)                                               | require key attribute in {{#each}} loops                                     |    | 🔧 |    |\n| [template-require-form-method](docs/rules/template-require-form-method.md)                                         | require form method attribute                                                |    | 🔧 |    |\n| [template-require-has-block-helper](docs/rules/template-require-has-block-helper.md)                               | require (has-block) helper usage instead of hasBlock property                |    | 🔧 |    |\n| [template-require-iframe-src-attribute](docs/rules/template-require-iframe-src-attribute.md)                       | require iframe elements to have src attribute                                |    | 🔧 |    |\n| [template-require-splattributes](docs/rules/template-require-splattributes.md)                                     | require splattributes usage in component templates                           |    |    |    |\n| [template-require-strict-mode](docs/rules/template-require-strict-mode.md)                                         | require templates to be in strict mode                                       |    |    |    |\n| [template-require-valid-named-block-naming-format](docs/rules/template-require-valid-named-block-naming-format.md) | require valid named block naming format                                      |    | 🔧 |    |\n| [template-self-closing-void-elements](docs/rules/template-self-closing-void-elements.md)                           | require self-closing on void elements                                        |    | 🔧 |    |\n| [template-simple-modifiers](docs/rules/template-simple-modifiers.md)                                               | require simple modifier syntax                                               |    |    |    |\n| [template-simple-unless](docs/rules/template-simple-unless.md)                                                     | require simple conditions in unless blocks                                   |    | 🔧 |    |\n| [template-sort-invocations](docs/rules/template-sort-invocations.md)                                               | require sorted attributes and modifiers                                      |    | 🔧 |    |\n| [template-splat-attributes-only](docs/rules/template-splat-attributes-only.md)                                     | disallow ...spread other than ...attributes                                  |    |    |    |\n| [template-style-concatenation](docs/rules/template-style-concatenation.md)                                         | disallow string concatenation in inline styles                               |    |    |    |\n\n### Components\n\n| Name                                                                       | Description                                                                                                                          | 💼 | 🔧 | 💡 |\n| :------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |\n| [no-attrs-in-components](docs/rules/no-attrs-in-components.md)             | disallow usage of `this.attrs` in components                                                                                         | ✅  |    |    |\n| [no-attrs-snapshot](docs/rules/no-attrs-snapshot.md)                       | disallow use of attrs snapshot in the `didReceiveAttrs` and `didUpdateAttrs` component hooks                                         | ✅  |    |    |\n| [no-builtin-form-components](docs/rules/no-builtin-form-components.md)     | disallow usage of built-in form components                                                                                           |    |    |    |\n| [no-classic-components](docs/rules/no-classic-components.md)               | enforce using Glimmer components                                                                                                     | ✅  |    |    |\n| [no-component-lifecycle-hooks](docs/rules/no-component-lifecycle-hooks.md) | disallow usage of \"classic\" ember component lifecycle hooks. Render modifiers or custom functional modifiers should be used instead. | ✅  |    |    |\n| [no-on-calls-in-components](docs/rules/no-on-calls-in-components.md)       | disallow usage of `on` to call lifecycle hooks in components                                                                         | ✅  |    |    |\n| [require-tagless-components](docs/rules/require-tagless-components.md)     | disallow using the wrapper element of a component                                                                                    | ✅  |    |    |\n\n### Computed Properties\n\n| Name                                                                                                                                             | Description                                                                                 | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------ | :- | :- | :- |\n| [computed-property-getters](docs/rules/computed-property-getters.md)                                                                             | enforce the consistent use of getters in computed properties                                |    |    |    |\n| [no-arrow-function-computed-properties](docs/rules/no-arrow-function-computed-properties.md)                                                     | disallow arrow functions in computed properties                                             | ✅  |    |    |\n| [no-assignment-of-untracked-properties-used-in-tracking-contexts](docs/rules/no-assignment-of-untracked-properties-used-in-tracking-contexts.md) | disallow assignment of untracked properties that are used as computed property dependencies | ✅  | 🔧 |    |\n| [no-computed-properties-in-native-classes](docs/rules/no-computed-properties-in-native-classes.md)                                               | disallow using computed properties in native classes                                        | ✅  |    |    |\n| [no-deeply-nested-dependent-keys-with-each](docs/rules/no-deeply-nested-dependent-keys-with-each.md)                                             | disallow usage of deeply-nested computed property dependent keys with `@each`               | ✅  |    |    |\n| [no-duplicate-dependent-keys](docs/rules/no-duplicate-dependent-keys.md)                                                                         | disallow repeating computed property dependent keys                                         | ✅  | 🔧 |    |\n| [no-incorrect-computed-macros](docs/rules/no-incorrect-computed-macros.md)                                                                       | disallow incorrect usage of computed property macros                                        | ✅  | 🔧 |    |\n| [no-invalid-dependent-keys](docs/rules/no-invalid-dependent-keys.md)                                                                             | disallow invalid dependent keys in computed properties                                      | ✅  | 🔧 |    |\n| [no-side-effects](docs/rules/no-side-effects.md)                                                                                                 | disallow unexpected side effects in computed properties                                     | ✅  |    |    |\n| [no-volatile-computed-properties](docs/rules/no-volatile-computed-properties.md)                                                                 | disallow volatile computed properties                                                       | ✅  |    |    |\n| [require-computed-macros](docs/rules/require-computed-macros.md)                                                                                 | require using computed property macros when possible                                        | ✅  | 🔧 |    |\n| [require-computed-property-dependencies](docs/rules/require-computed-property-dependencies.md)                                                   | require dependencies to be declared statically in computed properties                       | ✅  | 🔧 |    |\n| [require-return-from-computed](docs/rules/require-return-from-computed.md)                                                                       | disallow missing return statements in computed properties                                   | ✅  |    |    |\n| [use-brace-expansion](docs/rules/use-brace-expansion.md)                                                                                         | enforce usage of brace expansion in computed property dependent keys                        | ✅  |    |    |\n\n### Controllers\n\n| Name                                                                               | Description                           | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------------------- | :------------------------------------ | :- | :- | :- |\n| [alias-model-in-controller](docs/rules/alias-model-in-controller.md)               | enforce aliasing model in controllers |    |    |    |\n| [avoid-using-needs-in-controllers](docs/rules/avoid-using-needs-in-controllers.md) | disallow using `needs` in controllers | ✅  |    |    |\n| [no-controllers](docs/rules/no-controllers.md)                                     | disallow non-essential controllers    |    |    |    |\n\n### Deprecations\n\n| Name                                                                                             | Description                                               | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------------- | :-------------------------------------------------------- | :- | :- | :- |\n| [closure-actions](docs/rules/closure-actions.md)                                                 | enforce usage of closure actions                          | ✅  |    |    |\n| [new-module-imports](docs/rules/new-module-imports.md)                                           | enforce using \"New Module Imports\" from Ember RFC #176    | ✅  |    |    |\n| [no-array-prototype-extensions](docs/rules/no-array-prototype-extensions.md)                     | disallow usage of Ember's `Array` prototype extensions    |    | 🔧 |    |\n| [no-at-ember-render-modifiers](docs/rules/no-at-ember-render-modifiers.md)                       | disallow importing from @ember/render-modifiers           | ✅  |    |    |\n| [no-deprecated-router-transition-methods](docs/rules/no-deprecated-router-transition-methods.md) | enforce usage of router service transition methods        | ✅  | 🔧 |    |\n| [no-function-prototype-extensions](docs/rules/no-function-prototype-extensions.md)               | disallow usage of Ember's `function` prototype extensions | ✅  |    |    |\n| [no-implicit-injections](docs/rules/no-implicit-injections.md)                                   | enforce usage of implicit service injections              | ✅  | 🔧 |    |\n| [no-mixins](docs/rules/no-mixins.md)                                                             | disallow the usage of mixins                              | ✅  |    |    |\n| [no-new-mixins](docs/rules/no-new-mixins.md)                                                     | disallow the creation of new mixins                       | ✅  |    |    |\n| [no-observers](docs/rules/no-observers.md)                                                       | disallow usage of observers                               | ✅  |    |    |\n| [no-old-shims](docs/rules/no-old-shims.md)                                                       | disallow usage of old shims for modules                   | ✅  | 🔧 |    |\n| [no-string-prototype-extensions](docs/rules/no-string-prototype-extensions.md)                   | disallow usage of `String` prototype extensions           | ✅  |    |    |\n| [template-deprecated-inline-view-helper](docs/rules/template-deprecated-inline-view-helper.md)   | disallow inline {{view}} helper                           |    | 🔧 |    |\n| [template-deprecated-render-helper](docs/rules/template-deprecated-render-helper.md)             | disallow {{render}} helper                                |    | 🔧 |    |\n| [template-no-action](docs/rules/template-no-action.md)                                           | disallow {{action}} helper                                |    |    |    |\n| [template-no-attrs-in-components](docs/rules/template-no-attrs-in-components.md)                 | disallow attrs in component templates                     |    |    |    |\n| [template-no-link-to-positional-params](docs/rules/template-no-link-to-positional-params.md)     | disallow positional params in LinkTo component            |    |    |    |\n| [template-no-link-to-tagname](docs/rules/template-no-link-to-tagname.md)                         | disallow tagName attribute on LinkTo component            |    |    |    |\n| [template-no-route-action](docs/rules/template-no-route-action.md)                               | disallow usage of route-action helper                     |    |    |    |\n| [template-no-unbound](docs/rules/template-no-unbound.md)                                         | disallow {{unbound}} helper                               |    |    |    |\n| [template-no-with](docs/rules/template-no-with.md)                                               | disallow {{with}} helper                                  |    |    |    |\n\n### Ember Data\n\n| Name                                                                                   | Description                                                           | 💼 | 🔧 | 💡 |\n| :------------------------------------------------------------------------------------- | :-------------------------------------------------------------------- | :- | :- | :- |\n| [no-empty-attrs](docs/rules/no-empty-attrs.md)                                         | disallow usage of empty attributes in Ember Data models               |    |    |    |\n| [require-async-inverse-relationship](docs/rules/require-async-inverse-relationship.md) | require inverse to be specified in @belongsTo and @hasMany decorators |    |    |    |\n| [use-ember-data-rfc-395-imports](docs/rules/use-ember-data-rfc-395-imports.md)         | enforce usage of `@ember-data/` package imports instead `ember-data`  | ✅  | 🔧 |    |\n\n### Ember Object\n\n| Name                                                                                       | Description                                                                            | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :- | :- | :- |\n| [avoid-leaking-state-in-ember-objects](docs/rules/avoid-leaking-state-in-ember-objects.md) | disallow state leakage                                                                 | ✅  |    |    |\n| [no-get](docs/rules/no-get.md)                                                             | require using ES5 getters instead of Ember's `get` / `getProperties` functions         | ✅  | 🔧 |    |\n| [no-get-with-default](docs/rules/no-get-with-default.md)                                   | disallow usage of the Ember's `getWithDefault` function                                | ✅  | 🔧 |    |\n| [no-modifier-argument-destructuring](docs/rules/no-modifier-argument-destructuring.md)     | disallow destructuring of modifier arguments to avoid consuming tracked data too early |    |    |    |\n| [no-proxies](docs/rules/no-proxies.md)                                                     | disallow using array or object proxies                                                 |    |    |    |\n| [no-try-invoke](docs/rules/no-try-invoke.md)                                               | disallow usage of the Ember's `tryInvoke` util                                         | ✅  |    |    |\n| [require-super-in-lifecycle-hooks](docs/rules/require-super-in-lifecycle-hooks.md)         | require super to be called in lifecycle hooks                                          | ✅  | 🔧 |    |\n| [use-ember-get-and-set](docs/rules/use-ember-get-and-set.md)                               | enforce usage of `Ember.get` and `Ember.set`                                           |    | 🔧 |    |\n\n### Ember Octane\n\n| Name                                                                                       | Description                                                                                                    | 💼                                                              | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------- | :- | :- |\n| [classic-decorator-hooks](docs/rules/classic-decorator-hooks.md)                           | enforce using correct hooks for both classic and non-classic classes                                           | ✅                                                               |    |    |\n| [classic-decorator-no-classic-methods](docs/rules/classic-decorator-no-classic-methods.md) | disallow usage of classic APIs such as `get`/`set` in classes that aren't explicitly decorated with `@classic` | ✅                                                               |    |    |\n| [no-actions-hash](docs/rules/no-actions-hash.md)                                           | disallow the actions hash in components, controllers, and routes                                               | ✅                                                               |    |    |\n| [no-classic-classes](docs/rules/no-classic-classes.md)                                     | disallow \"classic\" classes in favor of native JS classes                                                       | ✅                                                               |    |    |\n| [no-ember-super-in-es-classes](docs/rules/no-ember-super-in-es-classes.md)                 | disallow use of `this._super` in ES class methods                                                              | ✅                                                               | 🔧 |    |\n| [no-empty-glimmer-component-classes](docs/rules/no-empty-glimmer-component-classes.md)     | disallow empty backing classes for Glimmer components                                                          | ✅                                                               |    |    |\n| [no-tracked-built-ins](docs/rules/no-tracked-built-ins.md)                                 | enforce usage of `@ember/reactive/collections` imports instead of `tracked-built-ins`                          |                                                                 | 🔧 |    |\n| [no-tracked-properties-from-args](docs/rules/no-tracked-properties-from-args.md)           | disallow creating @tracked properties from this.args                                                           | ✅                                                               |    |    |\n| [template-no-deprecated](docs/rules/template-no-deprecated.md)                             | disallow using deprecated Glimmer components, helpers, and modifiers in templates                              |                                                                 |    |    |\n| [template-no-let-reference](docs/rules/template-no-let-reference.md)                       | disallow referencing let variables in \\\u003ctemplate\\\u003e                                                             | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) |    |    |\n\n### jQuery\n\n| Name                                               | Description                                        | 💼 | 🔧 | 💡 |\n| :------------------------------------------------- | :------------------------------------------------- | :- | :- | :- |\n| [jquery-ember-run](docs/rules/jquery-ember-run.md) | disallow usage of jQuery without an Ember run loop | ✅  |    |    |\n| [no-global-jquery](docs/rules/no-global-jquery.md) | disallow usage of global jQuery object             | ✅  |    |    |\n| [no-jquery](docs/rules/no-jquery.md)               | disallow any usage of jQuery                       | ✅  |    |    |\n\n### Miscellaneous\n\n| Name                                                                                                                   | Description                                                                                                                   | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |\n| [named-functions-in-promises](docs/rules/named-functions-in-promises.md)                                               | enforce usage of named functions in promises                                                                                  |    |    |    |\n| [no-html-safe](docs/rules/no-html-safe.md)                                                                             | disallow the use of `htmlSafe`                                                                                                |    |    |    |\n| [no-incorrect-calls-with-inline-anonymous-functions](docs/rules/no-incorrect-calls-with-inline-anonymous-functions.md) | disallow inline anonymous functions as arguments to `debounce`, `once`, and `scheduleOnce`                                    | ✅  |    |    |\n| [no-invalid-debug-function-arguments](docs/rules/no-invalid-debug-function-arguments.md)                               | disallow usages of Ember's `assert()` / `warn()` / `deprecate()` functions that have the arguments passed in the wrong order. | ✅  |    |    |\n| [no-restricted-property-modifications](docs/rules/no-restricted-property-modifications.md)                             | disallow modifying the specified properties                                                                                   |    | 🔧 |    |\n| [no-runloop](docs/rules/no-runloop.md)                                                                                 | disallow usage of `@ember/runloop` functions                                                                                  | ✅  |    |    |\n| [require-fetch-import](docs/rules/require-fetch-import.md)                                                             | enforce explicit import for `fetch()`                                                                                         |    |    |    |\n\n### Possible Errors\n\n| Name                                                                                                                       | Description                                                       | 💼 | 🔧 | 💡 |\n| :------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- | :- | :- | :- |\n| [template-no-extra-mut-helper-argument](docs/rules/template-no-extra-mut-helper-argument.md)                               | disallow passing more than one argument to the mut helper         |    |    |    |\n| [template-no-jsx-attributes](docs/rules/template-no-jsx-attributes.md)                                                     | disallow JSX-style camelCase attributes                           |    | 🔧 |    |\n| [template-no-scope-outside-table-headings](docs/rules/template-no-scope-outside-table-headings.md)                         | disallow scope attribute outside th elements                      |    |    |    |\n| [template-no-shadowed-elements](docs/rules/template-no-shadowed-elements.md)                                               | disallow ambiguity with block param names shadowing HTML elements |    |    |    |\n| [template-no-unbalanced-curlies](docs/rules/template-no-unbalanced-curlies.md)                                             | disallow unbalanced mustache curlies                              |    |    |    |\n| [template-no-unknown-arguments-for-builtin-components](docs/rules/template-no-unknown-arguments-for-builtin-components.md) | disallow unknown arguments for built-in components                |    | 🔧 |    |\n\n### Routes\n\n| Name                                                                               | Description                                                                              | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :- | :- | :- |\n| [no-capital-letters-in-routes](docs/rules/no-capital-letters-in-routes.md)         | disallow routes with uppercased letters in router.js                                     | ✅  |    |    |\n| [no-controller-access-in-routes](docs/rules/no-controller-access-in-routes.md)     | disallow routes from accessing the controller outside of setupController/resetController | ✅  |    |    |\n| [no-private-routing-service](docs/rules/no-private-routing-service.md)             | disallow injecting the private routing service                                           | ✅  |    |    |\n| [no-shadow-route-definition](docs/rules/no-shadow-route-definition.md)             | enforce no route path definition shadowing                                               | ✅  |    |    |\n| [no-unnecessary-index-route](docs/rules/no-unnecessary-index-route.md)             | disallow unnecessary `index` route definition                                            |    |    |    |\n| [no-unnecessary-route-path-option](docs/rules/no-unnecessary-route-path-option.md) | disallow unnecessary usage of the route `path` option                                    | ✅  | 🔧 |    |\n| [route-path-style](docs/rules/route-path-style.md)                                 | enforce usage of kebab-case (instead of snake_case or camelCase) in route paths          |    |    | 💡 |\n| [routes-segments-snake-case](docs/rules/routes-segments-snake-case.md)             | enforce usage of snake_cased dynamic segments in routes                                  | ✅  |    |    |\n\n### Security\n\n| Name                                                                   | Description                                                     | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------- | :-------------------------------------------------------------- | :- | :- | :- |\n| [template-link-rel-noopener](docs/rules/template-link-rel-noopener.md) | require rel=\"noopener noreferrer\" on links with target=\"_blank\" |    | 🔧 |    |\n| [template-no-triple-curlies](docs/rules/template-no-triple-curlies.md) | disallow usage of triple curly brackets (unescaped variables)   |    |    |    |\n\n### Services\n\n| Name                                                                                                 | Description                                                       | 💼 | 🔧 | 💡 |\n| :--------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- | :- | :- | :- |\n| [no-implicit-service-injection-argument](docs/rules/no-implicit-service-injection-argument.md)       | disallow omitting the injected service name argument              |    | 🔧 |    |\n| [no-restricted-service-injections](docs/rules/no-restricted-service-injections.md)                   | disallow injecting certain services under certain paths           |    |    |    |\n| [no-unnecessary-service-injection-argument](docs/rules/no-unnecessary-service-injection-argument.md) | disallow unnecessary argument when injecting services             |    | 🔧 |    |\n| [no-unused-services](docs/rules/no-unused-services.md)                                               | disallow unused service injections (see rule doc for limitations) |    |    | 💡 |\n\n### Style\n\n| Name                                                                                         | Description                                                | 💼 | 🔧 | 💡 |\n| :------------------------------------------------------------------------------------------- | :--------------------------------------------------------- | :- | :- | :- |\n| [template-no-quoteless-attributes](docs/rules/template-no-quoteless-attributes.md)           | require quotes on all attribute values                     |    | 🔧 |    |\n| [template-no-unnecessary-curly-strings](docs/rules/template-no-unnecessary-curly-strings.md) | disallow unnecessary curly braces in string interpolations |    | 🔧 |    |\n\n### Stylistic Issues\n\n| Name                                                                           | Description                                                                    | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------- | :----------------------------------------------------------------------------- | :- | :- | :- |\n| [order-in-components](docs/rules/order-in-components.md)                       | enforce proper order of properties in components                               |    | 🔧 |    |\n| [order-in-controllers](docs/rules/order-in-controllers.md)                     | enforce proper order of properties in controllers                              |    | 🔧 |    |\n| [order-in-models](docs/rules/order-in-models.md)                               | enforce proper order of properties in models                                   |    | 🔧 |    |\n| [order-in-routes](docs/rules/order-in-routes.md)                               | enforce proper order of properties in routes                                   |    | 🔧 |    |\n| [template-attribute-indentation](docs/rules/template-attribute-indentation.md) | enforce proper indentation of attributes and arguments in multi-line templates |    |    |    |\n| [template-attribute-order](docs/rules/template-attribute-order.md)             | enforce consistent ordering of attributes in template elements                 |    | 🔧 |    |\n| [template-block-indentation](docs/rules/template-block-indentation.md)         | enforce consistent indentation for block statements and their children         |    | 🔧 |    |\n| [template-eol-last](docs/rules/template-eol-last.md)                           | require or disallow newline at the end of template files                       |    | 🔧 |    |\n| [template-linebreak-style](docs/rules/template-linebreak-style.md)             | enforce consistent linebreaks in templates                                     |    | 🔧 |    |\n| [template-modifier-name-case](docs/rules/template-modifier-name-case.md)       | require dasherized names for modifiers                                         |    | 🔧 |    |\n| [template-no-only-default-slot](docs/rules/template-no-only-default-slot.md)   | disallow using only the default slot                                           |    | 🔧 |    |\n| [template-quotes](docs/rules/template-quotes.md)                               | enforce consistent quote style in templates                                    |    | 🔧 |    |\n| [template-template-length](docs/rules/template-template-length.md)             | enforce template size constraints                                              |    |    |    |\n\n### Testing\n\n| Name                                                                                                   | Description                                                                                              | 💼 | 🔧 | 💡 |\n| :----------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------- | :- | :- | :- |\n| [no-current-route-name](docs/rules/no-current-route-name.md)                                           | disallow usage of the `currentRouteName()` test helper                                                   |    |    |    |\n| [no-ember-testing-in-module-scope](docs/rules/no-ember-testing-in-module-scope.md)                     | disallow use of `Ember.testing` in module scope                                                          | ✅  |    |    |\n| [no-invalid-test-waiters](docs/rules/no-invalid-test-waiters.md)                                       | disallow incorrect usage of test waiter APIs                                                             | ✅  |    |    |\n| [no-legacy-test-waiters](docs/rules/no-legacy-test-waiters.md)                                         | disallow the use of the legacy test waiter APIs                                                          | ✅  |    |    |\n| [no-noop-setup-on-error-in-before](docs/rules/no-noop-setup-on-error-in-before.md)                     | disallows using no-op setupOnerror in `before` or `beforeEach`                                           | ✅  | 🔧 |    |\n| [no-pause-test](docs/rules/no-pause-test.md)                                                           | disallow usage of the `pauseTest` helper in tests                                                        | ✅  |    |    |\n| [no-replace-test-comments](docs/rules/no-replace-test-comments.md)                                     | disallow 'Replace this with your real tests' comments in test files                                      |    |    |    |\n| [no-restricted-resolver-tests](docs/rules/no-restricted-resolver-tests.md)                             | disallow the use of patterns that use the restricted resolver in tests                                   | ✅  |    |    |\n| [no-settled-after-test-helper](docs/rules/no-settled-after-test-helper.md)                             | disallow usage of `await settled()` right after test helper that calls it internally                     | ✅  | 🔧 |    |\n| [no-test-and-then](docs/rules/no-test-and-then.md)                                                     | disallow usage of the `andThen` test wait helper                                                         | ✅  |    |    |\n| [no-test-import-export](docs/rules/no-test-import-export.md)                                           | disallow importing of \"-test.js\" in a test file and exporting from a test file                           | ✅  |    |    |\n| [no-test-module-for](docs/rules/no-test-module-for.md)                                                 | disallow usage of `moduleFor`, `moduleForComponent`, etc                                                 | ✅  |    |    |\n| [no-test-support-import](docs/rules/no-test-support-import.md)                                         | disallow importing of \"test-support\" files in production code.                                           | ✅  |    |    |\n| [no-test-this-render](docs/rules/no-test-this-render.md)                                               | disallow usage of the `this.render` in tests, recommending to use @ember/test-helpers' `render` instead. | ✅  |    |    |\n| [prefer-ember-test-helpers](docs/rules/prefer-ember-test-helpers.md)                                   | enforce usage of `@ember/test-helpers` methods over native window methods                                | ✅  |    |    |\n| [require-valid-css-selector-in-test-helpers](docs/rules/require-valid-css-selector-in-test-helpers.md) | disallow using invalid CSS selectors in test helpers                                                     | ✅  | 🔧 |    |\n\n\u003c!-- end auto-generated rules list --\u003e\n\n## 🍻 Contribution Guide\n\nIf you have any suggestions, ideas, or problems, feel free to [create an issue](https://github.com/ember-cli/eslint-plugin-ember/issues/new), but first please make sure your question does not repeat [previous ones](https://github.com/ember-cli/eslint-plugin-ember/issues).\n\n### Creating a New Rule\n\n- [Create an issue](https://github.com/ember-cli/eslint-plugin-ember/issues/new) with a description of the proposed rule\n- Create files for the [new rule](https://eslint.org/docs/developer-guide/working-with-rules):\n  - `lib/rules/new-rule.js` (implementation, see [no-proxies](lib/rules/no-proxies.js) for an example)\n  - `docs/rules/new-rule.md` (documentation, start from the template -- [raw](https://raw.githubusercontent.com/ember-cli/eslint-plugin-ember/master/docs/rules/_TEMPLATE_.md), [rendered](docs/rules/_TEMPLATE_.md))\n  - `tests/lib/rules/new-rule.js` (tests, see [no-proxies](tests/lib/rules/no-proxies.js) for an example)\n- Run `pnpm update` to automatically update the README and other files (and re-run this if you change the rule name or description)\n- Make sure your changes will pass [CI](./.github/workflows/ci.yml) by running:\n  - `pnpm test`\n  - `pnpm lint` (`pnpm lint:js --fix` can fix many errors)\n- Create a PR and link the created issue in the description\n\nNote that new rules should not immediately be added to the [recommended](./lib/recommended-rules.js) configuration, as we only consider such breaking changes during major version updates.\n\n## 🔓 License\n\nSee the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fember-cli%2Feslint-plugin-ember","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fember-cli%2Feslint-plugin-ember","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fember-cli%2Feslint-plugin-ember/lists"}