@angular-eslint/eslint-plugin 19.1.1-alpha.1 → 19.1.1-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,6 +24,7 @@ Please see https://github.com/angular-eslint/angular-eslint for full usage instr
24
24
  | [`contextual-lifecycle`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/contextual-lifecycle.md) | Ensures that lifecycle methods are used in a correct context | :white_check_mark: | | |
25
25
  | [`no-async-lifecycle-method`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-async-lifecycle-method.md) | Angular Lifecycle methods should not be async. Angular does not wait for async lifecycle but the code incorrectly suggests it does. | | | |
26
26
  | [`no-attribute-decorator`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-attribute-decorator.md) | 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 often the @Attribute decorator is mistakenly used when @Input was what was intended. This rule disallows usage of @Attribute decorator altogether in order to prevent these mistakes. | | | |
27
+ | [`require-lifecycle-on-prototype`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/require-lifecycle-on-prototype.md) | Ensures that lifecycle methods are defined on the object's prototype instead of on an instance. | | | |
27
28
  | [`sort-lifecycle-methods`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/sort-lifecycle-methods.md) | Ensures that lifecycle methods are declared in order of execution | | | |
28
29
  <!-- prettier-ignore-end -->
29
30
 
@@ -32,6 +32,7 @@
32
32
  "@angular-eslint/prefer-signals": "error",
33
33
  "@angular-eslint/prefer-standalone": "error",
34
34
  "@angular-eslint/relative-url-prefix": "error",
35
+ "@angular-eslint/require-lifecycle-on-prototype": "error",
35
36
  "@angular-eslint/require-localize-metadata": "error",
36
37
  "@angular-eslint/runtime-localize": "error",
37
38
  "@angular-eslint/sort-lifecycle-methods": "error",
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ declare const _default: {
34
34
  "@angular-eslint/prefer-signals": string;
35
35
  "@angular-eslint/prefer-standalone": string;
36
36
  "@angular-eslint/relative-url-prefix": string;
37
+ "@angular-eslint/require-lifecycle-on-prototype": string;
37
38
  "@angular-eslint/require-localize-metadata": string;
38
39
  "@angular-eslint/runtime-localize": string;
39
40
  "@angular-eslint/sort-lifecycle-methods": string;
@@ -101,6 +102,7 @@ declare const _default: {
101
102
  "prefer-standalone": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferStandalone", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
102
103
  "prefer-output-readonly": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/prefer-output-readonly").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
103
104
  "relative-url-prefix": import("@typescript-eslint/utils/ts-eslint").RuleModule<"relativeUrlPrefix", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
105
+ "require-lifecycle-on-prototype": import("@typescript-eslint/utils/ts-eslint").RuleModule<"defineOnPrototype", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
104
106
  "require-localize-metadata": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/require-localize-metadata").MessageIds, import("./rules/require-localize-metadata").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
105
107
  "runtime-localize": import("@typescript-eslint/utils/ts-eslint").RuleModule<"runtimeLocalize", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
106
108
  "sort-lifecycle-methods": import("@typescript-eslint/utils/ts-eslint").RuleModule<"lifecycleMethodsNotSorted", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHA,kBA8CE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHA,kBA+CE"}
package/dist/index.js CHANGED
@@ -56,6 +56,7 @@ const prefer_output_readonly_1 = __importStar(require("./rules/prefer-output-rea
56
56
  const prefer_signals_1 = __importStar(require("./rules/prefer-signals"));
57
57
  const prefer_standalone_1 = __importStar(require("./rules/prefer-standalone"));
58
58
  const relative_url_prefix_1 = __importStar(require("./rules/relative-url-prefix"));
59
+ const require_lifecycle_on_prototype_1 = __importStar(require("./rules/require-lifecycle-on-prototype"));
59
60
  const require_localize_metadata_1 = __importStar(require("./rules/require-localize-metadata"));
60
61
  const runtime_localize_1 = __importStar(require("./rules/runtime-localize"));
61
62
  const sort_lifecycle_methods_1 = __importStar(require("./rules/sort-lifecycle-methods"));
@@ -101,6 +102,7 @@ module.exports = {
101
102
  [prefer_standalone_1.RULE_NAME]: prefer_standalone_1.default,
102
103
  [prefer_output_readonly_1.RULE_NAME]: prefer_output_readonly_1.default,
103
104
  [relative_url_prefix_1.RULE_NAME]: relative_url_prefix_1.default,
105
+ [require_lifecycle_on_prototype_1.RULE_NAME]: require_lifecycle_on_prototype_1.default,
104
106
  [require_localize_metadata_1.RULE_NAME]: require_localize_metadata_1.default,
105
107
  [runtime_localize_1.RULE_NAME]: runtime_localize_1.default,
106
108
  [sort_lifecycle_methods_1.RULE_NAME]: sort_lifecycle_methods_1.default,
@@ -0,0 +1,6 @@
1
+ export type Options = [];
2
+ export type MessageIds = 'defineOnPrototype';
3
+ export declare const RULE_NAME = "require-lifecycle-on-prototype";
4
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"defineOnPrototype", [], import("../utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
5
+ export default _default;
6
+ //# sourceMappingURL=require-lifecycle-on-prototype.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-lifecycle-on-prototype.d.ts","sourceRoot":"","sources":["../../src/rules/require-lifecycle-on-prototype.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,EAAE,CAAC;AAIzB,MAAM,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAC7C,eAAO,MAAM,SAAS,mCAAmC,CAAC;;AAY1D,wBA2CG"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RULE_NAME = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const create_eslint_rule_1 = require("../utils/create-eslint-rule");
6
+ const utils_2 = require("@angular-eslint/utils");
7
+ const ISSUE_LINK = 'https://github.com/angular/angular/issues/38241';
8
+ exports.RULE_NAME = 'require-lifecycle-on-prototype';
9
+ const angularLifecycleMethodsPattern = (0, utils_2.toPattern)([
10
+ ...utils_2.ASTUtils.ANGULAR_LIFECYCLE_METHODS,
11
+ ]);
12
+ const propertyDefinitionSelector = `PropertyDefinition > ${createAngularLifecycleMethodsPattern('key')}`;
13
+ const assignmentSelector = `AssignmentExpression[operator="="] > MemberExpression.left > ${createAngularLifecycleMethodsPattern('property')}`;
14
+ function createAngularLifecycleMethodsPattern(parentProperty) {
15
+ return `:matches(Literal.${parentProperty}[value=${angularLifecycleMethodsPattern}], Identifier.${parentProperty}[name=${angularLifecycleMethodsPattern}])`;
16
+ }
17
+ exports.default = (0, create_eslint_rule_1.createESLintRule)({
18
+ name: exports.RULE_NAME,
19
+ meta: {
20
+ type: 'problem',
21
+ docs: {
22
+ description: "Ensures that lifecycle methods are defined on the object's prototype instead of on an instance.",
23
+ },
24
+ schema: [],
25
+ messages: {
26
+ defineOnPrototype: `The {{ method }} lifecycle method should be defined on the object's prototype. See more at ${ISSUE_LINK}`,
27
+ },
28
+ },
29
+ defaultOptions: [],
30
+ create(context) {
31
+ return {
32
+ [propertyDefinitionSelector](node) {
33
+ context.report({
34
+ node,
35
+ messageId: 'defineOnPrototype',
36
+ data: {
37
+ method: node.type === utils_1.AST_NODE_TYPES.Literal ? node.value : node.name,
38
+ },
39
+ });
40
+ },
41
+ [assignmentSelector](node) {
42
+ // Assigning to the prototype is OK.
43
+ if (!isPrototype(node.parent.object)) {
44
+ context.report({
45
+ node,
46
+ messageId: 'defineOnPrototype',
47
+ data: {
48
+ method: node.type === utils_1.AST_NODE_TYPES.Literal ? node.value : node.name,
49
+ },
50
+ });
51
+ }
52
+ },
53
+ };
54
+ },
55
+ });
56
+ function isPrototype(node) {
57
+ while (node.type === utils_1.AST_NODE_TYPES.TSAsExpression) {
58
+ node = node.expression;
59
+ }
60
+ if (node.type === utils_1.AST_NODE_TYPES.MemberExpression) {
61
+ switch (node.property.type) {
62
+ case utils_1.AST_NODE_TYPES.Identifier:
63
+ return node.property.name === 'prototype';
64
+ case utils_1.AST_NODE_TYPES.Literal:
65
+ return node.property.value === 'prototype';
66
+ }
67
+ }
68
+ return false;
69
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-eslint/eslint-plugin",
3
- "version": "19.1.1-alpha.1",
3
+ "version": "19.1.1-alpha.10",
4
4
  "description": "ESLint plugin for Angular applications, following https://angular.dev/style-guide",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -18,11 +18,11 @@
18
18
  "LICENSE"
19
19
  ],
20
20
  "dependencies": {
21
- "@angular-eslint/bundled-angular-compiler": "19.1.1-alpha.1",
22
- "@angular-eslint/utils": "19.1.1-alpha.1"
21
+ "@angular-eslint/bundled-angular-compiler": "19.1.1-alpha.10",
22
+ "@angular-eslint/utils": "19.1.1-alpha.10"
23
23
  },
24
24
  "devDependencies": {
25
- "@angular-eslint/test-utils": "19.1.1-alpha.1"
25
+ "@angular-eslint/test-utils": "19.1.1-alpha.10"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "@typescript-eslint/utils": "^7.11.0 || ^8.0.0",