Repository: ember-cli/eslint-plugin-ember Branch: master Commit: 83b312831132 Files: 827 Total size: 3.6 MB Directory structure: gitextract_oxynmjan/ ├── .babelrc ├── .editorconfig ├── .eslint-doc-generatorrc.js ├── .gitattributes ├── .github/ │ ├── renovate.json5 │ └── workflows/ │ ├── bench-compare.yml │ ├── ci.yml │ ├── codeql-analysis.yml │ ├── plan-release.yml │ └── publish.yml ├── .gitignore ├── .markdownlint.json ├── .markdownlintignore ├── .npmpackagejsonlintrc.json ├── .npmrc ├── .prettierignore ├── .prettierrc.js ├── .release-plan.json ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── RELEASE.md ├── docs/ │ └── rules/ │ ├── _TEMPLATE_.md │ ├── alias-model-in-controller.md │ ├── avoid-leaking-state-in-ember-objects.md │ ├── avoid-using-needs-in-controllers.md │ ├── classic-decorator-hooks.md │ ├── classic-decorator-no-classic-methods.md │ ├── closure-actions.md │ ├── computed-property-getters.md │ ├── jquery-ember-run.md │ ├── named-functions-in-promises.md │ ├── new-module-imports.md │ ├── no-actions-hash.md │ ├── no-array-prototype-extensions.md │ ├── no-arrow-function-computed-properties.md │ ├── no-assignment-of-untracked-properties-used-in-tracking-contexts.md │ ├── no-at-ember-render-modifiers.md │ ├── no-attrs-in-components.md │ ├── no-attrs-snapshot.md │ ├── no-builtin-form-components.md │ ├── no-capital-letters-in-routes.md │ ├── no-classic-classes.md │ ├── no-classic-components.md │ ├── no-component-lifecycle-hooks.md │ ├── no-computed-properties-in-native-classes.md │ ├── no-controller-access-in-routes.md │ ├── no-controllers.md │ ├── no-current-route-name.md │ ├── no-deeply-nested-dependent-keys-with-each.md │ ├── no-deprecated-router-transition-methods.md │ ├── no-duplicate-dependent-keys.md │ ├── no-ember-super-in-es-classes.md │ ├── no-ember-testing-in-module-scope.md │ ├── no-empty-attrs.md │ ├── no-empty-glimmer-component-classes.md │ ├── no-function-prototype-extensions.md │ ├── no-get-with-default.md │ ├── no-get.md │ ├── no-global-jquery.md │ ├── no-html-safe.md │ ├── no-implicit-injections.md │ ├── no-implicit-service-injection-argument.md │ ├── no-incorrect-calls-with-inline-anonymous-functions.md │ ├── no-incorrect-computed-macros.md │ ├── no-invalid-debug-function-arguments.md │ ├── no-invalid-dependent-keys.md │ ├── no-invalid-test-waiters.md │ ├── no-jquery.md │ ├── no-legacy-test-waiters.md │ ├── no-mixins.md │ ├── no-modifier-argument-destructuring.md │ ├── no-new-mixins.md │ ├── no-noop-setup-on-error-in-before.md │ ├── no-observers.md │ ├── no-old-shims.md │ ├── no-on-calls-in-components.md │ ├── no-pause-test.md │ ├── no-private-routing-service.md │ ├── no-proxies.md │ ├── no-replace-test-comments.md │ ├── no-restricted-property-modifications.md │ ├── no-restricted-resolver-tests.md │ ├── no-restricted-service-injections.md │ ├── no-runloop.md │ ├── no-settled-after-test-helper.md │ ├── no-shadow-route-definition.md │ ├── no-side-effects.md │ ├── no-string-prototype-extensions.md │ ├── no-test-and-then.md │ ├── no-test-import-export.md │ ├── no-test-module-for.md │ ├── no-test-support-import.md │ ├── no-test-this-render.md │ ├── no-tracked-built-ins.md │ ├── no-tracked-properties-from-args.md │ ├── no-try-invoke.md │ ├── no-unnecessary-index-route.md │ ├── no-unnecessary-route-path-option.md │ ├── no-unnecessary-service-injection-argument.md │ ├── no-unused-services.md │ ├── no-volatile-computed-properties.md │ ├── order-in-components.md │ ├── order-in-controllers.md │ ├── order-in-models.md │ ├── order-in-routes.md │ ├── prefer-ember-test-helpers.md │ ├── require-async-inverse-relationship.md │ ├── require-computed-macros.md │ ├── require-computed-property-dependencies.md │ ├── require-fetch-import.md │ ├── require-return-from-computed.md │ ├── require-super-in-lifecycle-hooks.md │ ├── require-tagless-components.md │ ├── require-valid-css-selector-in-test-helpers.md │ ├── route-path-style.md │ ├── routes-segments-snake-case.md │ ├── template-attribute-indentation.md │ ├── template-attribute-order.md │ ├── template-block-indentation.md │ ├── template-builtin-component-arguments.md │ ├── template-deprecated-inline-view-helper.md │ ├── template-deprecated-render-helper.md │ ├── template-eol-last.md │ ├── template-linebreak-style.md │ ├── template-link-href-attributes.md │ ├── template-link-rel-noopener.md │ ├── template-modifier-name-case.md │ ├── template-no-abstract-roles.md │ ├── template-no-accesskey-attribute.md │ ├── template-no-action-modifiers.md │ ├── template-no-action-on-submit-button.md │ ├── template-no-action.md │ ├── template-no-args-paths.md │ ├── template-no-arguments-for-html-elements.md │ ├── template-no-aria-hidden-body.md │ ├── template-no-aria-unsupported-elements.md │ ├── template-no-array-prototype-extensions.md │ ├── template-no-at-ember-render-modifiers.md │ ├── template-no-attrs-in-components.md │ ├── template-no-autofocus-attribute.md │ ├── template-no-bare-strings.md │ ├── template-no-bare-yield.md │ ├── template-no-block-params-for-html-elements.md │ ├── template-no-builtin-form-components.md │ ├── template-no-capital-arguments.md │ ├── template-no-chained-this.md │ ├── template-no-class-bindings.md │ ├── template-no-curly-component-invocation.md │ ├── template-no-debugger.md │ ├── template-no-deprecated.md │ ├── template-no-duplicate-attributes.md │ ├── template-no-duplicate-id.md │ ├── template-no-duplicate-landmark-elements.md │ ├── template-no-dynamic-subexpression-invocations.md │ ├── template-no-element-event-actions.md │ ├── template-no-empty-headings.md │ ├── template-no-extra-mut-helper-argument.md │ ├── template-no-forbidden-elements.md │ ├── template-no-heading-inside-button.md │ ├── template-no-html-comments.md │ ├── template-no-implicit-this.md │ ├── template-no-index-component-invocation.md │ ├── template-no-inline-event-handlers.md │ ├── template-no-inline-linkto.md │ ├── template-no-inline-styles.md │ ├── template-no-input-block.md │ ├── template-no-input-tagname.md │ ├── template-no-invalid-aria-attributes.md │ ├── template-no-invalid-interactive.md │ ├── template-no-invalid-link-text.md │ ├── template-no-invalid-link-title.md │ ├── template-no-invalid-meta.md │ ├── template-no-invalid-role.md │ ├── template-no-jsx-attributes.md │ ├── template-no-let-reference.md │ ├── template-no-link-to-positional-params.md │ ├── template-no-link-to-tagname.md │ ├── template-no-log.md │ ├── template-no-model-argument-in-route-templates.md │ ├── template-no-multiple-empty-lines.md │ ├── template-no-mut-helper.md │ ├── template-no-negated-condition.md │ ├── template-no-nested-interactive.md │ ├── template-no-nested-landmark.md │ ├── template-no-nested-splattributes.md │ ├── template-no-obscure-array-access.md │ ├── template-no-obsolete-elements.md │ ├── template-no-only-default-slot.md │ ├── template-no-outlet-outside-routes.md │ ├── template-no-page-title-component.md │ ├── template-no-passed-in-event-handlers.md │ ├── template-no-pointer-down-event-binding.md │ ├── template-no-positional-data-test-selectors.md │ ├── template-no-positive-tabindex.md │ ├── template-no-potential-path-strings.md │ ├── template-no-quoteless-attributes.md │ ├── template-no-redundant-fn.md │ ├── template-no-redundant-role.md │ ├── template-no-restricted-invocations.md │ ├── template-no-route-action.md │ ├── template-no-scope-outside-table-headings.md │ ├── template-no-shadowed-elements.md │ ├── template-no-splattributes-with-class.md │ ├── template-no-this-in-template-only-components.md │ ├── template-no-trailing-spaces.md │ ├── template-no-triple-curlies.md │ ├── template-no-unavailable-this.md │ ├── template-no-unbalanced-curlies.md │ ├── template-no-unbound.md │ ├── template-no-unknown-arguments-for-builtin-components.md │ ├── template-no-unnecessary-component-helper.md │ ├── template-no-unnecessary-concat.md │ ├── template-no-unnecessary-curly-parens.md │ ├── template-no-unnecessary-curly-strings.md │ ├── template-no-unsupported-role-attributes.md │ ├── template-no-unused-block-params.md │ ├── template-no-valueless-arguments.md │ ├── template-no-whitespace-for-layout.md │ ├── template-no-whitespace-within-word.md │ ├── template-no-with.md │ ├── template-no-yield-block-params-to-else-inverse.md │ ├── template-no-yield-only.md │ ├── template-no-yield-to-default.md │ ├── template-quotes.md │ ├── template-require-aria-activedescendant-tabindex.md │ ├── template-require-button-type.md │ ├── template-require-context-role.md │ ├── template-require-each-key.md │ ├── template-require-form-method.md │ ├── template-require-has-block-helper.md │ ├── template-require-iframe-src-attribute.md │ ├── template-require-iframe-title.md │ ├── template-require-input-label.md │ ├── template-require-input-type.md │ ├── template-require-lang-attribute.md │ ├── template-require-mandatory-role-attributes.md │ ├── template-require-media-caption.md │ ├── template-require-presentational-children.md │ ├── template-require-splattributes.md │ ├── template-require-strict-mode.md │ ├── template-require-valid-alt-text.md │ ├── template-require-valid-form-groups.md │ ├── template-require-valid-named-block-naming-format.md │ ├── template-self-closing-void-elements.md │ ├── template-simple-modifiers.md │ ├── template-simple-unless.md │ ├── template-sort-invocations.md │ ├── template-splat-attributes-only.md │ ├── template-style-concatenation.md │ ├── template-table-groups.md │ ├── template-template-length.md │ ├── use-brace-expansion.md │ ├── use-ember-data-rfc-395-imports.md │ └── use-ember-get-and-set.md ├── eslint-remote-tester.config.js ├── eslint.config.js ├── lib/ │ ├── config/ │ │ ├── base.js │ │ ├── recommended-gjs.js │ │ ├── recommended-gts.js │ │ ├── recommended.js │ │ └── template-lint-migration.js │ ├── config-legacy/ │ │ ├── base.js │ │ ├── recommended-gjs.js │ │ ├── recommended-gts.js │ │ ├── recommended.js │ │ └── template-lint-migration.js │ ├── index.js │ ├── recommended-rules-gjs.js │ ├── recommended-rules-gts.js │ ├── recommended-rules.js │ ├── recommended.mjs │ ├── rules/ │ │ ├── alias-model-in-controller.js │ │ ├── avoid-leaking-state-in-ember-objects.js │ │ ├── avoid-using-needs-in-controllers.js │ │ ├── classic-decorator-hooks.js │ │ ├── classic-decorator-no-classic-methods.js │ │ ├── closure-actions.js │ │ ├── computed-property-getters.js │ │ ├── jquery-ember-run.js │ │ ├── named-functions-in-promises.js │ │ ├── new-module-imports.js │ │ ├── no-actions-hash.js │ │ ├── no-array-prototype-extensions.js │ │ ├── no-arrow-function-computed-properties.js │ │ ├── no-assignment-of-untracked-properties-used-in-tracking-contexts.js │ │ ├── no-at-ember-render-modifiers.js │ │ ├── no-attrs-in-components.js │ │ ├── no-attrs-snapshot.js │ │ ├── no-builtin-form-components.js │ │ ├── no-capital-letters-in-routes.js │ │ ├── no-classic-classes.js │ │ ├── no-classic-components.js │ │ ├── no-component-lifecycle-hooks.js │ │ ├── no-computed-properties-in-native-classes.js │ │ ├── no-controller-access-in-routes.js │ │ ├── no-controllers.js │ │ ├── no-current-route-name.js │ │ ├── no-deeply-nested-dependent-keys-with-each.js │ │ ├── no-deprecated-router-transition-methods.js │ │ ├── no-duplicate-dependent-keys.js │ │ ├── no-ember-super-in-es-classes.js │ │ ├── no-ember-testing-in-module-scope.js │ │ ├── no-empty-attrs.js │ │ ├── no-empty-glimmer-component-classes.js │ │ ├── no-function-prototype-extensions.js │ │ ├── no-get-with-default.js │ │ ├── no-get.js │ │ ├── no-global-jquery.js │ │ ├── no-html-safe.js │ │ ├── no-implicit-injections.js │ │ ├── no-implicit-service-injection-argument.js │ │ ├── no-incorrect-calls-with-inline-anonymous-functions.js │ │ ├── no-incorrect-computed-macros.js │ │ ├── no-invalid-debug-function-arguments.js │ │ ├── no-invalid-dependent-keys.js │ │ ├── no-invalid-test-waiters.js │ │ ├── no-jquery.js │ │ ├── no-legacy-test-waiters.js │ │ ├── no-mixins.js │ │ ├── no-modifier-argument-destructuring.js │ │ ├── no-new-mixins.js │ │ ├── no-noop-setup-on-error-in-before.js │ │ ├── no-observers.js │ │ ├── no-old-shims.js │ │ ├── no-on-calls-in-components.js │ │ ├── no-pause-test.js │ │ ├── no-private-routing-service.js │ │ ├── no-proxies.js │ │ ├── no-replace-test-comments.js │ │ ├── no-restricted-property-modifications.js │ │ ├── no-restricted-resolver-tests.js │ │ ├── no-restricted-service-injections.js │ │ ├── no-runloop.js │ │ ├── no-settled-after-test-helper.js │ │ ├── no-shadow-route-definition.js │ │ ├── no-side-effects.js │ │ ├── no-string-prototype-extensions.js │ │ ├── no-test-and-then.js │ │ ├── no-test-import-export.js │ │ ├── no-test-module-for.js │ │ ├── no-test-support-import.js │ │ ├── no-test-this-render.js │ │ ├── no-tracked-built-ins.js │ │ ├── no-tracked-properties-from-args.js │ │ ├── no-try-invoke.js │ │ ├── no-unnecessary-index-route.js │ │ ├── no-unnecessary-route-path-option.js │ │ ├── no-unnecessary-service-injection-argument.js │ │ ├── no-unused-services.js │ │ ├── no-volatile-computed-properties.js │ │ ├── order-in-components.js │ │ ├── order-in-controllers.js │ │ ├── order-in-models.js │ │ ├── order-in-routes.js │ │ ├── prefer-ember-test-helpers.js │ │ ├── require-async-inverse-relationship.js │ │ ├── require-computed-macros.js │ │ ├── require-computed-property-dependencies.js │ │ ├── require-fetch-import.js │ │ ├── require-return-from-computed.js │ │ ├── require-super-in-lifecycle-hooks.js │ │ ├── require-tagless-components.js │ │ ├── require-valid-css-selector-in-test-helpers.js │ │ ├── route-path-style.js │ │ ├── routes-segments-snake-case.js │ │ ├── template-attribute-indentation.js │ │ ├── template-attribute-order.js │ │ ├── template-block-indentation.js │ │ ├── template-builtin-component-arguments.js │ │ ├── template-deprecated-inline-view-helper.js │ │ ├── template-deprecated-render-helper.js │ │ ├── template-eol-last.js │ │ ├── template-linebreak-style.js │ │ ├── template-link-href-attributes.js │ │ ├── template-link-rel-noopener.js │ │ ├── template-modifier-name-case.js │ │ ├── template-no-abstract-roles.js │ │ ├── template-no-accesskey-attribute.js │ │ ├── template-no-action-modifiers.js │ │ ├── template-no-action-on-submit-button.js │ │ ├── template-no-action.js │ │ ├── template-no-args-paths.js │ │ ├── template-no-arguments-for-html-elements.js │ │ ├── template-no-aria-hidden-body.js │ │ ├── template-no-aria-unsupported-elements.js │ │ ├── template-no-array-prototype-extensions.js │ │ ├── template-no-at-ember-render-modifiers.js │ │ ├── template-no-attrs-in-components.js │ │ ├── template-no-autofocus-attribute.js │ │ ├── template-no-bare-strings.js │ │ ├── template-no-bare-yield.js │ │ ├── template-no-block-params-for-html-elements.js │ │ ├── template-no-builtin-form-components.js │ │ ├── template-no-capital-arguments.js │ │ ├── template-no-chained-this.js │ │ ├── template-no-class-bindings.js │ │ ├── template-no-curly-component-invocation.js │ │ ├── template-no-debugger.js │ │ ├── template-no-deprecated.js │ │ ├── template-no-duplicate-attributes.js │ │ ├── template-no-duplicate-id.js │ │ ├── template-no-duplicate-landmark-elements.js │ │ ├── template-no-dynamic-subexpression-invocations.js │ │ ├── template-no-element-event-actions.js │ │ ├── template-no-empty-headings.js │ │ ├── template-no-extra-mut-helper-argument.js │ │ ├── template-no-forbidden-elements.js │ │ ├── template-no-heading-inside-button.js │ │ ├── template-no-html-comments.js │ │ ├── template-no-implicit-this.js │ │ ├── template-no-index-component-invocation.js │ │ ├── template-no-inline-event-handlers.js │ │ ├── template-no-inline-linkto.js │ │ ├── template-no-inline-styles.js │ │ ├── template-no-input-block.js │ │ ├── template-no-input-tagname.js │ │ ├── template-no-invalid-aria-attributes.js │ │ ├── template-no-invalid-interactive.js │ │ ├── template-no-invalid-link-text.js │ │ ├── template-no-invalid-link-title.js │ │ ├── template-no-invalid-meta.js │ │ ├── template-no-invalid-role.js │ │ ├── template-no-jsx-attributes.js │ │ ├── template-no-let-reference.js │ │ ├── template-no-link-to-positional-params.js │ │ ├── template-no-link-to-tagname.js │ │ ├── template-no-log.js │ │ ├── template-no-model-argument-in-route-templates.js │ │ ├── template-no-multiple-empty-lines.js │ │ ├── template-no-mut-helper.js │ │ ├── template-no-negated-condition.js │ │ ├── template-no-nested-interactive.js │ │ ├── template-no-nested-landmark.js │ │ ├── template-no-nested-splattributes.js │ │ ├── template-no-obscure-array-access.js │ │ ├── template-no-obsolete-elements.js │ │ ├── template-no-only-default-slot.js │ │ ├── template-no-outlet-outside-routes.js │ │ ├── template-no-page-title-component.js │ │ ├── template-no-passed-in-event-handlers.js │ │ ├── template-no-pointer-down-event-binding.js │ │ ├── template-no-positional-data-test-selectors.js │ │ ├── template-no-positive-tabindex.js │ │ ├── template-no-potential-path-strings.js │ │ ├── template-no-quoteless-attributes.js │ │ ├── template-no-redundant-fn.js │ │ ├── template-no-redundant-role.js │ │ ├── template-no-restricted-invocations.js │ │ ├── template-no-route-action.js │ │ ├── template-no-scope-outside-table-headings.js │ │ ├── template-no-shadowed-elements.js │ │ ├── template-no-splattributes-with-class.js │ │ ├── template-no-this-in-template-only-components.js │ │ ├── template-no-trailing-spaces.js │ │ ├── template-no-triple-curlies.js │ │ ├── template-no-unavailable-this.js │ │ ├── template-no-unbalanced-curlies.js │ │ ├── template-no-unbound.js │ │ ├── template-no-unknown-arguments-for-builtin-components.js │ │ ├── template-no-unnecessary-component-helper.js │ │ ├── template-no-unnecessary-concat.js │ │ ├── template-no-unnecessary-curly-parens.js │ │ ├── template-no-unnecessary-curly-strings.js │ │ ├── template-no-unsupported-role-attributes.js │ │ ├── template-no-unused-block-params.js │ │ ├── template-no-valueless-arguments.js │ │ ├── template-no-whitespace-for-layout.js │ │ ├── template-no-whitespace-within-word.js │ │ ├── template-no-with.js │ │ ├── template-no-yield-block-params-to-else-inverse.js │ │ ├── template-no-yield-only.js │ │ ├── template-no-yield-to-default.js │ │ ├── template-quotes.js │ │ ├── template-require-aria-activedescendant-tabindex.js │ │ ├── template-require-button-type.js │ │ ├── template-require-context-role.js │ │ ├── template-require-each-key.js │ │ ├── template-require-form-method.js │ │ ├── template-require-has-block-helper.js │ │ ├── template-require-iframe-src-attribute.js │ │ ├── template-require-iframe-title.js │ │ ├── template-require-input-label.js │ │ ├── template-require-input-type.js │ │ ├── template-require-lang-attribute.js │ │ ├── template-require-mandatory-role-attributes.js │ │ ├── template-require-media-caption.js │ │ ├── template-require-presentational-children.js │ │ ├── template-require-splattributes.js │ │ ├── template-require-strict-mode.js │ │ ├── template-require-valid-alt-text.js │ │ ├── template-require-valid-form-groups.js │ │ ├── template-require-valid-named-block-naming-format.js │ │ ├── template-self-closing-void-elements.js │ │ ├── template-simple-modifiers.js │ │ ├── template-simple-unless.js │ │ ├── template-sort-invocations.js │ │ ├── template-splat-attributes-only.js │ │ ├── template-style-concatenation.js │ │ ├── template-table-groups.js │ │ ├── template-template-length.js │ │ ├── use-brace-expansion.js │ │ ├── use-ember-data-rfc-395-imports.js │ │ └── use-ember-get-and-set.js │ └── utils/ │ ├── computed-properties.js │ ├── computed-property-dependent-keys.js │ ├── computed-property-macros.js │ ├── decorators.js │ ├── editorconfig.js │ ├── ember-source-version.js │ ├── ember.js │ ├── fixer.js │ ├── html-interactive-content.js │ ├── import.js │ ├── interactive-roles.js │ ├── is-native-element.js │ ├── javascript.js │ ├── jquery-methods.js │ ├── jquery.js │ ├── landmark-roles.js │ ├── new-module.js │ ├── property-getter.js │ ├── property-order.js │ ├── property-setter.js │ ├── scope-references-this.js │ ├── stack.js │ ├── static-attr-value.js │ ├── types.js │ └── utils.js ├── package.json ├── scripts/ │ ├── bench-compare.mjs │ ├── bench-utils.mjs │ ├── format-bench-cli.mjs │ ├── format-bench-comment.mjs │ ├── list-jquery-methods.js │ ├── local-bench-summary.sh │ ├── run-bench.sh │ └── update-rules.js ├── tests/ │ ├── __snapshots__/ │ │ └── recommended.js.snap │ ├── bench/ │ │ ├── large.gjs │ │ ├── large.gts │ │ ├── large.js │ │ ├── medium.gjs │ │ ├── medium.gts │ │ ├── medium.js │ │ ├── small.gjs │ │ ├── small.gts │ │ └── small.js │ ├── config-setup.js │ ├── fixtures/ │ │ └── template-no-this-in-template-only-components/ │ │ └── app/ │ │ └── components/ │ │ ├── classic-with-class.js │ │ ├── with-class.js │ │ └── with-ts-class.ts │ ├── helpers/ │ │ ├── babel-eslint-parser.js │ │ ├── faux-context.js │ │ └── test-case.js │ ├── lib/ │ │ ├── eslint-directive-comments-test.js │ │ ├── rules/ │ │ │ ├── alias-model-in-controller.js │ │ │ ├── avoid-leaking-state-in-ember-objects.js │ │ │ ├── avoid-using-needs-in-controllers.js │ │ │ ├── classic-decorator-hooks.js │ │ │ ├── classic-decorator-no-classic-methods.js │ │ │ ├── closure-actions.js │ │ │ ├── computed-property-getters.js │ │ │ ├── jquery-ember-run.js │ │ │ ├── named-functions-in-promises.js │ │ │ ├── new-module-imports.js │ │ │ ├── no-actions-hash.js │ │ │ ├── no-array-prototype-extensions.js │ │ │ ├── no-arrow-function-computed-properties.js │ │ │ ├── no-assignment-of-untracked-properties-used-in-tracking-contexts.js │ │ │ ├── no-at-ember-render-modifiers.js │ │ │ ├── no-attrs-in-components.js │ │ │ ├── no-attrs-snapshot.js │ │ │ ├── no-builtin-form-components.js │ │ │ ├── no-capital-letters-in-routes.js │ │ │ ├── no-classic-classes.js │ │ │ ├── no-classic-components.js │ │ │ ├── no-component-lifecycle-hooks.js │ │ │ ├── no-computed-properties-in-native-classes.js │ │ │ ├── no-controller-access-in-routes.js │ │ │ ├── no-controllers.js │ │ │ ├── no-current-route-name.js │ │ │ ├── no-deeply-nested-dependent-keys-with-each.js │ │ │ ├── no-deprecated-router-transition-methods.js │ │ │ ├── no-duplicate-dependent-keys.js │ │ │ ├── no-ember-super-in-es-classes.js │ │ │ ├── no-ember-testing-in-module-scope.js │ │ │ ├── no-empty-attrs.js │ │ │ ├── no-empty-glimmer-component-classes.js │ │ │ ├── no-function-prototype-extensions.js │ │ │ ├── no-get-with-default.js │ │ │ ├── no-get.js │ │ │ ├── no-global-jquery.js │ │ │ ├── no-html-safe.js │ │ │ ├── no-implicit-injections.js │ │ │ ├── no-implicit-service-injection-argument.js │ │ │ ├── no-incorrect-calls-with-inline-anonymous-functions.js │ │ │ ├── no-incorrect-computed-macros.js │ │ │ ├── no-invalid-debug-function-arguments.js │ │ │ ├── no-invalid-dependent-keys.js │ │ │ ├── no-invalid-test-waiters.js │ │ │ ├── no-jquery.js │ │ │ ├── no-legacy-test-waiters.js │ │ │ ├── no-mixins.js │ │ │ ├── no-modifier-argument-destructuring.js │ │ │ ├── no-new-mixins.js │ │ │ ├── no-noop-setup-on-error-in-before.js │ │ │ ├── no-observers.js │ │ │ ├── no-old-shims.js │ │ │ ├── no-on-calls-in-components.js │ │ │ ├── no-pause-test.js │ │ │ ├── no-private-routing-service.js │ │ │ ├── no-proxies.js │ │ │ ├── no-replace-test-comments.js │ │ │ ├── no-restricted-property-modifications.js │ │ │ ├── no-restricted-resolver-tests.js │ │ │ ├── no-restricted-service-injections.js │ │ │ ├── no-runloop.js │ │ │ ├── no-settled-after-test-helper.js │ │ │ ├── no-shadow-route-definition.js │ │ │ ├── no-side-effects.js │ │ │ ├── no-string-prototype-extensions.js │ │ │ ├── no-test-and-then.js │ │ │ ├── no-test-import-export.js │ │ │ ├── no-test-module-for.js │ │ │ ├── no-test-support-import.js │ │ │ ├── no-test-this-render.js │ │ │ ├── no-tracked-built-ins.js │ │ │ ├── no-tracked-properties-from-args.js │ │ │ ├── no-try-invoke.js │ │ │ ├── no-unnecessary-index-route.js │ │ │ ├── no-unnecessary-route-path-option.js │ │ │ ├── no-unnecessary-service-injection-argument.js │ │ │ ├── no-unused-services.js │ │ │ ├── no-volatile-computed-properties.js │ │ │ ├── order-in-components.js │ │ │ ├── order-in-controllers.js │ │ │ ├── order-in-models.js │ │ │ ├── order-in-routes.js │ │ │ ├── prefer-ember-test-helpers.js │ │ │ ├── require-async-inverse-relationship.js │ │ │ ├── require-computed-macros.js │ │ │ ├── require-computed-property-dependencies.js │ │ │ ├── require-fetch-import.js │ │ │ ├── require-return-from-computed.js │ │ │ ├── require-super-in-lifecycle-hooks.js │ │ │ ├── require-tagless-components.js │ │ │ ├── require-valid-css-selector-in-test-helpers.js │ │ │ ├── route-path-style.js │ │ │ ├── routes-segments-snake-case.js │ │ │ ├── template-attribute-indentation.js │ │ │ ├── template-attribute-order.js │ │ │ ├── template-block-indentation.js │ │ │ ├── template-builtin-component-arguments.js │ │ │ ├── template-deprecated-inline-view-helper.js │ │ │ ├── template-deprecated-render-helper.js │ │ │ ├── template-eol-last.js │ │ │ ├── template-linebreak-style.js │ │ │ ├── template-link-href-attributes.js │ │ │ ├── template-link-rel-noopener.js │ │ │ ├── template-modifier-name-case.js │ │ │ ├── template-no-abstract-roles.js │ │ │ ├── template-no-accesskey-attribute.js │ │ │ ├── template-no-action-modifiers.js │ │ │ ├── template-no-action-on-submit-button.js │ │ │ ├── template-no-action.js │ │ │ ├── template-no-args-paths.js │ │ │ ├── template-no-arguments-for-html-elements.js │ │ │ ├── template-no-aria-hidden-body.js │ │ │ ├── template-no-aria-unsupported-elements.js │ │ │ ├── template-no-array-prototype-extensions.js │ │ │ ├── template-no-at-ember-render-modifiers.js │ │ │ ├── template-no-attrs-in-components.js │ │ │ ├── template-no-autofocus-attribute.js │ │ │ ├── template-no-bare-strings.js │ │ │ ├── template-no-bare-yield.js │ │ │ ├── template-no-block-params-for-html-elements.js │ │ │ ├── template-no-builtin-form-components.js │ │ │ ├── template-no-capital-arguments.js │ │ │ ├── template-no-chained-this.js │ │ │ ├── template-no-class-bindings.js │ │ │ ├── template-no-curly-component-invocation.js │ │ │ ├── template-no-debugger.js │ │ │ ├── template-no-deprecated.js │ │ │ ├── template-no-duplicate-attributes.js │ │ │ ├── template-no-duplicate-id.js │ │ │ ├── template-no-duplicate-landmark-elements.js │ │ │ ├── template-no-dynamic-subexpression-invocations.js │ │ │ ├── template-no-element-event-actions.js │ │ │ ├── template-no-empty-headings.js │ │ │ ├── template-no-extra-mut-helper-argument.js │ │ │ ├── template-no-forbidden-elements.js │ │ │ ├── template-no-heading-inside-button.js │ │ │ ├── template-no-html-comments.js │ │ │ ├── template-no-implicit-this.js │ │ │ ├── template-no-index-component-invocation.js │ │ │ ├── template-no-inline-event-handlers.js │ │ │ ├── template-no-inline-linkto.js │ │ │ ├── template-no-inline-styles.js │ │ │ ├── template-no-input-block.js │ │ │ ├── template-no-input-tagname.js │ │ │ ├── template-no-invalid-aria-attributes.js │ │ │ ├── template-no-invalid-interactive.js │ │ │ ├── template-no-invalid-link-text.js │ │ │ ├── template-no-invalid-link-title.js │ │ │ ├── template-no-invalid-meta.js │ │ │ ├── template-no-invalid-role.js │ │ │ ├── template-no-jsx-attributes.js │ │ │ ├── template-no-let-reference.js │ │ │ ├── template-no-link-to-positional-params.js │ │ │ ├── template-no-link-to-tagname.js │ │ │ ├── template-no-log.js │ │ │ ├── template-no-model-argument-in-route-templates.js │ │ │ ├── template-no-multiple-empty-lines.js │ │ │ ├── template-no-mut-helper.js │ │ │ ├── template-no-negated-condition.js │ │ │ ├── template-no-nested-interactive.js │ │ │ ├── template-no-nested-landmark.js │ │ │ ├── template-no-nested-splattributes.js │ │ │ ├── template-no-obscure-array-access.js │ │ │ ├── template-no-obsolete-elements.js │ │ │ ├── template-no-only-default-slot.js │ │ │ ├── template-no-outlet-outside-routes.js │ │ │ ├── template-no-page-title-component.js │ │ │ ├── template-no-passed-in-event-handlers.js │ │ │ ├── template-no-pointer-down-event-binding.js │ │ │ ├── template-no-positional-data-test-selectors.js │ │ │ ├── template-no-positive-tabindex.js │ │ │ ├── template-no-potential-path-strings.js │ │ │ ├── template-no-quoteless-attributes.js │ │ │ ├── template-no-redundant-fn.js │ │ │ ├── template-no-redundant-role.js │ │ │ ├── template-no-restricted-invocations.js │ │ │ ├── template-no-route-action.js │ │ │ ├── template-no-scope-outside-table-headings.js │ │ │ ├── template-no-shadowed-elements.js │ │ │ ├── template-no-splattributes-with-class.js │ │ │ ├── template-no-this-in-template-only-components.js │ │ │ ├── template-no-trailing-spaces.js │ │ │ ├── template-no-triple-curlies.js │ │ │ ├── template-no-unavailable-this.js │ │ │ ├── template-no-unbalanced-curlies.js │ │ │ ├── template-no-unbound.js │ │ │ ├── template-no-unknown-arguments-for-builtin-components.js │ │ │ ├── template-no-unnecessary-component-helper.js │ │ │ ├── template-no-unnecessary-concat.js │ │ │ ├── template-no-unnecessary-curly-parens.js │ │ │ ├── template-no-unnecessary-curly-strings.js │ │ │ ├── template-no-unsupported-role-attributes.js │ │ │ ├── template-no-unused-block-params.js │ │ │ ├── template-no-valueless-arguments.js │ │ │ ├── template-no-whitespace-for-layout.js │ │ │ ├── template-no-whitespace-within-word.js │ │ │ ├── template-no-with.js │ │ │ ├── template-no-yield-block-params-to-else-inverse.js │ │ │ ├── template-no-yield-only.js │ │ │ ├── template-no-yield-to-default.js │ │ │ ├── template-quotes.js │ │ │ ├── template-require-aria-activedescendant-tabindex.js │ │ │ ├── template-require-button-type.js │ │ │ ├── template-require-context-role.js │ │ │ ├── template-require-each-key.js │ │ │ ├── template-require-form-method.js │ │ │ ├── template-require-has-block-helper.js │ │ │ ├── template-require-iframe-src-attribute.js │ │ │ ├── template-require-iframe-title.js │ │ │ ├── template-require-input-label.js │ │ │ ├── template-require-input-type.js │ │ │ ├── template-require-lang-attribute.js │ │ │ ├── template-require-mandatory-role-attributes.js │ │ │ ├── template-require-media-caption.js │ │ │ ├── template-require-presentational-children.js │ │ │ ├── template-require-splattributes.js │ │ │ ├── template-require-strict-mode.js │ │ │ ├── template-require-valid-alt-text.js │ │ │ ├── template-require-valid-form-groups.js │ │ │ ├── template-require-valid-named-block-naming-format.js │ │ │ ├── template-self-closing-void-elements.js │ │ │ ├── template-simple-modifiers.js │ │ │ ├── template-simple-unless.js │ │ │ ├── template-sort-invocations.js │ │ │ ├── template-splat-attributes-only.js │ │ │ ├── template-style-concatenation.js │ │ │ ├── template-table-groups.js │ │ │ ├── template-template-length.js │ │ │ ├── use-brace-expansion.js │ │ │ ├── use-ember-data-rfc-395-imports.js │ │ │ └── use-ember-get-and-set.js │ │ ├── rules-preprocessor/ │ │ │ ├── ember_ts/ │ │ │ │ ├── bar.gts │ │ │ │ ├── baz.ts │ │ │ │ └── foo.gts │ │ │ ├── gjs-gts-parser-test.js │ │ │ ├── my-component.gts │ │ │ ├── template-no-deprecated/ │ │ │ │ ├── component-stub.ts │ │ │ │ ├── component-with-args.ts │ │ │ │ ├── current-component.ts │ │ │ │ ├── deprecated-component.ts │ │ │ │ ├── deprecated-helper.ts │ │ │ │ └── usage.gts │ │ │ └── tsconfig.eslint.json │ │ └── utils/ │ │ ├── computed-properties-test.js │ │ ├── computed-property-dependent-keys-test.js │ │ ├── computed-property-macros-test.js │ │ ├── decorators-test.js │ │ ├── editorconfig-test.js │ │ ├── ember-source-version-test.js │ │ ├── ember-test.js │ │ ├── html-interactive-content-test.js │ │ ├── import-test.js │ │ ├── interactive-roles-test.js │ │ ├── is-native-element-test.js │ │ ├── javascript-test.js │ │ ├── landmark-roles-test.js │ │ ├── new-module-test.js │ │ ├── property-getter-test.js │ │ ├── property-order-test.js │ │ ├── property-setter-test.js │ │ ├── scope-references-this-test.js │ │ ├── static-attr-value-test.js │ │ ├── types-test.js │ │ ├── utils/ │ │ │ └── get-source-module-name-for-identifier-test.js │ │ └── utils-test.js │ ├── lint.bench.mjs │ ├── plugin-exports.js │ ├── recommended.js │ └── rule-setup.js └── vitest.config.mjs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "plugins": [ "@babel/plugin-proposal-class-properties", ["@babel/plugin-proposal-decorators", { "decoratorsBeforeExport": true }] ] } ================================================ FILE: .editorconfig ================================================ # EditorConfig helps developers define and maintain consistent # coding styles between different editors and IDEs # editorconfig.org root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 2 [*.{diff,md}] trim_trailing_whitespace = false ================================================ FILE: .eslint-doc-generatorrc.js ================================================ const path = require('path'); const HBS_ONLY_NOTE = '> **HBS Only**: This rule applies to classic `.hbs` template files only (loose mode). It is not relevant for `gjs`/`gts` files (strict mode), where these patterns cannot occur.'; const END_HEADER_MARKER = ''; /** @type {import('eslint-doc-generator').GenerateOptions} */ module.exports = { configEmoji: [ ['recommended-gjs', '![gjs logo](/docs/svgs/gjs.svg)'], ['recommended-gts', '![gts logo](/docs/svgs/gts.svg)'], ['template-lint-migration', '📋'], ], ruleDocSectionInclude: ['Examples'], ruleDocTitleFormat: 'prefix-name', ruleListSplit: 'meta.docs.category', urlConfigs: 'https://github.com/ember-cli/eslint-plugin-ember#-configurations', postprocess(content, filePath) { // Only process rule doc files if (!filePath.includes(path.join('docs', 'rules'))) { return content; } const ruleName = path.basename(filePath, '.md'); let rule; try { rule = require(path.join(__dirname, 'lib', 'rules', ruleName)); } catch { return content; } // Strip any existing HBS Only note (with surrounding blank lines) let result = content.replace(/\n> \*\*HBS Only\*\*:[^\n]+\n/, '\n'); // Add HBS Only note for loose-mode rules if (rule.meta?.docs?.templateMode === 'loose') { result = result.replace(END_HEADER_MARKER, `${HBS_ONLY_NOTE}\n\n${END_HEADER_MARKER}`); } return result; }, }; ================================================ FILE: .gitattributes ================================================ * text=auto eol=lf ================================================ FILE: .github/renovate.json5 ================================================ // Docs: // https://docs.renovatebot.com/configuration-options/ { "extends": [ "github>NullVoxPopuli/renovate:npm.json5" ] } ================================================ FILE: .github/workflows/bench-compare.yml ================================================ name: Benchmark Comparison on: pull_request: types: [opened, synchronize, reopened] concurrency: group: bench-${{ github.head_ref }} cancel-in-progress: true jobs: bench-compare: name: 'Benchmark Comparison' runs-on: ubuntu-latest permissions: pull-requests: write contents: read steps: - uses: actions/checkout@v6 id: checkout with: # Full history so the script can git-archive the base branch. fetch-depth: 0 # Use the PR head SHA so fork PRs resolve correctly # (github.head_ref is a branch name that only exists on the fork remote). ref: ${{ github.event.pull_request.head.sha }} - uses: wyvox/action-setup-pnpm@v4 - name: Run benchmark comparison env: BENCH_JSON_OUTPUT: ${{ runner.temp }}/bench-results.json run: | set -o pipefail pnpm bench:compare | sed 's/\x1b\[[0-9;]*m//g' > "$RUNNER_TEMP/bench-output.txt" - name: Format PR comment if: always() && steps.checkout.outcome == 'success' env: BENCH_OUTPUT_FILE: ${{ runner.temp }}/bench-output.txt BENCH_JSON_OUTPUT: ${{ runner.temp }}/bench-results.json BENCH_JOB_SUCCESS: ${{ job.status == 'success' }} run: node scripts/format-bench-comment.mjs > "$RUNNER_TEMP/bench-comment.md" - name: Write job summary if: always() && steps.checkout.outcome == 'success' run: cat "$RUNNER_TEMP/bench-comment.md" >> "$GITHUB_STEP_SUMMARY" - name: Post PR comment if: always() && steps.checkout.outcome == 'success' uses: actions/github-script@v9 with: script: | const fs = require('fs'); const marker = ''; const body = fs.readFileSync(process.env.RUNNER_TEMP + '/bench-comment.md', 'utf8'); const headFullName = context.payload.pull_request?.head?.repo?.full_name; const isFork = !headFullName || headFullName !== context.repo.owner + '/' + context.repo.repo; if (isFork) { core.info('PR is from a fork — skipping PR comment (results are in the job summary).'); core.info('--- Comment body start ---'); core.info(body); core.info('--- Comment body end ---'); } else { const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, }); const existing = comments.find(c => c.body.includes(marker)); if (existing) { await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: existing.id, body, }); } else { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body, }); } } ================================================ FILE: .github/workflows/ci.yml ================================================ # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: self-lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: pnpm/action-setup@v5 with: run_install: false - uses: actions/setup-node@v6 with: node-version: 24.x cache: 'pnpm' - run: pnpm install - run: pnpm lint build: runs-on: ${{ matrix.os }}-latest strategy: matrix: os: [ ubuntu, windows ] node-version: [20.x, 22.x, 24.x] steps: - uses: actions/checkout@v6 - uses: pnpm/action-setup@v5 with: run_install: false - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: 'pnpm' - run: pnpm install - run: pnpm test:coverage ================================================ FILE: .github/workflows/codeql-analysis.yml ================================================ # For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ master ] pull_request: # The branches below must be a subset of the branches above branches: [ master ] schedule: - cron: '18 9 * * 2' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'javascript' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - name: Checkout repository uses: actions/checkout@v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v4 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 ================================================ FILE: .github/workflows/plan-release.yml ================================================ name: Plan Release on: workflow_dispatch: push: branches: - main - master pull_request_target: # This workflow has permissions on the repo, do NOT run code from PRs in this workflow. See https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ types: - labeled - unlabeled concurrency: group: plan-release # only the latest one of these should ever be running cancel-in-progress: true jobs: should-run-release-plan-prepare: name: Should we run release-plan prepare? runs-on: ubuntu-latest outputs: should-prepare: ${{ steps.should-prepare.outputs.should-prepare }} steps: - uses: release-plan/actions/should-prepare-release@v1 with: ref: 'master' id: should-prepare create-prepare-release-pr: name: Create Prepare Release PR runs-on: ubuntu-latest timeout-minutes: 5 needs: should-run-release-plan-prepare permissions: contents: write issues: read pull-requests: write if: needs.should-run-release-plan-prepare.outputs.should-prepare == 'true' steps: - uses: release-plan/actions/prepare@v1 name: Run release-plan prepare with: ref: 'master' env: GITHUB_AUTH: ${{ secrets.GITHUB_TOKEN }} id: explanation - uses: peter-evans/create-pull-request@v8 name: Create Prepare Release PR with: commit-message: "Prepare Release ${{ steps.explanation.outputs.new-version}} using 'release-plan'" labels: "internal" sign-commits: true branch: release-preview title: Prepare Release ${{ steps.explanation.outputs.new-version }} body: | This PR is a preview of the release that [release-plan](https://github.com/embroider-build/release-plan) has prepared. To release you should just merge this PR 👍 ----------------------------------------- ${{ steps.explanation.outputs.text }} ================================================ FILE: .github/workflows/publish.yml ================================================ # For every push to the primary branch with .release-plan.json modified, # runs release-plan. name: Publish Stable on: workflow_dispatch: push: branches: - main - master paths: - '.release-plan.json' concurrency: group: publish-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: publish: name: "NPM Publish" runs-on: ubuntu-latest permissions: contents: write id-token: write attestations: write steps: - uses: actions/checkout@v6 - uses: pnpm/action-setup@v5 - uses: actions/setup-node@v6 with: node-version: 24 registry-url: 'https://registry.npmjs.org' cache: pnpm - run: pnpm install --frozen-lockfile - run: npm install -g npm@latest # ensure that the globally installed npm is new enough to support OIDC - name: Publish to NPM run: NPM_CONFIG_PROVENANCE=true pnpm release-plan publish env: GITHUB_AUTH: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ # Logs logs *.log # Dependencies node_modules # Misc .eslintcache coverage npm-debug.log *.swp .vscode # eslint-remote-tester eslint-remote-tester-results # Benchmark output bench-results.json # Lock file generated by npm install (project uses pnpm) package-lock.json ================================================ FILE: .markdownlint.json ================================================ { "line-length": false, "table-column-style": false, "ul-style": { "style": "dash" } } ================================================ FILE: .markdownlintignore ================================================ CHANGELOG.md LICENSE.md node_modules ================================================ FILE: .npmpackagejsonlintrc.json ================================================ { "rules": { "no-duplicate-properties": "error", "no-repeated-dependencies": "error", "prefer-alphabetical-bundledDependencies": "error", "prefer-alphabetical-dependencies": "error", "prefer-alphabetical-devDependencies": "error", "prefer-alphabetical-optionalDependencies": "error", "prefer-alphabetical-scripts": "error", "prefer-caret-version-dependencies": "error", "prefer-caret-version-devDependencies": "error", "prefer-scripts": ["error", ["lint", "test"]] } } ================================================ FILE: .npmrc ================================================ # npm / pnpm settings here # as a library, we want to make sure we explicitly handle peers, # and not rely on hidden behavior of package-managers. auto-install-peers=false strict-peer-dependents=true dedupe-peer-dependents=true prefer-workspaces-packages=true resolve-peers-from-workspace-root=false ================================================ FILE: .prettierignore ================================================ node_modules/ dist/ lib/recommended-rules.js CHANGELOG.md README.md pnpm-lock.yaml .github/* ================================================ FILE: .prettierrc.js ================================================ 'use strict'; module.exports = { printWidth: 100, semi: true, singleQuote: true, trailingComma: 'es5', }; ================================================ FILE: .release-plan.json ================================================ { "solution": { "eslint-plugin-ember": { "impact": "patch", "oldVersion": "13.2.0", "newVersion": "13.2.1", "tagName": "latest", "constraints": [ { "impact": "patch", "reason": "Appears in changelog section :bug: Bug Fix" }, { "impact": "patch", "reason": "Appears in changelog section :house: Internal" } ], "pkgJSONPath": "./package.json" } }, "description": "## Release (2026-04-30)\n\n* eslint-plugin-ember 13.2.1 (patch)\n\n#### :bug: Bug Fix\n* `eslint-plugin-ember`\n * [#2767](https://github.com/ember-cli/eslint-plugin-ember/pull/2767) fix(require-input-label): don't count id as extra label when aria-label/labelledby present ([@johanrd](https://github.com/johanrd))\n * [#2772](https://github.com/ember-cli/eslint-plugin-ember/pull/2772) fix(template-no-nested-interactive): More useful error message ([@johanrd](https://github.com/johanrd))\n\n#### :house: Internal\n* `eslint-plugin-ember`\n * [#2758](https://github.com/ember-cli/eslint-plugin-ember/pull/2758) refactor: extract landmark-roles util (preserving deliberate per-rule region exclusion) ([@johanrd](https://github.com/johanrd))\n * [#2753](https://github.com/ember-cli/eslint-plugin-ember/pull/2753) test(no-nested-interactive): add composite-widget hierarchy valid cases ([@johanrd](https://github.com/johanrd))\n\n#### Committers: 1\n- Johan Røed ([@johanrd](https://github.com/johanrd))\n" } ================================================ FILE: CHANGELOG.md ================================================ # Changelog ## Release (2026-04-30) * eslint-plugin-ember 13.2.1 (patch) #### :bug: Bug Fix * `eslint-plugin-ember` * [#2767](https://github.com/ember-cli/eslint-plugin-ember/pull/2767) fix(require-input-label): don't count id as extra label when aria-label/labelledby present ([@johanrd](https://github.com/johanrd)) * [#2772](https://github.com/ember-cli/eslint-plugin-ember/pull/2772) fix(template-no-nested-interactive): More useful error message ([@johanrd](https://github.com/johanrd)) #### :house: Internal * `eslint-plugin-ember` * [#2758](https://github.com/ember-cli/eslint-plugin-ember/pull/2758) refactor: extract landmark-roles util (preserving deliberate per-rule region exclusion) ([@johanrd](https://github.com/johanrd)) * [#2753](https://github.com/ember-cli/eslint-plugin-ember/pull/2753) test(no-nested-interactive): add composite-widget hierarchy valid cases ([@johanrd](https://github.com/johanrd)) #### Committers: 1 - Johan Røed ([@johanrd](https://github.com/johanrd)) ## Release (2026-04-28) * eslint-plugin-ember 13.2.0 (minor) #### :rocket: Enhancement * `eslint-plugin-ember` * [#2763](https://github.com/ember-cli/eslint-plugin-ember/pull/2763) feat: add template-require-input-type ([@johanrd](https://github.com/johanrd)) #### :bug: Bug Fix * `eslint-plugin-ember` * [#2766](https://github.com/ember-cli/eslint-plugin-ember/pull/2766) Update parser ([@NullVoxPopuli](https://github.com/NullVoxPopuli)) #### Committers: 2 - [@NullVoxPopuli](https://github.com/NullVoxPopuli) - [@johanrd](https://github.com/johanrd) ## Release (2026-04-27) * eslint-plugin-ember 13.1.4 (patch) #### :bug: Bug Fix * `eslint-plugin-ember` * [#2752](https://github.com/ember-cli/eslint-plugin-ember/pull/2752) Update ember-eslint-parser to 0.11.2 ([@NullVoxPopuli](https://github.com/NullVoxPopuli)) * [#2728](https://github.com/ember-cli/eslint-plugin-ember/pull/2728) BUGFIX: template-require-mandatory-role-attributes — lowercase role + split whitespace role lists ([@johanrd](https://github.com/johanrd)) #### :house: Internal * `eslint-plugin-ember` * [#2748](https://github.com/ember-cli/eslint-plugin-ember/pull/2748) refactor: extract `html-interactive-content` util (HTML §3.2.5.2.7 authority) ([@johanrd](https://github.com/johanrd)) #### Committers: 2 - [@NullVoxPopuli](https://github.com/NullVoxPopuli) - [@johanrd](https://github.com/johanrd) ## Release (2026-04-25) * eslint-plugin-ember 13.1.3 (patch) #### :bug: Bug Fix * `eslint-plugin-ember` * [#2730](https://github.com/ember-cli/eslint-plugin-ember/pull/2730) BUGFIX: template-require-valid-alt-text — reject empty-string aria-label/labelledby/alt on , , ([@johanrd](https://github.com/johanrd)) * [#2729](https://github.com/ember-cli/eslint-plugin-ember/pull/2729) BUGFIX: template-no-invalid-role — support DPUB/Graphics-ARIA and role-fallback lists ([@johanrd](https://github.com/johanrd)) * [#2726](https://github.com/ember-cli/eslint-plugin-ember/pull/2726) BUGFIX: template-no-unsupported-role-attributes — honor aria-query attribute constraints ([@johanrd](https://github.com/johanrd)) * [#2727](https://github.com/ember-cli/eslint-plugin-ember/pull/2727) BUGFIX: template-no-redundant-role — case-insensitive match +