@angular-eslint/eslint-plugin 21.1.1-alpha.3 → 21.1.1-alpha.5

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
@@ -26,6 +26,7 @@ Please see https://github.com/angular-eslint/angular-eslint for full usage instr
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 the @Attribute decorator is often mistakenly used when @Input is intended. This rule disallows the usage of @Attribute decorator entirely to prevent these mistakes. | | | |
27
27
  | [`no-developer-preview`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-developer-preview.md) | Disallow using code which is marked as developer preview | | | |
28
28
  | [`no-experimental`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-experimental.md) | Disallow using code which is marked as experimental | | | |
29
+ | [`no-implicit-take-until-destroyed`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/no-implicit-take-until-destroyed.md) | Ensures that `takeUntilDestroyed()` is called with an explicit `DestroyRef` when used outside of an injection context | | | |
29
30
  | [`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. | | | |
30
31
  | [`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 | | | |
31
32
  <!-- prettier-ignore-end -->
@@ -17,6 +17,7 @@
17
17
  "@angular-eslint/no-empty-lifecycle-method": "error",
18
18
  "@angular-eslint/no-experimental": "error",
19
19
  "@angular-eslint/no-forward-ref": "error",
20
+ "@angular-eslint/no-implicit-take-until-destroyed": "error",
20
21
  "@angular-eslint/no-input-prefix": "error",
21
22
  "@angular-eslint/no-input-rename": "error",
22
23
  "@angular-eslint/no-inputs-metadata-property": "error",
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ declare const _default: {
19
19
  "@angular-eslint/no-empty-lifecycle-method": string;
20
20
  "@angular-eslint/no-experimental": string;
21
21
  "@angular-eslint/no-forward-ref": string;
22
+ "@angular-eslint/no-implicit-take-until-destroyed": string;
22
23
  "@angular-eslint/no-input-prefix": string;
23
24
  "@angular-eslint/no-input-rename": string;
24
25
  "@angular-eslint/no-inputs-metadata-property": string;
@@ -83,23 +84,30 @@ declare const _default: {
83
84
  "no-async-lifecycle-method": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noAsyncLifecycleMethod", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
84
85
  "no-attribute-decorator": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noAttributeDecorator", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
85
86
  "no-conflicting-lifecycle": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-conflicting-lifecycle").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
87
+ "no-developer-preview": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDeveloperPreview", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
86
88
  "no-duplicates-in-metadata-arrays": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDuplicatesInMetadataArrays", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
87
89
  "no-empty-lifecycle-method": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-empty-lifecycle-method").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
90
+ "no-experimental": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noExperimental", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
88
91
  "no-forward-ref": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noForwardRef", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
92
+ "no-implicit-take-until-destroyed": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noImplicitTakeUntilDestroyed", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
89
93
  "no-input-prefix": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noInputPrefix", import("./rules/no-input-prefix").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
90
94
  "no-input-rename": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-input-rename").MessageIds, import("./rules/no-input-rename").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
91
95
  "no-inputs-metadata-property": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noInputsMetadataProperty", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
92
96
  "no-lifecycle-call": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noLifecycleCall", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
93
- "no-uncalled-signals": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-uncalled-signals").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
94
97
  "no-output-native": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noOutputNative", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
95
98
  "no-output-on-prefix": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noOutputOnPrefix", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
96
99
  "no-output-rename": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-output-rename").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
97
100
  "no-outputs-metadata-property": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noOutputsMetadataProperty", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
98
101
  "no-pipe-impure": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-pipe-impure").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
99
102
  "no-queries-metadata-property": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noQueriesMetadataProperty", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
103
+ "no-uncalled-signals": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-uncalled-signals").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
100
104
  "pipe-prefix": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/pipe-prefix").MessageIds, import("./rules/pipe-prefix").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
101
105
  "prefer-host-metadata-property": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/prefer-host-metadata-property").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
106
+ "prefer-inject": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferInject", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
102
107
  "prefer-on-push-component-change-detection": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/prefer-on-push-component-change-detection").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
108
+ "prefer-output-emitter-ref": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferOutputEmitterRef", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
109
+ "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>;
110
+ "prefer-signal-model": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferSignalModel", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
103
111
  "prefer-signals": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/prefer-signals").MessageIds, [{
104
112
  preferReadonlySignalProperties: boolean;
105
113
  preferInputSignals: boolean;
@@ -108,10 +116,6 @@ declare const _default: {
108
116
  additionalSignalCreationFunctions: string[];
109
117
  }], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
110
118
  "prefer-standalone": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/prefer-standalone").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
111
- "prefer-inject": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferInject", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
112
- "prefer-output-emitter-ref": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferOutputEmitterRef", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
113
- "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>;
114
- "prefer-signal-model": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferSignalModel", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
115
119
  "relative-url-prefix": import("@typescript-eslint/utils/ts-eslint").RuleModule<"relativeUrlPrefix", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
116
120
  "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>;
117
121
  "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>;
@@ -123,8 +127,6 @@ declare const _default: {
123
127
  "use-injectable-provided-in": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/use-injectable-provided-in").MessageIds, import("./rules/use-injectable-provided-in").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
124
128
  "use-lifecycle-interface": import("@typescript-eslint/utils/ts-eslint").RuleModule<"useLifecycleInterface", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
125
129
  "use-pipe-transform-interface": import("@typescript-eslint/utils/ts-eslint").RuleModule<"usePipeTransformInterface", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
126
- "no-experimental": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noExperimental", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
127
- "no-developer-preview": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDeveloperPreview", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
128
130
  };
129
131
  };
130
132
  export = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiJA,kBAuDE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,kBAwDE"}
package/dist/index.js CHANGED
@@ -84,6 +84,7 @@ const use_lifecycle_interface_1 = __importStar(require("./rules/use-lifecycle-in
84
84
  const use_pipe_transform_interface_1 = __importStar(require("./rules/use-pipe-transform-interface"));
85
85
  const no_experimental_1 = __importStar(require("./rules/no-experimental"));
86
86
  const no_developer_preview_1 = __importStar(require("./rules/no-developer-preview"));
87
+ const no_implicit_take_until_destroyed_1 = __importStar(require("./rules/no-implicit-take-until-destroyed"));
87
88
  module.exports = {
88
89
  configs: {
89
90
  all: all_json_1.default,
@@ -101,29 +102,32 @@ module.exports = {
101
102
  [no_async_lifecycle_method_1.RULE_NAME]: no_async_lifecycle_method_1.default,
102
103
  [no_attribute_decorator_1.RULE_NAME]: no_attribute_decorator_1.default,
103
104
  [no_conflicting_lifecycle_1.RULE_NAME]: no_conflicting_lifecycle_1.default,
105
+ [no_developer_preview_1.RULE_NAME]: no_developer_preview_1.default,
104
106
  [no_duplicates_in_metadata_arrays_1.RULE_NAME]: no_duplicates_in_metadata_arrays_1.default,
105
107
  [no_empty_lifecycle_method_1.RULE_NAME]: no_empty_lifecycle_method_1.default,
108
+ [no_experimental_1.RULE_NAME]: no_experimental_1.default,
106
109
  [no_forward_ref_1.RULE_NAME]: no_forward_ref_1.default,
110
+ [no_implicit_take_until_destroyed_1.RULE_NAME]: no_implicit_take_until_destroyed_1.default,
107
111
  [no_input_prefix_1.RULE_NAME]: no_input_prefix_1.default,
108
112
  [no_input_rename_1.RULE_NAME]: no_input_rename_1.default,
109
113
  [no_inputs_metadata_property_1.RULE_NAME]: no_inputs_metadata_property_1.default,
110
114
  [no_lifecycle_call_1.RULE_NAME]: no_lifecycle_call_1.default,
111
- [no_uncalled_signals_1.RULE_NAME]: no_uncalled_signals_1.default,
112
115
  [no_output_native_1.RULE_NAME]: no_output_native_1.default,
113
116
  [no_output_on_prefix_1.RULE_NAME]: no_output_on_prefix_1.default,
114
117
  [no_output_rename_1.RULE_NAME]: no_output_rename_1.default,
115
118
  [no_outputs_metadata_property_1.RULE_NAME]: no_outputs_metadata_property_1.default,
116
119
  [no_pipe_impure_1.RULE_NAME]: no_pipe_impure_1.default,
117
120
  [no_queries_metadata_property_1.RULE_NAME]: no_queries_metadata_property_1.default,
121
+ [no_uncalled_signals_1.RULE_NAME]: no_uncalled_signals_1.default,
118
122
  [pipe_prefix_1.RULE_NAME]: pipe_prefix_1.default,
119
123
  [prefer_host_metadata_property_1.RULE_NAME]: prefer_host_metadata_property_1.default,
120
- [prefer_on_push_component_change_detection_1.RULE_NAME]: prefer_on_push_component_change_detection_1.default,
121
- [prefer_signals_1.RULE_NAME]: prefer_signals_1.default,
122
- [prefer_standalone_1.RULE_NAME]: prefer_standalone_1.default,
123
124
  [prefer_inject_1.RULE_NAME]: prefer_inject_1.default,
125
+ [prefer_on_push_component_change_detection_1.RULE_NAME]: prefer_on_push_component_change_detection_1.default,
124
126
  [prefer_output_emitter_ref_1.RULE_NAME]: prefer_output_emitter_ref_1.default,
125
127
  [prefer_output_readonly_1.RULE_NAME]: prefer_output_readonly_1.default,
126
128
  [prefer_signal_model_1.RULE_NAME]: prefer_signal_model_1.default,
129
+ [prefer_signals_1.RULE_NAME]: prefer_signals_1.default,
130
+ [prefer_standalone_1.RULE_NAME]: prefer_standalone_1.default,
127
131
  [relative_url_prefix_1.RULE_NAME]: relative_url_prefix_1.default,
128
132
  [require_lifecycle_on_prototype_1.RULE_NAME]: require_lifecycle_on_prototype_1.default,
129
133
  [require_localize_metadata_1.RULE_NAME]: require_localize_metadata_1.default,
@@ -135,7 +139,5 @@ module.exports = {
135
139
  [use_injectable_provided_in_1.RULE_NAME]: use_injectable_provided_in_1.default,
136
140
  [use_lifecycle_interface_1.RULE_NAME]: use_lifecycle_interface_1.default,
137
141
  [use_pipe_transform_interface_1.RULE_NAME]: use_pipe_transform_interface_1.default,
138
- [no_experimental_1.RULE_NAME]: no_experimental_1.default,
139
- [no_developer_preview_1.RULE_NAME]: no_developer_preview_1.default,
140
142
  },
141
143
  };
@@ -0,0 +1,9 @@
1
+ export type Options = [];
2
+ export type MessageIds = 'noImplicitTakeUntilDestroyed';
3
+ export declare const RULE_NAME = "no-implicit-take-until-destroyed";
4
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noImplicitTakeUntilDestroyed", [], import("../utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
5
+ export default _default;
6
+ export declare const RULE_DOCS_EXTENSION: {
7
+ rationale: string;
8
+ };
9
+ //# sourceMappingURL=no-implicit-take-until-destroyed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-implicit-take-until-destroyed.d.ts","sourceRoot":"","sources":["../../src/rules/no-implicit-take-until-destroyed.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,EAAE,CAAC;AACzB,MAAM,MAAM,UAAU,GAAG,8BAA8B,CAAC;AACxD,eAAO,MAAM,SAAS,qCAAqC,CAAC;;AAO5D,wBAgCG;AAqEH,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RULE_DOCS_EXTENSION = exports.RULE_NAME = void 0;
4
+ const utils_1 = require("@angular-eslint/utils");
5
+ const utils_2 = require("@typescript-eslint/utils");
6
+ const create_eslint_rule_1 = require("../utils/create-eslint-rule");
7
+ exports.RULE_NAME = 'no-implicit-take-until-destroyed';
8
+ const RXJS_INTEROP_LINK = 'https://angular.dev/ecosystem/rxjs-interop/take-until-destroyed';
9
+ const DEPENDENCY_INJECTION_CONTEXT = 'https://angular.dev/guide/di/dependency-injection-context';
10
+ exports.default = (0, create_eslint_rule_1.createESLintRule)({
11
+ name: exports.RULE_NAME,
12
+ meta: {
13
+ type: 'problem',
14
+ docs: {
15
+ description: `Ensures that \`takeUntilDestroyed()\` is called with an explicit \`DestroyRef\` when used outside of an injection context`,
16
+ },
17
+ schema: [],
18
+ messages: {
19
+ noImplicitTakeUntilDestroyed: `\`takeUntilDestroyed()\` must be called with an explicit \`DestroyRef\` parameter when used outside of an injection context. See more at ${DEPENDENCY_INJECTION_CONTEXT} and ${RXJS_INTEROP_LINK}`,
20
+ },
21
+ },
22
+ defaultOptions: [],
23
+ create(context) {
24
+ return {
25
+ CallExpression(node) {
26
+ if (node.callee.type !== utils_2.AST_NODE_TYPES.Identifier ||
27
+ node.callee.name !== 'takeUntilDestroyed' ||
28
+ node.arguments.length > 0 ||
29
+ isInInjectionContext(node)) {
30
+ return;
31
+ }
32
+ context.report({
33
+ node,
34
+ messageId: 'noImplicitTakeUntilDestroyed',
35
+ });
36
+ },
37
+ };
38
+ },
39
+ });
40
+ function isInInjectionContext(node) {
41
+ let current = node;
42
+ while (current) {
43
+ if (isInFactoryFunction(current)) {
44
+ return true;
45
+ }
46
+ if (utils_1.ASTUtils.isPropertyDefinition(current) ||
47
+ isConstructorMethod(current)) {
48
+ const classDeclaration = utils_1.ASTUtils.getNearestNodeFrom(current, utils_1.ASTUtils.isClassDeclaration);
49
+ if (!classDeclaration) {
50
+ current = current.parent;
51
+ continue;
52
+ }
53
+ const decorator = utils_1.ASTUtils.getAngularClassDecorator(classDeclaration);
54
+ if (decorator && decorator !== 'NgModule') {
55
+ return true;
56
+ }
57
+ }
58
+ current = current.parent;
59
+ }
60
+ return false;
61
+ }
62
+ function isConstructorMethod(node) {
63
+ return (node.type === utils_2.AST_NODE_TYPES.MethodDefinition && node.kind === 'constructor');
64
+ }
65
+ function isInFactoryFunction(node) {
66
+ if (node.type !== utils_2.AST_NODE_TYPES.ArrowFunctionExpression &&
67
+ node.type !== utils_2.AST_NODE_TYPES.FunctionExpression) {
68
+ return false;
69
+ }
70
+ const parent = node.parent;
71
+ if (!utils_1.ASTUtils.isProperty(parent)) {
72
+ return false;
73
+ }
74
+ const key = parent.key;
75
+ if (key.type === utils_2.AST_NODE_TYPES.Identifier &&
76
+ ['factory', 'useFactory'].includes(key.name)) {
77
+ return true;
78
+ }
79
+ return false;
80
+ }
81
+ exports.RULE_DOCS_EXTENSION = {
82
+ rationale: `The \`takeUntilDestroyed()\` operator can automatically infer the current component's or directive's \`DestroyRef\` only when called within an injection context — specifically in constructors or field initializers of classes decorated with \`@Component\`, \`@Directive\`, \`@Injectable\`, or \`@Pipe\`, or in factory functions (\`useFactory\` in providers or \`factory\` in InjectionTokens). When used in lifecycle methods like \`ngOnInit()\` or \`ngAfterViewInit()\`, in regular methods, in constructors of plain classes not managed by Angular's DI system, or in \`@NgModule\` classes (which don't support the \`ngOnDestroy\` lifecycle), the injection context is not available, and \`takeUntilDestroyed()\` will throw a runtime error: "NG0203: inject() must be called from an injection context." To fix this, inject \`DestroyRef\` using \`inject(DestroyRef)\` and pass it explicitly: \`takeUntilDestroyed(this.destroyRef)\`.`,
83
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-eslint/eslint-plugin",
3
- "version": "21.1.1-alpha.3",
3
+ "version": "21.1.1-alpha.5",
4
4
  "description": "ESLint plugin for Angular applications, following https://angular.dev/style-guide",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -19,11 +19,11 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "ts-api-utils": "^2.1.0",
22
- "@angular-eslint/bundled-angular-compiler": "21.1.1-alpha.3",
23
- "@angular-eslint/utils": "21.1.1-alpha.3"
22
+ "@angular-eslint/bundled-angular-compiler": "21.1.1-alpha.5",
23
+ "@angular-eslint/utils": "21.1.1-alpha.5"
24
24
  },
25
25
  "devDependencies": {
26
- "@angular-eslint/test-utils": "21.1.1-alpha.3"
26
+ "@angular-eslint/test-utils": "21.1.1-alpha.5"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@typescript-eslint/utils": "^7.11.0 || ^8.0.0",