{"id":15015815,"url":"https://github.com/ember-template-lint/ember-template-lint","last_synced_at":"2025-05-14T01:02:07.487Z","repository":{"id":38814486,"uuid":"57333176","full_name":"ember-template-lint/ember-template-lint","owner":"ember-template-lint","description":"Linter for Ember or Handlebars templates","archived":false,"fork":false,"pushed_at":"2025-04-07T10:01:42.000Z","size":18406,"stargazers_count":267,"open_issues_count":280,"forks_count":239,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-04-10T10:03:28.945Z","etag":null,"topics":["ember","hacktoberfest","hbs","lint","linter"],"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-template-lint.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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}},"created_at":"2016-04-28T20:55:10.000Z","updated_at":"2025-04-04T19:09:48.000Z","dependencies_parsed_at":"2022-08-09T06:02:10.936Z","dependency_job_id":"71e2895f-0cdc-4398-8bf0-bfd12919c79c","html_url":"https://github.com/ember-template-lint/ember-template-lint","commit_stats":{"total_commits":3363,"total_committers":229,"mean_commits":"14.685589519650655","dds":0.8825453464168896,"last_synced_commit":"e1d3fd25fc1b8b250edd9bce11500f78721759c0"},"previous_names":[],"tags_count":246,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-template-lint%2Fember-template-lint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-template-lint%2Fember-template-lint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-template-lint%2Fember-template-lint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ember-template-lint%2Fember-template-lint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ember-template-lint","download_url":"https://codeload.github.com/ember-template-lint/ember-template-lint/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248201808,"owners_count":21064200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["ember","hacktoberfest","hbs","lint","linter"],"created_at":"2024-09-24T19:47:59.504Z","updated_at":"2025-05-14T01:02:07.380Z","avatar_url":"https://github.com/ember-template-lint.png","language":"JavaScript","funding_links":[],"categories":["Tools","Other"],"sub_categories":["Code Quality"],"readme":"# ember-template-lint\n\n[![npm version](https://badge.fury.io/js/ember-template-lint.svg)](https://badge.fury.io/js/ember-template-lint)\n[![Build Status](https://github.com/ember-template-lint/ember-template-lint/workflows/CI/badge.svg)](https://github.com/ember-template-lint/ember-template-lint/actions?query=workflow%3ACI)\n\n`ember-template-lint` is a library that will lint your handlebars template and return error results.\n\nFor example, if the rule [`no-bare-strings`](docs/rule/no-bare-strings.md) is enabled, this template would be\nin violation:\n\n```hbs\n{{! app/components/my-thing/template.hbs  }}\n\u003cdiv\u003eA bare string\u003c/div\u003e\n```\n\nWhen the `ember-template-lint` executable is run, we would have a single result indicating that\nthe `no-bare-strings` rule found an error.\n\n## Requirements\n\n- [Node.js](https://nodejs.org/) `^18.18.0 || ^20.9.0 || \u003e=21.1.0`\n\n## Installation\n\n```bash\nnpm install --save-dev ember-template-lint\n```\n\n```bash\nyarn add --dev ember-template-lint\n```\n\nNote: this library is installed by default with new Ember apps.\n\n## Usage\n\nWhile `ember-template-lint` does have a [Node API](docs/node-api.md), the main way to use it is through its executable, which is intended to be installed locally within a project.\n\nBasic usage is as straightforward as\n\n```bash\nember-template-lint .\n```\n\n### Workflow Examples\n\nSee documentation on [workflow examples](docs/workflow.md).\n\nSee documentation on the [todo functionality](docs/todos.md).\n\n## Configuration\n\n### Project Wide\n\nYou can turn on specific rules by toggling them in a\n`.template-lintrc.js` file at the base of your project, or at a custom relative\npath which may be identified using the CLI:\n\n```javascript\nmodule.exports = {\n  extends: 'recommended',\n\n  rules: {\n    'no-bare-strings': true,\n  },\n};\n```\n\nFor more detailed information see [configuration](docs/configuration.md).\n\n### Presets\n\n|     | Name                                     | Description                                                                                                                                                                                                                                                                                     |\n| :-- | :--------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ✅  | [recommended](lib/config/recommended.js) | Enables the recommended rules.                                                                                                                                                                                                                                                                  |\n| 💅  | [stylistic](lib/config/stylistic.js)     | Enables stylistic rules for those who aren't ready to adopt [ember-template-lint-plugin-prettier](https://github.com/ember-template-lint/ember-template-lint-plugin-prettier) (including stylistic rules that were previously in the `recommended` preset in ember-template-lint v1).           |\n| ⌨️  | [a11y](lib/config/a11y.js)               | Enables A11Y rules. Its goal is to include **all** A11Y related rules, therefore it does not follow the same SemVer policy as the other presets. Please see [versioning](https://github.com/ember-template-lint/ember-template-lint/blob/master/dev/versioning.md#exemptions) for more details. |\n\n## Rules\n\nEach rule has emojis denoting:\n\n- what configuration it belongs to\n- 🔧 if some problems reported by the rule are automatically fixable by the `--fix` command line option\n\n\u003c!--RULES_TABLE_START--\u003e\n\n| Name                                                                                                      | ✅  | 💅  | ⌨️  | 🔧  |\n| :-------------------------------------------------------------------------------------------------------- | :-- | :-- | :-- | --- |\n| [attribute-indentation](./docs/rule/attribute-indentation.md)                                             |     |     |     |     |\n| [attribute-order](./docs/rule/attribute-order.md)                                                         |     |     |     | 🔧  |\n| [block-indentation](./docs/rule/block-indentation.md)                                                     |     | 💅  |     | 🔧  |\n| [builtin-component-arguments](./docs/rule/builtin-component-arguments.md)                                 | ✅  |     |     |     |\n| [deprecated-inline-view-helper](./docs/rule/deprecated-inline-view-helper.md)                             | ✅  |     |     |     |\n| [deprecated-render-helper](./docs/rule/deprecated-render-helper.md)                                       | ✅  |     |     |     |\n| [eol-last](./docs/rule/eol-last.md)                                                                       |     | 💅  |     | 🔧  |\n| [inline-link-to](./docs/rule/inline-link-to.md)                                                           |     |     |     | 🔧  |\n| [linebreak-style](./docs/rule/linebreak-style.md)                                                         |     | 💅  |     |     |\n| [link-href-attributes](./docs/rule/link-href-attributes.md)                                               | ✅  |     | ⌨️  |     |\n| [link-rel-noopener](./docs/rule/link-rel-noopener.md)                                                     | ✅  |     |     | 🔧  |\n| [modifier-name-case](./docs/rule/modifier-name-case.md)                                                   |     | 💅  |     | 🔧  |\n| [no-abstract-roles](./docs/rule/no-abstract-roles.md)                                                     | ✅  |     | ⌨️  |     |\n| [no-accesskey-attribute](./docs/rule/no-accesskey-attribute.md)                                           | ✅  |     | ⌨️  | 🔧  |\n| [no-action](./docs/rule/no-action.md)                                                                     | ✅  |     |     |     |\n| [no-action-modifiers](./docs/rule/no-action-modifiers.md)                                                 |     |     |     | 🔧  |\n| [no-action-on-submit-button](./docs/rule/no-action-on-submit-button.md)                                   | ✅  |     |     |     |\n| [no-args-paths](./docs/rule/no-args-paths.md)                                                             | ✅  |     |     |     |\n| [no-arguments-for-html-elements](./docs/rule/no-arguments-for-html-elements.md)                           | ✅  |     |     |     |\n| [no-aria-hidden-body](./docs/rule/no-aria-hidden-body.md)                                                 | ✅  |     | ⌨️  | 🔧  |\n| [no-aria-unsupported-elements](./docs/rule/no-aria-unsupported-elements.md)                               | ✅  |     | ⌨️  |     |\n| [no-array-prototype-extensions](./docs/rule/no-array-prototype-extensions.md)                             | ✅  |     |     | 🔧  |\n| [no-at-ember-render-modifiers](./docs/rule/no-at-ember-render-modifiers.md)                               | ✅  |     |     |     |\n| [no-attrs-in-components](./docs/rule/no-attrs-in-components.md)                                           | ✅  |     |     |     |\n| [no-autofocus-attribute](./docs/rule/no-autofocus-attribute.md)                                           | ✅  |     | ⌨️  |     |\n| [no-bare-strings](./docs/rule/no-bare-strings.md)                                                         |     |     |     |     |\n| [no-block-params-for-html-elements](./docs/rule/no-block-params-for-html-elements.md)                     | ✅  |     |     |     |\n| [no-builtin-form-components](./docs/rule/no-builtin-form-components.md)                                   | ✅  |     |     |     |\n| [no-capital-arguments](./docs/rule/no-capital-arguments.md)                                               | ✅  |     |     |     |\n| [no-chained-this](./docs/rule/no-chained-this.md)                                                         |     |     |     | 🔧  |\n| [no-class-bindings](./docs/rule/no-class-bindings.md)                                                     | ✅  |     |     |     |\n| [no-curly-component-invocation](./docs/rule/no-curly-component-invocation.md)                             | ✅  |     |     | 🔧  |\n| [no-debugger](./docs/rule/no-debugger.md)                                                                 | ✅  |     |     |     |\n| [no-duplicate-attributes](./docs/rule/no-duplicate-attributes.md)                                         | ✅  |     | ⌨️  | 🔧  |\n| [no-duplicate-id](./docs/rule/no-duplicate-id.md)                                                         | ✅  |     | ⌨️  |     |\n| [no-duplicate-landmark-elements](./docs/rule/no-duplicate-landmark-elements.md)                           | ✅  |     | ⌨️  |     |\n| [no-dynamic-subexpression-invocations](./docs/rule/no-dynamic-subexpression-invocations.md)               |     |     |     |     |\n| [no-element-event-actions](./docs/rule/no-element-event-actions.md)                                       |     |     |     |     |\n| [no-empty-headings](./docs/rule/no-empty-headings.md)                                                     | ✅  |     | ⌨️  |     |\n| [no-extra-mut-helper-argument](./docs/rule/no-extra-mut-helper-argument.md)                               | ✅  |     |     |     |\n| [no-forbidden-elements](./docs/rule/no-forbidden-elements.md)                                             | ✅  |     |     |     |\n| [no-heading-inside-button](./docs/rule/no-heading-inside-button.md)                                       | ✅  |     | ⌨️  |     |\n| [no-html-comments](./docs/rule/no-html-comments.md)                                                       | ✅  |     |     | 🔧  |\n| [no-implicit-this](./docs/rule/no-implicit-this.md)                                                       | ✅  |     |     |     |\n| [no-index-component-invocation](./docs/rule/no-index-component-invocation.md)                             | ✅  |     |     |     |\n| [no-inline-styles](./docs/rule/no-inline-styles.md)                                                       | ✅  |     |     |     |\n| [no-input-block](./docs/rule/no-input-block.md)                                                           | ✅  |     |     |     |\n| [no-input-tagname](./docs/rule/no-input-tagname.md)                                                       | ✅  |     |     |     |\n| [no-invalid-aria-attributes](./docs/rule/no-invalid-aria-attributes.md)                                   | ✅  |     | ⌨️  |     |\n| [no-invalid-interactive](./docs/rule/no-invalid-interactive.md)                                           | ✅  |     | ⌨️  |     |\n| [no-invalid-link-text](./docs/rule/no-invalid-link-text.md)                                               | ✅  |     | ⌨️  |     |\n| [no-invalid-link-title](./docs/rule/no-invalid-link-title.md)                                             | ✅  |     | ⌨️  |     |\n| [no-invalid-meta](./docs/rule/no-invalid-meta.md)                                                         | ✅  |     | ⌨️  |     |\n| [no-invalid-role](./docs/rule/no-invalid-role.md)                                                         | ✅  |     | ⌨️  |     |\n| [no-jsx-attributes](./docs/rule/no-jsx-attributes.md)                                                     |     |     |     | 🔧  |\n| [no-link-to-positional-params](./docs/rule/no-link-to-positional-params.md)                               | ✅  |     |     |     |\n| [no-link-to-tagname](./docs/rule/no-link-to-tagname.md)                                                   | ✅  |     |     |     |\n| [no-log](./docs/rule/no-log.md)                                                                           | ✅  |     |     |     |\n| [no-model-argument-in-route-templates](./docs/rule/no-model-argument-in-route-templates.md)               |     |     |     | 🔧  |\n| [no-multiple-empty-lines](./docs/rule/no-multiple-empty-lines.md)                                         |     | 💅  |     | 🔧  |\n| [no-mut-helper](./docs/rule/no-mut-helper.md)                                                             |     |     |     |     |\n| [no-negated-condition](./docs/rule/no-negated-condition.md)                                               | ✅  |     |     | 🔧  |\n| [no-nested-interactive](./docs/rule/no-nested-interactive.md)                                             | ✅  |     | ⌨️  |     |\n| [no-nested-landmark](./docs/rule/no-nested-landmark.md)                                                   | ✅  |     | ⌨️  |     |\n| [no-nested-splattributes](./docs/rule/no-nested-splattributes.md)                                         | ✅  |     |     |     |\n| [no-obscure-array-access](./docs/rule/no-obscure-array-access.md)                                         | ✅  |     |     | 🔧  |\n| [no-obsolete-elements](./docs/rule/no-obsolete-elements.md)                                               | ✅  |     | ⌨️  |     |\n| [no-only-default-slot](./docs/rule/no-only-default-slot.md)                                               |     |     |     | 🔧  |\n| [no-outlet-outside-routes](./docs/rule/no-outlet-outside-routes.md)                                       | ✅  |     |     |     |\n| [no-partial](./docs/rule/no-partial.md)                                                                   | ✅  |     |     |     |\n| [no-passed-in-event-handlers](./docs/rule/no-passed-in-event-handlers.md)                                 | ✅  |     |     |     |\n| [no-pointer-down-event-binding](./docs/rule/no-pointer-down-event-binding.md)                             | ✅  |     | ⌨️  |     |\n| [no-positional-data-test-selectors](./docs/rule/no-positional-data-test-selectors.md)                     | ✅  |     |     | 🔧  |\n| [no-positive-tabindex](./docs/rule/no-positive-tabindex.md)                                               | ✅  |     | ⌨️  |     |\n| [no-potential-path-strings](./docs/rule/no-potential-path-strings.md)                                     | ✅  |     |     |     |\n| [no-quoteless-attributes](./docs/rule/no-quoteless-attributes.md)                                         | ✅  |     |     | 🔧  |\n| [no-redundant-fn](./docs/rule/no-redundant-fn.md)                                                         | ✅  |     |     | 🔧  |\n| [no-redundant-role](./docs/rule/no-redundant-role.md)                                                     | ✅  |     | ⌨️  | 🔧  |\n| [no-restricted-invocations](./docs/rule/no-restricted-invocations.md)                                     |     |     |     |     |\n| [no-route-action](./docs/rule/no-route-action.md)                                                         | ✅  |     |     |     |\n| [no-scope-outside-table-headings](./docs/rule/no-scope-outside-table-headings.md)                         | ✅  |     | ⌨️  |     |\n| [no-shadowed-elements](./docs/rule/no-shadowed-elements.md)                                               | ✅  |     |     |     |\n| [no-splattributes-with-class](./docs/rule/no-splattributes-with-class.md)                                 |     |     |     |     |\n| [no-this-in-template-only-components](./docs/rule/no-this-in-template-only-components.md)                 |     |     |     | 🔧  |\n| [no-trailing-spaces](./docs/rule/no-trailing-spaces.md)                                                   |     | 💅  |     | 🔧  |\n| [no-triple-curlies](./docs/rule/no-triple-curlies.md)                                                     | ✅  |     |     |     |\n| [no-unbalanced-curlies](./docs/rule/no-unbalanced-curlies.md)                                             | ✅  |     |     |     |\n| [no-unbound](./docs/rule/no-unbound.md)                                                                   | ✅  |     |     |     |\n| [no-unknown-arguments-for-builtin-components](./docs/rule/no-unknown-arguments-for-builtin-components.md) | ✅  |     |     | 🔧  |\n| [no-unnecessary-component-helper](./docs/rule/no-unnecessary-component-helper.md)                         | ✅  |     |     | 🔧  |\n| [no-unnecessary-concat](./docs/rule/no-unnecessary-concat.md)                                             |     | 💅  |     | 🔧  |\n| [no-unnecessary-curly-parens](./docs/rule/no-unnecessary-curly-parens.md)                                 | ✅  |     |     | 🔧  |\n| [no-unnecessary-curly-strings](./docs/rule/no-unnecessary-curly-strings.md)                               | ✅  |     |     | 🔧  |\n| [no-unsupported-role-attributes](./docs/rule/no-unsupported-role-attributes.md)                           | ✅  |     | ⌨️  | 🔧  |\n| [no-unused-block-params](./docs/rule/no-unused-block-params.md)                                           | ✅  |     |     |     |\n| [no-valueless-arguments](./docs/rule/no-valueless-arguments.md)                                           | ✅  |     |     |     |\n| [no-whitespace-for-layout](./docs/rule/no-whitespace-for-layout.md)                                       | ✅  |     | ⌨️  |     |\n| [no-whitespace-within-word](./docs/rule/no-whitespace-within-word.md)                                     | ✅  |     | ⌨️  |     |\n| [no-with](./docs/rule/no-with.md)                                                                         | ✅  |     |     |     |\n| [no-yield-block-params-to-else-inverse](./docs/rule/no-yield-block-params-to-else-inverse.md)             |     |     |     |     |\n| [no-yield-only](./docs/rule/no-yield-only.md)                                                             | ✅  |     |     |     |\n| [no-yield-to-default](./docs/rule/no-yield-to-default.md)                                                 | ✅  |     |     |     |\n| [quotes](./docs/rule/quotes.md)                                                                           |     | 💅  |     | 🔧  |\n| [require-aria-activedescendant-tabindex](./docs/rule/require-aria-activedescendant-tabindex.md)           | ✅  |     | ⌨️  |     |\n| [require-button-type](./docs/rule/require-button-type.md)                                                 | ✅  |     |     | 🔧  |\n| [require-context-role](./docs/rule/require-context-role.md)                                               | ✅  |     | ⌨️  |     |\n| [require-each-key](./docs/rule/require-each-key.md)                                                       |     |     |     |     |\n| [require-form-method](./docs/rule/require-form-method.md)                                                 |     |     |     |     |\n| [require-has-block-helper](./docs/rule/require-has-block-helper.md)                                       | ✅  |     |     | 🔧  |\n| [require-iframe-src-attribute](./docs/rule/require-iframe-src-attribute.md)                               |     |     |     | 🔧  |\n| [require-iframe-title](./docs/rule/require-iframe-title.md)                                               | ✅  |     | ⌨️  |     |\n| [require-input-label](./docs/rule/require-input-label.md)                                                 | ✅  |     | ⌨️  |     |\n| [require-lang-attribute](./docs/rule/require-lang-attribute.md)                                           | ✅  |     | ⌨️  |     |\n| [require-mandatory-role-attributes](./docs/rule/require-mandatory-role-attributes.md)                     | ✅  |     | ⌨️  |     |\n| [require-media-caption](./docs/rule/require-media-caption.md)                                             | ✅  |     | ⌨️  |     |\n| [require-presentational-children](./docs/rule/require-presentational-children.md)                         | ✅  |     | ⌨️  |     |\n| [require-splattributes](./docs/rule/require-splattributes.md)                                             |     |     |     |     |\n| [require-strict-mode](./docs/rule/require-strict-mode.md)                                                 |     |     |     |     |\n| [require-valid-alt-text](./docs/rule/require-valid-alt-text.md)                                           | ✅  |     | ⌨️  |     |\n| [require-valid-form-groups](./docs/rule/require-valid-form-groups.md)                                     |     |     |     |     |\n| [require-valid-named-block-naming-format](./docs/rule/require-valid-named-block-naming-format.md)         | ✅  |     |     | 🔧  |\n| [self-closing-void-elements](./docs/rule/self-closing-void-elements.md)                                   |     | 💅  |     | 🔧  |\n| [simple-modifiers](./docs/rule/simple-modifiers.md)                                                       | ✅  |     |     |     |\n| [simple-unless](./docs/rule/simple-unless.md)                                                             | ✅  |     |     | 🔧  |\n| [sort-invocations](./docs/rule/sort-invocations.md)                                                       |     |     |     | 🔧  |\n| [splat-attributes-only](./docs/rule/splat-attributes-only.md)                                             | ✅  |     |     |     |\n| [style-concatenation](./docs/rule/style-concatenation.md)                                                 | ✅  |     |     |     |\n| [table-groups](./docs/rule/table-groups.md)                                                               | ✅  |     | ⌨️  |     |\n| [template-length](./docs/rule/template-length.md)                                                         |     |     |     |     |\n\n\u003c!--RULES_TABLE_END--\u003e\n\n### Supporting the `--fix` option\n\nYou can add a fixer to a rule. See [fixer documentation](docs/fixer.md) for more details.\n\n### Sharing configs\n\nIt is possible to share a config (`extends`) or plugin (custom rules) across projects. See [ember-template-lint-plugin-peopleconnect](https://github.com/peopleconnectus/ember-template-lint-plugin-peopleconnect) for an example.\n\n## Defining your own rules\n\nYou can define and use your own custom rules using the plugin system. See [plugin documentation](docs/plugins.md) for more details.\n\n## Semantic Versioning Policy\n\nThe semver policy for this addon can be read here: [semver policy](dev/versioning.md).\n\n## Contributing\n\nSee the [Contributing Guidelines](CONTRIBUTING.md) for information on how to help out.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fember-template-lint%2Fember-template-lint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fember-template-lint%2Fember-template-lint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fember-template-lint%2Fember-template-lint/lists"}