{
  "section": "ESLint",
  "source": "https://www.angular.courses/caniuse?tab=eslint",
  "expected_count": 88,
  "actual_count": 88,
  "headers": [
    "section",
    "name",
    "package",
    "description",
    "status",
    "introduced_in",
    "removed_in",
    "v22",
    "v21",
    "v20",
    "v19",
    "v18",
    "v17",
    "v16",
    "v15",
    "v14",
    "angular_courses_url",
    "angular_dev_url",
    "notes"
  ],
  "items": [
    {
      "section": "ESLint",
      "name": "contextual-lifecycle",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that lifecycle methods are used in a correct context",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/contextual-lifecycle.md",
      "notes": "",
      "raw": {
        "name": "contextual-lifecycle",
        "description": "Ensures that lifecycle methods are used in a correct context",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/contextual-lifecycle.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-async-lifecycle-method",
      "package": "angular-eslint/eslint-plugin",
      "description": "Angular Lifecycle methods should not be async. Angular does not wait for async lifecycle but the code incorrectly suggests it does.",
      "status": "",
      "introduced_in": "17.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "available",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-async-lifecycle-method.md",
      "notes": "",
      "raw": {
        "name": "no-async-lifecycle-method",
        "description": "Angular Lifecycle methods should not be async. Angular does not wait for async lifecycle but the code incorrectly suggests it does.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-async-lifecycle-method.md",
        "version": "17.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-attribute-decorator",
      "package": "angular-eslint/eslint-plugin",
      "description": "The @Attribute decorator is used to obtain a single value for an attribute. This is a much less common use case than getting a stream of values (using @Input), so the @Attribute decorator is often mistakenly used when @Input is intended. This rule disallows the usage of @Attribute decorator entirely to prevent these mistakes.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-attribute-decorator.md",
      "notes": "",
      "raw": {
        "name": "no-attribute-decorator",
        "description": "The @Attribute decorator is used to obtain a single value for an attribute. This is a much less common use case than getting a stream of values (using @Input), so the @Attribute decorator is often mistakenly used when @Input is intended. This rule disallows the usage of @Attribute decorator entirely to prevent these mistakes.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-attribute-decorator.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-developer-preview",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallow using code which is marked as developer preview",
      "status": "",
      "introduced_in": "20.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-developer-preview.md",
      "notes": "",
      "raw": {
        "name": "no-developer-preview",
        "description": "Disallow using code which is marked as developer preview",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-developer-preview.md",
        "version": "20.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-experimental",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallow using code which is marked as experimental",
      "status": "",
      "introduced_in": "20.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-experimental.md",
      "notes": "",
      "raw": {
        "name": "no-experimental",
        "description": "Disallow using code which is marked as experimental",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-experimental.md",
        "version": "20.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "require-lifecycle-on-prototype",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that lifecycle methods are defined on the object's prototype instead of on an instance.",
      "status": "",
      "introduced_in": "19.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/require-lifecycle-on-prototype.md",
      "notes": "",
      "raw": {
        "name": "require-lifecycle-on-prototype",
        "description": "Ensures that lifecycle methods are defined on the object's prototype instead of on an instance.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/require-lifecycle-on-prototype.md",
        "version": "19.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "sort-lifecycle-methods",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that lifecycle methods are declared in order of execution",
      "status": "",
      "introduced_in": "16.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "available",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/sort-lifecycle-methods.md",
      "notes": "",
      "raw": {
        "name": "sort-lifecycle-methods",
        "description": "Ensures that lifecycle methods are declared in order of execution",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/sort-lifecycle-methods.md",
        "version": "16.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "component-class-suffix",
      "package": "angular-eslint/eslint-plugin",
      "description": "Classes decorated with @Component must have suffix \"Component\" (or custom) in their name. Note: As of v20, this is no longer recommended by the Angular Team.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-class-suffix.md",
      "notes": "",
      "raw": {
        "name": "component-class-suffix",
        "description": "Classes decorated with @Component must have suffix \"Component\" (or custom) in their name. Note: As of v20, this is no longer recommended by the Angular Team.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-class-suffix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "component-max-inline-declarations",
      "package": "angular-eslint/eslint-plugin",
      "description": "Enforces a maximum number of lines in inline template, styles and animations.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-max-inline-declarations.md",
      "notes": "",
      "raw": {
        "name": "component-max-inline-declarations",
        "description": "Enforces a maximum number of lines in inline template, styles and animations.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-max-inline-declarations.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "component-selector",
      "package": "angular-eslint/eslint-plugin",
      "description": "Component selectors should follow given naming rules. See more at https://angular.dev/style-guide#choosing-component-selectors.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-selector.md",
      "notes": "",
      "raw": {
        "name": "component-selector",
        "description": "Component selectors should follow given naming rules. See more at https://angular.dev/style-guide#choosing-component-selectors.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/component-selector.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "consistent-component-styles",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures consistent usage of `styles` / `styleUrls` / `styleUrl` within Component metadata",
      "status": "",
      "introduced_in": "17.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "available",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/consistent-component-styles.md",
      "notes": "",
      "raw": {
        "name": "consistent-component-styles",
        "description": "Ensures consistent usage of `styles` / `styleUrls` / `styleUrl` within Component metadata",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/consistent-component-styles.md",
        "version": "17.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "contextual-decorator",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that classes use contextual decorators in their body",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/contextual-decorator.md",
      "notes": "",
      "raw": {
        "name": "contextual-decorator",
        "description": "Ensures that classes use contextual decorators in their body",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/contextual-decorator.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "directive-class-suffix",
      "package": "angular-eslint/eslint-plugin",
      "description": "Classes decorated with @Directive must have suffix \"Directive\" (or custom) in their name. Note: As of v20, this is no longer recommended by the Angular Team.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/directive-class-suffix.md",
      "notes": "",
      "raw": {
        "name": "directive-class-suffix",
        "description": "Classes decorated with @Directive must have suffix \"Directive\" (or custom) in their name. Note: As of v20, this is no longer recommended by the Angular Team.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/directive-class-suffix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "directive-selector",
      "package": "angular-eslint/eslint-plugin",
      "description": "Directive selectors should follow given naming rules. See more at https://angular.dev/style-guide#choosing-directive-selectors.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/directive-selector.md",
      "notes": "",
      "raw": {
        "name": "directive-selector",
        "description": "Directive selectors should follow given naming rules. See more at https://angular.dev/style-guide#choosing-directive-selectors.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/directive-selector.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-conflicting-lifecycle",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that directives do not implement conflicting lifecycle interfaces.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-conflicting-lifecycle.md",
      "notes": "",
      "raw": {
        "name": "no-conflicting-lifecycle",
        "description": "Ensures that directives do not implement conflicting lifecycle interfaces.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-conflicting-lifecycle.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-duplicates-in-metadata-arrays",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that metadata arrays do not contain duplicate entries.",
      "status": "",
      "introduced_in": "17.4.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "available",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-duplicates-in-metadata-arrays.md",
      "notes": "",
      "raw": {
        "name": "no-duplicates-in-metadata-arrays",
        "description": "Ensures that metadata arrays do not contain duplicate entries.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-duplicates-in-metadata-arrays.md",
        "version": "17.4.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-empty-lifecycle-method",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows declaring empty lifecycle methods",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-empty-lifecycle-method.md",
      "notes": "",
      "raw": {
        "name": "no-empty-lifecycle-method",
        "description": "Disallows declaring empty lifecycle methods",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-empty-lifecycle-method.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-forward-ref",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows usage of `forwardRef` references for DI",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-forward-ref.md",
      "notes": "",
      "raw": {
        "name": "no-forward-ref",
        "description": "Disallows usage of `forwardRef` references for DI",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-forward-ref.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-input-prefix",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that input bindings, including aliases, are not named or prefixed by the configured disallowed prefixes",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-input-prefix.md",
      "notes": "",
      "raw": {
        "name": "no-input-prefix",
        "description": "Ensures that input bindings, including aliases, are not named or prefixed by the configured disallowed prefixes",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-input-prefix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-input-rename",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that input bindings are not aliased",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-input-rename.md",
      "notes": "",
      "raw": {
        "name": "no-input-rename",
        "description": "Ensures that input bindings are not aliased",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-input-rename.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-inputs-metadata-property",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows usage of the `inputs` metadata property.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-inputs-metadata-property.md",
      "notes": "",
      "raw": {
        "name": "no-inputs-metadata-property",
        "description": "Disallows usage of the `inputs` metadata property.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-inputs-metadata-property.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-lifecycle-call",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows explicit calls to lifecycle methods.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-lifecycle-call.md",
      "notes": "",
      "raw": {
        "name": "no-lifecycle-call",
        "description": "Disallows explicit calls to lifecycle methods.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-lifecycle-call.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-output-native",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that output bindings, including aliases, are not named as standard DOM events.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-native.md",
      "notes": "",
      "raw": {
        "name": "no-output-native",
        "description": "Ensures that output bindings, including aliases, are not named as standard DOM events.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-native.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-output-on-prefix",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that output bindings, including aliases, are not named \"on\", nor prefixed with it. See more at https://angular.dev/guide/components/outputs#choosing-event-names.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-on-prefix.md",
      "notes": "",
      "raw": {
        "name": "no-output-on-prefix",
        "description": "Ensures that output bindings, including aliases, are not named \"on\", nor prefixed with it. See more at https://angular.dev/guide/components/outputs#choosing-event-names.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-on-prefix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-output-rename",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that output bindings are not aliased",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-rename.md",
      "notes": "",
      "raw": {
        "name": "no-output-rename",
        "description": "Ensures that output bindings are not aliased",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-output-rename.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-outputs-metadata-property",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows usage of the `outputs` metadata property.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-outputs-metadata-property.md",
      "notes": "",
      "raw": {
        "name": "no-outputs-metadata-property",
        "description": "Disallows usage of the `outputs` metadata property.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-outputs-metadata-property.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-pipe-impure",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows the declaration of impure pipes.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-pipe-impure.md",
      "notes": "",
      "raw": {
        "name": "no-pipe-impure",
        "description": "Disallows the declaration of impure pipes.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-pipe-impure.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-queries-metadata-property",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows usage of the `queries` metadata property.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-queries-metadata-property.md",
      "notes": "",
      "raw": {
        "name": "no-queries-metadata-property",
        "description": "Disallows usage of the `queries` metadata property.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-queries-metadata-property.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-uncalled-signals",
      "package": "angular-eslint/eslint-plugin",
      "description": "Warns user about unintentionally doing logic on the signal, rather than the signal's value.",
      "status": "",
      "introduced_in": "19.7.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-uncalled-signals.md",
      "notes": "",
      "raw": {
        "name": "no-uncalled-signals",
        "description": "Warns user about unintentionally doing logic on the signal, rather than the signal's value.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-uncalled-signals.md",
        "version": "19.7.0"
      }
    },
    {
      "section": "ESLint",
      "name": "pipe-prefix",
      "package": "angular-eslint/eslint-plugin",
      "description": "Enforce consistent prefix for pipes.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/pipe-prefix.md",
      "notes": "",
      "raw": {
        "name": "pipe-prefix",
        "description": "Enforce consistent prefix for pipes.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/pipe-prefix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-host-metadata-property",
      "package": "angular-eslint/eslint-plugin",
      "description": "Use `host` metadata property instead of `@HostBinding` and `HostListener`.",
      "status": "",
      "introduced_in": "20.5.2",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-host-metadata-property.md",
      "notes": "",
      "raw": {
        "name": "prefer-host-metadata-property",
        "description": "Use `host` metadata property instead of `@HostBinding` and `HostListener`.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-host-metadata-property.md",
        "version": "20.5.2"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-inject",
      "package": "angular-eslint/eslint-plugin",
      "description": "Prefer using the `inject()` function over constructor parameter injection.",
      "status": "",
      "introduced_in": "19.6.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-inject.md",
      "notes": "",
      "raw": {
        "name": "prefer-inject",
        "description": "Prefer using the `inject()` function over constructor parameter injection.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-inject.md",
        "version": "19.6.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-on-push-component-change-detection",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures component's `changeDetection` is set to `ChangeDetectionStrategy.OnPush`.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-on-push-component-change-detection.md",
      "notes": "",
      "raw": {
        "name": "prefer-on-push-component-change-detection",
        "description": "Ensures component's `changeDetection` is set to `ChangeDetectionStrategy.OnPush`.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-on-push-component-change-detection.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-output-emitter-ref",
      "package": "angular-eslint/eslint-plugin",
      "description": "Use `OutputEmitterRef` instead of `@Output()`.",
      "status": "",
      "introduced_in": "19.4.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-output-emitter-ref.md",
      "notes": "",
      "raw": {
        "name": "prefer-output-emitter-ref",
        "description": "Use `OutputEmitterRef` instead of `@Output()`.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-output-emitter-ref.md",
        "version": "19.4.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-output-readonly",
      "package": "angular-eslint/eslint-plugin",
      "description": "Prefer to declare `@Output`, `OutputEmitterRef` and `OutputRef` as `readonly` since they are not supposed to be reassigned.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-output-readonly.md",
      "notes": "",
      "raw": {
        "name": "prefer-output-readonly",
        "description": "Prefer to declare `@Output`, `OutputEmitterRef` and `OutputRef` as `readonly` since they are not supposed to be reassigned.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-output-readonly.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-signals",
      "package": "angular-eslint/eslint-plugin",
      "description": "Use `readonly` signals instead of `@Input()`, `@ViewChild()` and other legacy decorators.",
      "status": "",
      "introduced_in": "19.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-signals.md",
      "notes": "",
      "raw": {
        "name": "prefer-signals",
        "description": "Use `readonly` signals instead of `@Input()`, `@ViewChild()` and other legacy decorators.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-signals.md",
        "version": "19.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-standalone",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures Components, Directives and Pipes do not opt out of standalone.",
      "status": "",
      "introduced_in": "17.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "available",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-standalone.md",
      "notes": "",
      "raw": {
        "name": "prefer-standalone",
        "description": "Ensures Components, Directives and Pipes do not opt out of standalone.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-standalone.md",
        "version": "17.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "relative-url-prefix",
      "package": "angular-eslint/eslint-plugin",
      "description": "The ./ and ../ prefix is standard syntax for relative URLs; don't depend on Angular's current ability to do without that prefix.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/relative-url-prefix.md",
      "notes": "",
      "raw": {
        "name": "relative-url-prefix",
        "description": "The ./ and ../ prefix is standard syntax for relative URLs; don't depend on Angular's current ability to do without that prefix.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/relative-url-prefix.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "require-localize-metadata",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that $localize tagged messages contain helpful metadata to aid with translations.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/require-localize-metadata.md",
      "notes": "",
      "raw": {
        "name": "require-localize-metadata",
        "description": "Ensures that $localize tagged messages contain helpful metadata to aid with translations.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/require-localize-metadata.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "runtime-localize",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that $localize tagged messages can use runtime-loaded translations.",
      "status": "",
      "introduced_in": "18.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "available",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/runtime-localize.md",
      "notes": "",
      "raw": {
        "name": "runtime-localize",
        "description": "Ensures that $localize tagged messages can use runtime-loaded translations.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/runtime-localize.md",
        "version": "18.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "sort-keys-in-type-decorator",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that keys in type decorators (Component, Directive, NgModule, Pipe) are sorted in a consistent order",
      "status": "",
      "introduced_in": "19.5.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/sort-keys-in-type-decorator.md",
      "notes": "",
      "raw": {
        "name": "sort-keys-in-type-decorator",
        "description": "Ensures that keys in type decorators (Component, Directive, NgModule, Pipe) are sorted in a consistent order",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/sort-keys-in-type-decorator.md",
        "version": "19.5.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-component-selector",
      "package": "angular-eslint/eslint-plugin",
      "description": "Component selector must be declared",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-component-selector.md",
      "notes": "",
      "raw": {
        "name": "use-component-selector",
        "description": "Component selector must be declared",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-component-selector.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-component-view-encapsulation",
      "package": "angular-eslint/eslint-plugin",
      "description": "Disallows using ViewEncapsulation.None",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-component-view-encapsulation.md",
      "notes": "",
      "raw": {
        "name": "use-component-view-encapsulation",
        "description": "Disallows using ViewEncapsulation.None",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-component-view-encapsulation.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-injectable-provided-in",
      "package": "angular-eslint/eslint-plugin",
      "description": "Using the providedIn property makes Injectables tree-shakable",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-injectable-provided-in.md",
      "notes": "",
      "raw": {
        "name": "use-injectable-provided-in",
        "description": "Using the providedIn property makes Injectables tree-shakable",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-injectable-provided-in.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-lifecycle-interface",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that classes implement lifecycle interfaces corresponding to the declared lifecycle methods. See more at https://angular.dev/style-guide#use-lifecycle-hook-interfaces",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-lifecycle-interface.md",
      "notes": "",
      "raw": {
        "name": "use-lifecycle-interface",
        "description": "Ensures that classes implement lifecycle interfaces corresponding to the declared lifecycle methods. See more at https://angular.dev/style-guide#use-lifecycle-hook-interfaces",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-lifecycle-interface.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-pipe-transform-interface",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that Pipes implement PipeTransform interface",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-pipe-transform-interface.md",
      "notes": "",
      "raw": {
        "name": "use-pipe-transform-interface",
        "description": "Ensures that Pipes implement PipeTransform interface",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/use-pipe-transform-interface.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-duplicate-attributes",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that there are no duplicate input properties or output event listeners",
      "status": "",
      "introduced_in": "14.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "available",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-duplicate-attributes.md",
      "notes": "",
      "raw": {
        "name": "no-duplicate-attributes",
        "description": "Ensures that there are no duplicate input properties or output event listeners",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-duplicate-attributes.md",
        "version": "14.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-nested-tags",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Denies nesting of and tags.",
      "status": "",
      "introduced_in": "19.5.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-nested-tags.md",
      "notes": "",
      "raw": {
        "name": "no-nested-tags",
        "description": "Denies nesting of and tags.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-nested-tags.md",
        "version": "19.5.0"
      }
    },
    {
      "section": "ESLint",
      "name": "alt-text",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Enforces alternate text for elements which require the alt, aria-label, aria-labelledby attributes.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/alt-text.md",
      "notes": "",
      "raw": {
        "name": "alt-text",
        "description": "[Accessibility] Enforces alternate text for elements which require the alt, aria-label, aria-labelledby attributes.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/alt-text.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "banana-in-box",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that the two-way data binding syntax is correct",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/banana-in-box.md",
      "notes": "",
      "raw": {
        "name": "banana-in-box",
        "description": "Ensures that the two-way data binding syntax is correct",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/banana-in-box.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "button-has-type",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that a button has a valid type specified",
      "status": "",
      "introduced_in": "13.5.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/button-has-type.md",
      "notes": "",
      "raw": {
        "name": "button-has-type",
        "description": "Ensures that a button has a valid type specified",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/button-has-type.md",
        "version": "13.5.0"
      }
    },
    {
      "section": "ESLint",
      "name": "click-events-have-key-events",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that the click event is accompanied with at least one key event keyup, keydown or keypress.",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/click-events-have-key-events.md",
      "notes": "",
      "raw": {
        "name": "click-events-have-key-events",
        "description": "[Accessibility] Ensures that the click event is accompanied with at least one key event keyup, keydown or keypress.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/click-events-have-key-events.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "conditional-complexity",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "The conditional complexity should not exceed a rational limit",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/conditional-complexity.md",
      "notes": "",
      "raw": {
        "name": "conditional-complexity",
        "description": "The conditional complexity should not exceed a rational limit",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/conditional-complexity.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "cyclomatic-complexity",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Checks cyclomatic complexity against a specified limit. It is a quantitative measure of the number of linearly independent paths through a program's source code",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/cyclomatic-complexity.md",
      "notes": "",
      "raw": {
        "name": "cyclomatic-complexity",
        "description": "Checks cyclomatic complexity against a specified limit. It is a quantitative measure of the number of linearly independent paths through a program's source code",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/cyclomatic-complexity.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "elements-content",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that the heading, anchor and button elements have content in them",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/elements-content.md",
      "notes": "",
      "raw": {
        "name": "elements-content",
        "description": "[Accessibility] Ensures that the heading, anchor and button elements have content in them",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/elements-content.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "eqeqeq",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Requires === and !== in place of == and !=",
      "status": "",
      "introduced_in": "12.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/eqeqeq.md",
      "notes": "",
      "raw": {
        "name": "eqeqeq",
        "description": "Requires === and !== in place of == and !=",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/eqeqeq.md",
        "version": "12.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "i18n",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures following best practices for i18n. Checks for missing i18n attributes on elements and attributes containing texts. Can also check for texts without i18n attribute, elements that do not use custom ID (@@) feature and duplicate custom IDs",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/i18n.md",
      "notes": "",
      "raw": {
        "name": "i18n",
        "description": "Ensures following best practices for i18n. Checks for missing i18n attributes on elements and attributes containing texts. Can also check for texts without i18n attribute, elements that do not use custom ID (@@) feature and duplicate custom IDs",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/i18n.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "interactive-supports-focus",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that elements with interactive handlers like (click) are focusable.",
      "status": "",
      "introduced_in": "14.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "available",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/interactive-supports-focus.md",
      "notes": "",
      "raw": {
        "name": "interactive-supports-focus",
        "description": "[Accessibility] Ensures that elements with interactive handlers like (click) are focusable.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/interactive-supports-focus.md",
        "version": "14.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "label-has-associated-control",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that a label element/component is associated with a form element",
      "status": "",
      "introduced_in": "4.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/label-has-associated-control.md",
      "notes": "",
      "raw": {
        "name": "label-has-associated-control",
        "description": "[Accessibility] Ensures that a label element/component is associated with a form element",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/label-has-associated-control.md",
        "version": "4.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "mouse-events-have-key-events",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that the mouse events mouseout and mouseover are accompanied by focus and blur events respectively. Coding for the keyboard is important for users with physical disabilities who cannot use a mouse, AT compatibility, and screenreader users. See more at https://www.w3.org/WAI/WCAG21/Understanding/keyboard",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/mouse-events-have-key-events.md",
      "notes": "",
      "raw": {
        "name": "mouse-events-have-key-events",
        "description": "[Accessibility] Ensures that the mouse events mouseout and mouseover are accompanied by focus and blur events respectively. Coding for the keyboard is important for users with physical disabilities who cannot use a mouse, AT compatibility, and screenreader users. See more at https://www.w3.org/WAI/WCAG21/Understanding/keyboard",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/mouse-events-have-key-events.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-any",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "The use of \"$any\" nullifies the compile-time benefits of Angular's type system",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-any.md",
      "notes": "",
      "raw": {
        "name": "no-any",
        "description": "The use of \"$any\" nullifies the compile-time benefits of Angular's type system",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-any.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-autofocus",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that the autofocus attribute is not used",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-autofocus.md",
      "notes": "",
      "raw": {
        "name": "no-autofocus",
        "description": "[Accessibility] Ensures that the autofocus attribute is not used",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-autofocus.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-call-expression",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Disallows calling expressions in templates, except for output handlers",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-call-expression.md",
      "notes": "",
      "raw": {
        "name": "no-call-expression",
        "description": "Disallows calling expressions in templates, except for output handlers",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-call-expression.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-distracting-elements",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Enforces that no distracting elements are used",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-distracting-elements.md",
      "notes": "",
      "raw": {
        "name": "no-distracting-elements",
        "description": "[Accessibility] Enforces that no distracting elements are used",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-distracting-elements.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-empty-control-flow",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that control flow blocks are not empty. Empty control flow blocks usually occur due to refactoring that wasn't completed. They can cause confusion when reading code.",
      "status": "",
      "introduced_in": "20.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-empty-control-flow.md",
      "notes": "",
      "raw": {
        "name": "no-empty-control-flow",
        "description": "Ensures that control flow blocks are not empty. Empty control flow blocks usually occur due to refactoring that wasn't completed. They can cause confusion when reading code.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-empty-control-flow.md",
        "version": "20.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-inline-styles",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Disallows the use of inline styles in HTML templates",
      "status": "",
      "introduced_in": "14.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "available",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-inline-styles.md",
      "notes": "",
      "raw": {
        "name": "no-inline-styles",
        "description": "Disallows the use of inline styles in HTML templates",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-inline-styles.md",
        "version": "14.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-interpolation-in-attributes",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that property-binding is used instead of interpolation in attributes.",
      "status": "",
      "introduced_in": "15.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "available",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-interpolation-in-attributes.md",
      "notes": "",
      "raw": {
        "name": "no-interpolation-in-attributes",
        "description": "Ensures that property-binding is used instead of interpolation in attributes.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-interpolation-in-attributes.md",
        "version": "15.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-negated-async",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that async pipe results, as well as values used with the async pipe, are not negated",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-negated-async.md",
      "notes": "",
      "raw": {
        "name": "no-negated-async",
        "description": "Ensures that async pipe results, as well as values used with the async pipe, are not negated",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-negated-async.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-positive-tabindex",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that the tabindex attribute is not positive",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-positive-tabindex.md",
      "notes": "",
      "raw": {
        "name": "no-positive-tabindex",
        "description": "Ensures that the tabindex attribute is not positive",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-positive-tabindex.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-at-else",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Prefer using @else instead of a second @if with the opposite condition to reduce code and make it easier to read.",
      "status": "",
      "introduced_in": "20.5.2",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-else.md",
      "notes": "",
      "raw": {
        "name": "prefer-at-else",
        "description": "Prefer using @else instead of a second @if with the opposite condition to reduce code and make it easier to read.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-else.md",
        "version": "20.5.2"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-at-empty",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Prefer using @empty with @for loops instead of a separate @if or @else block to reduce code and make it easier to read.",
      "status": "",
      "introduced_in": "19.5.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-empty.md",
      "notes": "",
      "raw": {
        "name": "prefer-at-empty",
        "description": "Prefer using @empty with @for loops instead of a separate @if or @else block to reduce code and make it easier to read.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-empty.md",
        "version": "19.5.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-built-in-pipes",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Encourages the use of Angular built-in pipes (e.g. lowercase, uppercase, titlecase) instead of certain JavaScript methods in Angular templates.",
      "status": "",
      "introduced_in": "20.5.2",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "available",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-built-in-pipes.md",
      "notes": "",
      "raw": {
        "name": "prefer-built-in-pipes",
        "description": "Encourages the use of Angular built-in pipes (e.g. lowercase, uppercase, titlecase) instead of certain JavaScript methods in Angular templates.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-built-in-pipes.md",
        "version": "20.5.2"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-contextual-for-variables",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that contextual variables are used in @for blocks where possible instead of aliasing them.",
      "status": "",
      "introduced_in": "19.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-contextual-for-variables.md",
      "notes": "",
      "raw": {
        "name": "prefer-contextual-for-variables",
        "description": "Ensures that contextual variables are used in @for blocks where possible instead of aliasing them.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-contextual-for-variables.md",
        "version": "19.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-control-flow",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that the built-in control flow is used.",
      "status": "",
      "introduced_in": "17.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "available",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-control-flow.md",
      "notes": "",
      "raw": {
        "name": "prefer-control-flow",
        "description": "Ensures that the built-in control flow is used.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-control-flow.md",
        "version": "17.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-ngsrc",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures ngSrc is used instead of src for img elements",
      "status": "",
      "introduced_in": "16.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "available",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-ngsrc.md",
      "notes": "",
      "raw": {
        "name": "prefer-ngsrc",
        "description": "Ensures ngSrc is used instead of src for img elements",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-ngsrc.md",
        "version": "16.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-template-literal",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensure that template literals are used instead of concatenating strings or expressions.",
      "status": "",
      "introduced_in": "19.4.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-template-literal.md",
      "notes": "",
      "raw": {
        "name": "prefer-template-literal",
        "description": "Ensure that template literals are used instead of concatenating strings or expressions.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-template-literal.md",
        "version": "19.4.0"
      }
    },
    {
      "section": "ESLint",
      "name": "role-has-required-aria",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures elements with ARIA roles have all required properties for that role.",
      "status": "",
      "introduced_in": "14.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "available",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/role-has-required-aria.md",
      "notes": "",
      "raw": {
        "name": "role-has-required-aria",
        "description": "[Accessibility] Ensures elements with ARIA roles have all required properties for that role.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/role-has-required-aria.md",
        "version": "14.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "table-scope",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that the scope attribute is only used on the <th> element",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/table-scope.md",
      "notes": "",
      "raw": {
        "name": "table-scope",
        "description": "[Accessibility] Ensures that the scope attribute is only used on the <th> element",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/table-scope.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "use-track-by-function",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures trackBy function is used",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/use-track-by-function.md",
      "notes": "",
      "raw": {
        "name": "use-track-by-function",
        "description": "Ensures trackBy function is used",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/use-track-by-function.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "valid-aria",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "[Accessibility] Ensures that correct ARIA attributes and respective values are used",
      "status": "",
      "introduced_in": "1.0.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/valid-aria.md",
      "notes": "",
      "raw": {
        "name": "valid-aria",
        "description": "[Accessibility] Ensures that correct ARIA attributes and respective values are used",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/valid-aria.md",
        "version": "1.0.0"
      }
    },
    {
      "section": "ESLint",
      "name": "attributes-order",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that HTML attributes and Angular bindings are sorted based on an expected order",
      "status": "",
      "introduced_in": "14.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "available",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/attributes-order.md",
      "notes": "",
      "raw": {
        "name": "attributes-order",
        "description": "Ensures that HTML attributes and Angular bindings are sorted based on an expected order",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/attributes-order.md",
        "version": "14.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-self-closing-tags",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that self-closing tags are used for elements with a closing tag but no content.",
      "status": "",
      "introduced_in": "16.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "available",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-self-closing-tags.md",
      "notes": "",
      "raw": {
        "name": "prefer-self-closing-tags",
        "description": "Ensures that self-closing tags are used for elements with a closing tag but no content.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-self-closing-tags.md",
        "version": "16.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-static-string-properties",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Ensures that static string values use property assignment instead of property binding.",
      "status": "",
      "introduced_in": "19.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "",
      "v20": "",
      "v19": "available",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-static-string-properties.md",
      "notes": "",
      "raw": {
        "name": "prefer-static-string-properties",
        "description": "Ensures that static string values use property assignment instead of property binding.",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-static-string-properties.md",
        "version": "19.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-signal-model",
      "package": "angular-eslint/eslint-plugin",
      "description": "Use model instead of input and output for two-way bindings",
      "status": "",
      "introduced_in": "21.1.0",
      "removed_in": "",
      "v22": "",
      "v21": "available",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-signal-model.md",
      "notes": "",
      "raw": {
        "name": "prefer-signal-model",
        "description": "Use model instead of input and output for two-way bindings",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/prefer-signal-model.md",
        "version": "21.1.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-implicit-takeuntil-destroyed",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that takeUntilDestroyed() is called with an explicit DestroyRef when used outside of an injection context",
      "status": "",
      "introduced_in": "21.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "available",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-implicit-take-until-destroyed.md",
      "notes": "",
      "raw": {
        "name": "no-implicit-takeuntil-destroyed",
        "description": "Ensures that takeUntilDestroyed() is called with an explicit DestroyRef when used outside of an injection context",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-implicit-take-until-destroyed.md",
        "version": "21.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "prefer-class-binding",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Suggests using [class] bindings over ngClass where applicable",
      "status": "",
      "introduced_in": "21.2.0",
      "removed_in": "",
      "v22": "",
      "v21": "available",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-class-binding.md",
      "notes": "",
      "raw": {
        "name": "prefer-class-binding",
        "description": "Suggests using [class] bindings over ngClass where applicable",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-class-binding.md",
        "version": "21.2.0"
      }
    },
    {
      "section": "ESLint",
      "name": "computed-must-return",
      "package": "angular-eslint/eslint-plugin",
      "description": "Ensures that computed() returns a value. Omitting the value is likely a mistake.",
      "status": "",
      "introduced_in": "21.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "available",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/computed-must-return.md",
      "notes": "",
      "raw": {
        "name": "computed-must-return",
        "description": "Ensures that computed() returns a value. Omitting the value is likely a mistake.",
        "type": "eslint-plugin",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/computed-must-return.md",
        "version": "21.3.0"
      }
    },
    {
      "section": "ESLint",
      "name": "no-non-null-assertion",
      "package": "angular-eslint/eslint-plugin-template",
      "description": "Disallows the non-null assertion operator (!) in templates",
      "status": "",
      "introduced_in": "21.3.0",
      "removed_in": "",
      "v22": "",
      "v21": "available",
      "v20": "",
      "v19": "",
      "v18": "",
      "v17": "",
      "v16": "",
      "v15": "",
      "v14": "",
      "angular_courses_url": "https://www.angular.courses/caniuse?tab=eslint",
      "angular_dev_url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-non-null-assertion.md",
      "notes": "",
      "raw": {
        "name": "no-non-null-assertion",
        "description": "Disallows the non-null assertion operator (!) in templates",
        "type": "eslint-plugin-template",
        "url": "https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-non-null-assertion.md",
        "version": "21.3.0"
      }
    }
  ],
  "extracted_at": "2026-07-05T19:48:27.833Z"
}
