eslint-plugin-runtime-cleanup 1.2.8 → 1.2.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 +29 -29
- package/dist/_internal/ast-node.d.ts +5 -1
- package/dist/_internal/ast-node.d.ts.map +1 -1
- package/dist/_internal/ast-node.js +2 -1
- package/dist/_internal/ast-node.js.map +1 -1
- package/dist/_internal/bounded-cache.d.ts.map +1 -1
- package/dist/_internal/bounded-cache.js +2 -1
- package/dist/_internal/bounded-cache.js.map +1 -1
- package/dist/_internal/expression-boolean-memoizer.d.ts.map +1 -1
- package/dist/_internal/expression-boolean-memoizer.js +2 -1
- package/dist/_internal/expression-boolean-memoizer.js.map +1 -1
- package/dist/_internal/filter-callback.d.ts +5 -1
- package/dist/_internal/filter-callback.d.ts.map +1 -1
- package/dist/_internal/filter-callback.js +9 -10
- package/dist/_internal/filter-callback.js.map +1 -1
- package/dist/_internal/floating-resource.d.ts +8 -0
- package/dist/_internal/floating-resource.d.ts.map +1 -1
- package/dist/_internal/floating-resource.js +42 -36
- package/dist/_internal/floating-resource.js.map +1 -1
- package/dist/_internal/normalize-expression-text.d.ts +6 -1
- package/dist/_internal/normalize-expression-text.d.ts.map +1 -1
- package/dist/_internal/normalize-expression-text.js +30 -28
- package/dist/_internal/normalize-expression-text.js.map +1 -1
- package/dist/_internal/nullish-comparison.d.ts +1 -1
- package/dist/_internal/nullish-comparison.d.ts.map +1 -1
- package/dist/_internal/nullish-comparison.js +16 -11
- package/dist/_internal/nullish-comparison.js.map +1 -1
- package/dist/_internal/plugin-settings.d.ts +2 -1
- package/dist/_internal/plugin-settings.d.ts.map +1 -1
- package/dist/_internal/plugin-settings.js +3 -2
- package/dist/_internal/plugin-settings.js.map +1 -1
- package/dist/_internal/report-adapter.d.ts +5 -4
- package/dist/_internal/report-adapter.d.ts.map +1 -1
- package/dist/_internal/report-adapter.js +3 -2
- package/dist/_internal/report-adapter.js.map +1 -1
- package/dist/_internal/rule-catalog.d.ts.map +1 -1
- package/dist/_internal/rule-catalog.js +3 -2
- package/dist/_internal/rule-catalog.js.map +1 -1
- package/dist/_internal/rule-docs-metadata.d.ts +2 -1
- package/dist/_internal/rule-docs-metadata.d.ts.map +1 -1
- package/dist/_internal/rule-docs-metadata.js +36 -33
- package/dist/_internal/rule-docs-metadata.js.map +1 -1
- package/dist/_internal/rules-registry.d.ts +2 -1
- package/dist/_internal/rules-registry.d.ts.map +1 -1
- package/dist/_internal/rules-registry.js.map +1 -1
- package/dist/_internal/runtime-cleanup-config-references.d.ts +2 -1
- package/dist/_internal/runtime-cleanup-config-references.d.ts.map +1 -1
- package/dist/_internal/runtime-cleanup-config-references.js +8 -7
- package/dist/_internal/runtime-cleanup-config-references.js.map +1 -1
- package/dist/_internal/scope-variable.d.ts.map +1 -1
- package/dist/_internal/scope-variable.js +5 -4
- package/dist/_internal/scope-variable.js.map +1 -1
- package/dist/_internal/type-checker.d.ts +2 -2
- package/dist/_internal/type-checker.d.ts.map +1 -1
- package/dist/_internal/type-checker.js +10 -8
- package/dist/_internal/type-checker.js.map +1 -1
- package/dist/_internal/type-predicate-autofix-safety.d.ts +5 -1
- package/dist/_internal/type-predicate-autofix-safety.d.ts.map +1 -1
- package/dist/_internal/type-predicate-autofix-safety.js +9 -10
- package/dist/_internal/type-predicate-autofix-safety.js.map +1 -1
- package/dist/_internal/type-reference-node.d.ts +7 -5
- package/dist/_internal/type-reference-node.d.ts.map +1 -1
- package/dist/_internal/type-reference-node.js +6 -6
- package/dist/_internal/type-reference-node.js.map +1 -1
- package/dist/_internal/typed-rule.d.ts +2 -1
- package/dist/_internal/typed-rule.d.ts.map +1 -1
- package/dist/_internal/typed-rule.js +6 -5
- package/dist/_internal/typed-rule.js.map +1 -1
- package/dist/_internal/value-rewrite-autofix-safety.d.ts +5 -1
- package/dist/_internal/value-rewrite-autofix-safety.d.ts.map +1 -1
- package/dist/_internal/value-rewrite-autofix-safety.js +10 -18
- package/dist/_internal/value-rewrite-autofix-safety.js.map +1 -1
- package/dist/plugin.cjs +571 -662
- package/dist/plugin.cjs.map +4 -4
- package/dist/plugin.d.cts +2 -1
- package/dist/plugin.d.ts +2 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +8 -7
- package/dist/plugin.js.map +1 -1
- package/dist/rules/no-floating-abort-controllers.d.ts.map +1 -1
- package/dist/rules/no-floating-abort-controllers.js +24 -52
- package/dist/rules/no-floating-abort-controllers.js.map +1 -1
- package/dist/rules/no-floating-audio-contexts.d.ts.map +1 -1
- package/dist/rules/no-floating-audio-contexts.js +7 -6
- package/dist/rules/no-floating-audio-contexts.js.map +1 -1
- package/dist/rules/no-floating-broadcast-channels.d.ts.map +1 -1
- package/dist/rules/no-floating-broadcast-channels.js +31 -59
- package/dist/rules/no-floating-broadcast-channels.js.map +1 -1
- package/dist/rules/no-floating-child-processes.d.ts.map +1 -1
- package/dist/rules/no-floating-child-processes.js +43 -45
- package/dist/rules/no-floating-child-processes.js.map +1 -1
- package/dist/rules/no-floating-disposable-stacks.d.ts.map +1 -1
- package/dist/rules/no-floating-disposable-stacks.js +37 -38
- package/dist/rules/no-floating-disposable-stacks.js.map +1 -1
- package/dist/rules/no-floating-file-watchers.d.ts.map +1 -1
- package/dist/rules/no-floating-file-watchers.js +40 -42
- package/dist/rules/no-floating-file-watchers.js.map +1 -1
- package/dist/rules/no-floating-geolocation-watches.js +20 -20
- package/dist/rules/no-floating-geolocation-watches.js.map +1 -1
- package/dist/rules/no-floating-infinite-animations.d.ts.map +1 -1
- package/dist/rules/no-floating-infinite-animations.js +4 -3
- package/dist/rules/no-floating-infinite-animations.js.map +1 -1
- package/dist/rules/no-floating-media-streams.d.ts.map +1 -1
- package/dist/rules/no-floating-media-streams.js +24 -24
- package/dist/rules/no-floating-media-streams.js.map +1 -1
- package/dist/rules/no-floating-message-channels.js +30 -30
- package/dist/rules/no-floating-message-channels.js.map +1 -1
- package/dist/rules/no-floating-network-connections.d.ts.map +1 -1
- package/dist/rules/no-floating-network-connections.js +36 -36
- package/dist/rules/no-floating-network-connections.js.map +1 -1
- package/dist/rules/no-floating-object-urls.d.ts.map +1 -1
- package/dist/rules/no-floating-object-urls.js +4 -3
- package/dist/rules/no-floating-object-urls.js.map +1 -1
- package/dist/rules/no-floating-observers.d.ts.map +1 -1
- package/dist/rules/no-floating-observers.js +33 -34
- package/dist/rules/no-floating-observers.js.map +1 -1
- package/dist/rules/no-floating-servers.d.ts.map +1 -1
- package/dist/rules/no-floating-servers.js +50 -52
- package/dist/rules/no-floating-servers.js.map +1 -1
- package/dist/rules/no-floating-streams.d.ts.map +1 -1
- package/dist/rules/no-floating-streams.js +28 -29
- package/dist/rules/no-floating-streams.js.map +1 -1
- package/dist/rules/no-floating-timers.d.ts.map +1 -1
- package/dist/rules/no-floating-timers.js +7 -47
- package/dist/rules/no-floating-timers.js.map +1 -1
- package/dist/rules/no-floating-wake-locks.js +20 -20
- package/dist/rules/no-floating-wake-locks.js.map +1 -1
- package/dist/rules/no-floating-web-stream-locks.d.ts.map +1 -1
- package/dist/rules/no-floating-web-stream-locks.js +4 -3
- package/dist/rules/no-floating-web-stream-locks.js.map +1 -1
- package/dist/rules/no-floating-workers.d.ts.map +1 -1
- package/dist/rules/no-floating-workers.js +39 -40
- package/dist/rules/no-floating-workers.js.map +1 -1
- package/dist/rules/no-unmanaged-event-listeners.d.ts.map +1 -1
- package/dist/rules/no-unmanaged-event-listeners.js +23 -23
- package/dist/rules/no-unmanaged-event-listeners.js.map +1 -1
- package/docs/rules/no-floating-audio-contexts.md +1 -2
- package/docs/rules/no-floating-media-streams.md +1 -1
- package/docs/rules/no-floating-object-urls.md +3 -3
- package/docs/rules/no-floating-observers.md +1 -1
- package/docs/rules/no-floating-servers.md +1 -1
- package/docs/rules/no-floating-wake-locks.md +1 -1
- package/docs/rules/no-floating-web-stream-locks.md +1 -2
- package/docs/rules/presets/index.md +28 -28
- package/package.json +7 -4
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require child process handles to be retained so they can be killed during cleanup.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { arrayFirst, isDefined, setHas } from "ts-extras";
|
|
6
7
|
import { getParentNode } from "../_internal/ast-node.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { getVariableInScopeChain } from "../_internal/scope-variable.js";
|
|
@@ -24,8 +25,8 @@ const immediateCleanupMethodNames = [
|
|
|
24
25
|
const childProcessFactoryNameSet = new Set(childProcessFactoryNames);
|
|
25
26
|
const childProcessModuleNameSet = new Set(childProcessModuleNames);
|
|
26
27
|
const immediateCleanupMethodNameSet = new Set(immediateCleanupMethodNames);
|
|
27
|
-
const isChildProcessFactoryName = (name) => childProcessFactoryNameSet
|
|
28
|
-
const isImmediateCleanupMethodName = (name) => immediateCleanupMethodNameSet
|
|
28
|
+
const isChildProcessFactoryName = (name) => setHas(childProcessFactoryNameSet, name);
|
|
29
|
+
const isImmediateCleanupMethodName = (name) => setHas(immediateCleanupMethodNameSet, name);
|
|
29
30
|
const getTransparentWrappedExpression = (node) => {
|
|
30
31
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
31
32
|
return node.expression;
|
|
@@ -88,31 +89,30 @@ const getDefinitionModuleSource = (node) => {
|
|
|
88
89
|
const getImportedSpecifierName = (node) => getStaticPropertyName(node.imported);
|
|
89
90
|
const getObjectPatternPropertyNameForIdentifier = (objectPattern, identifierName) => {
|
|
90
91
|
for (const property of objectPattern.properties) {
|
|
91
|
-
if (property.type
|
|
92
|
-
property.value.type
|
|
93
|
-
property.value.name
|
|
94
|
-
|
|
92
|
+
if (property.type === AST_NODE_TYPES.Property &&
|
|
93
|
+
property.value.type === AST_NODE_TYPES.Identifier &&
|
|
94
|
+
property.value.name === identifierName) {
|
|
95
|
+
return getStaticPropertyName(property.key);
|
|
95
96
|
}
|
|
96
|
-
return getStaticPropertyName(property.key);
|
|
97
97
|
}
|
|
98
98
|
return undefined;
|
|
99
99
|
};
|
|
100
|
-
const isChildProcessModuleSource = (source) => source
|
|
100
|
+
const isChildProcessModuleSource = (source) => isDefined(source) && setHas(childProcessModuleNameSet, source);
|
|
101
101
|
const getDefinitionForIdentifier = (context, identifier) => {
|
|
102
102
|
const scope = context.sourceCode.getScope(identifier);
|
|
103
103
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
104
|
-
return variable?.defs[
|
|
104
|
+
return arrayFirst(variable?.defs ?? []);
|
|
105
105
|
};
|
|
106
106
|
const isChildProcessModuleBinding = (context, identifier) => {
|
|
107
107
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
108
|
-
if (definition
|
|
108
|
+
if (!isDefined(definition)) {
|
|
109
109
|
return false;
|
|
110
110
|
}
|
|
111
111
|
return isChildProcessModuleSource(getDefinitionModuleSource(definition.node));
|
|
112
112
|
};
|
|
113
113
|
const getNamedChildProcessFactoryBindingName = (context, identifier) => {
|
|
114
114
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
115
|
-
if (definition
|
|
115
|
+
if (!isDefined(definition)) {
|
|
116
116
|
return undefined;
|
|
117
117
|
}
|
|
118
118
|
const source = getDefinitionModuleSource(definition.node);
|
|
@@ -121,7 +121,7 @@ const getNamedChildProcessFactoryBindingName = (context, identifier) => {
|
|
|
121
121
|
}
|
|
122
122
|
if (definition.node.type === AST_NODE_TYPES.ImportSpecifier) {
|
|
123
123
|
const importedName = getImportedSpecifierName(definition.node);
|
|
124
|
-
return importedName
|
|
124
|
+
return isDefined(importedName) &&
|
|
125
125
|
isChildProcessFactoryName(importedName)
|
|
126
126
|
? importedName
|
|
127
127
|
: undefined;
|
|
@@ -129,7 +129,7 @@ const getNamedChildProcessFactoryBindingName = (context, identifier) => {
|
|
|
129
129
|
if (definition.node.type === AST_NODE_TYPES.VariableDeclarator &&
|
|
130
130
|
definition.node.id.type === AST_NODE_TYPES.ObjectPattern) {
|
|
131
131
|
const propertyName = getObjectPatternPropertyNameForIdentifier(definition.node.id, identifier.name);
|
|
132
|
-
return propertyName
|
|
132
|
+
return isDefined(propertyName) &&
|
|
133
133
|
isChildProcessFactoryName(propertyName)
|
|
134
134
|
? propertyName
|
|
135
135
|
: undefined;
|
|
@@ -170,47 +170,45 @@ const getChildProcessFactoryName = (context, callee) => {
|
|
|
170
170
|
const isDiscardedChildProcessHandle = (node) => {
|
|
171
171
|
let current = node;
|
|
172
172
|
let parent = getParentNode(current);
|
|
173
|
-
while (parent
|
|
173
|
+
while (isDefined(parent)) {
|
|
174
174
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
175
|
-
if (wrappedExpression
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const unaryParent = getParentNode(parent);
|
|
188
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
175
|
+
if (wrappedExpression !== current) {
|
|
176
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
177
|
+
parent.expression === current) {
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
181
|
+
parent.operator === "void" &&
|
|
182
|
+
parent.argument === current) {
|
|
183
|
+
const unaryParent = getParentNode(parent);
|
|
184
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
189
187
|
}
|
|
190
|
-
|
|
188
|
+
current = parent;
|
|
189
|
+
parent = getParentNode(current);
|
|
191
190
|
}
|
|
192
191
|
return false;
|
|
193
192
|
};
|
|
194
193
|
const isImmediateChildProcessMethodReceiver = (node) => {
|
|
195
194
|
let current = node;
|
|
196
195
|
let parent = getParentNode(current);
|
|
197
|
-
while (parent
|
|
196
|
+
while (isDefined(parent)) {
|
|
198
197
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
199
|
-
if (wrappedExpression
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
198
|
+
if (wrappedExpression !== current) {
|
|
199
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
200
|
+
parent.object !== current ||
|
|
201
|
+
parent.computed ||
|
|
202
|
+
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
203
|
+
isImmediateCleanupMethodName(parent.property.name)) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const callExpression = getParentNode(parent);
|
|
207
|
+
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
208
|
+
callExpression.callee === parent);
|
|
210
209
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
callExpression.callee === parent);
|
|
210
|
+
current = parent;
|
|
211
|
+
parent = getParentNode(current);
|
|
214
212
|
}
|
|
215
213
|
return false;
|
|
216
214
|
};
|
|
@@ -220,7 +218,7 @@ const noFloatingChildProcesses = createTypedRule({
|
|
|
220
218
|
return {
|
|
221
219
|
CallExpression(node) {
|
|
222
220
|
const factoryName = getChildProcessFactoryName(context, node.callee);
|
|
223
|
-
if (factoryName
|
|
221
|
+
if (!isDefined(factoryName) ||
|
|
224
222
|
(!isDiscardedChildProcessHandle(node) &&
|
|
225
223
|
!isImmediateChildProcessMethodReceiver(node))) {
|
|
226
224
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-child-processes.js","sourceRoot":"","sources":["../../src/rules/no-floating-child-processes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-child-processes.js","sourceRoot":"","sources":["../../src/rules/no-floating-child-processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-disposable-stacks.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-disposable-stacks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-disposable-stacks.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-disposable-stacks.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAkOlC,+EAA+E;AAC/E,QAAA,MAAM,0BAA0B,EAAE,QAAQ,CAAC,UAAU,CACjD,yBAAyB,EACzB,SAAS,EAAE,CAiDb,CAAC;AAEH,eAAe,0BAA0B,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require DisposableStack handles to be retained so registered disposers run.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { isDefined, setHas } from "ts-extras";
|
|
6
7
|
import { getParentNode } from "../_internal/ast-node.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { getVariableInScopeChain } from "../_internal/scope-variable.js";
|
|
@@ -23,9 +24,9 @@ const globalReceiverNames = [
|
|
|
23
24
|
const disposableStackConstructorNameSet = new Set(disposableStackConstructorNames);
|
|
24
25
|
const cleanupMethodNameSet = new Set(cleanupMethodNames);
|
|
25
26
|
const globalReceiverNameSet = new Set(globalReceiverNames);
|
|
26
|
-
const isDisposableStackConstructorName = (name) => disposableStackConstructorNameSet
|
|
27
|
-
const isCleanupMethodName = (name) => cleanupMethodNameSet
|
|
28
|
-
const isGlobalReceiverName = (name) => globalReceiverNameSet
|
|
27
|
+
const isDisposableStackConstructorName = (name) => setHas(disposableStackConstructorNameSet, name);
|
|
28
|
+
const isCleanupMethodName = (name) => setHas(cleanupMethodNameSet, name);
|
|
29
|
+
const isGlobalReceiverName = (name) => setHas(globalReceiverNameSet, name);
|
|
29
30
|
const getTransparentWrappedExpression = (node) => {
|
|
30
31
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
31
32
|
return node.expression;
|
|
@@ -76,7 +77,7 @@ const getMemberDisposableStackConstructorName = (callee) => {
|
|
|
76
77
|
return undefined;
|
|
77
78
|
}
|
|
78
79
|
const constructorName = getStaticPropertyName(callee.property, callee.computed);
|
|
79
|
-
return constructorName
|
|
80
|
+
return isDefined(constructorName) &&
|
|
80
81
|
isDisposableStackConstructorName(constructorName)
|
|
81
82
|
? constructorName
|
|
82
83
|
: undefined;
|
|
@@ -86,49 +87,47 @@ const getDisposableStackConstructorName = (context, callee) => getDirectDisposab
|
|
|
86
87
|
const isDiscardedDisposableStack = (node) => {
|
|
87
88
|
let current = node;
|
|
88
89
|
let parent = getParentNode(current);
|
|
89
|
-
while (parent
|
|
90
|
+
while (isDefined(parent)) {
|
|
90
91
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
91
|
-
if (wrappedExpression
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const unaryParent = getParentNode(parent);
|
|
104
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
92
|
+
if (wrappedExpression !== current) {
|
|
93
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
94
|
+
parent.expression === current) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
98
|
+
parent.operator === "void" &&
|
|
99
|
+
parent.argument === current) {
|
|
100
|
+
const unaryParent = getParentNode(parent);
|
|
101
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
105
104
|
}
|
|
106
|
-
|
|
105
|
+
current = parent;
|
|
106
|
+
parent = getParentNode(current);
|
|
107
107
|
}
|
|
108
108
|
return false;
|
|
109
109
|
};
|
|
110
110
|
const isImmediateDisposableStackMethodReceiver = (node) => {
|
|
111
111
|
let current = node;
|
|
112
112
|
let parent = getParentNode(current);
|
|
113
|
-
while (parent
|
|
113
|
+
while (isDefined(parent)) {
|
|
114
114
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
115
|
-
if (wrappedExpression
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
parent.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
115
|
+
if (wrappedExpression !== current) {
|
|
116
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
117
|
+
parent.object !== current ||
|
|
118
|
+
parent.optional) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const methodName = getStaticPropertyName(parent.property, parent.computed);
|
|
122
|
+
if (!isDefined(methodName) || isCleanupMethodName(methodName)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const callExpression = getParentNode(parent);
|
|
126
|
+
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
127
|
+
callExpression.callee === parent);
|
|
128
128
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
callExpression.callee === parent);
|
|
129
|
+
current = parent;
|
|
130
|
+
parent = getParentNode(current);
|
|
132
131
|
}
|
|
133
132
|
return false;
|
|
134
133
|
};
|
|
@@ -138,7 +137,7 @@ const noFloatingDisposableStacks = createTypedRule({
|
|
|
138
137
|
return {
|
|
139
138
|
NewExpression(node) {
|
|
140
139
|
const constructorName = getDisposableStackConstructorName(context, node.callee);
|
|
141
|
-
if (constructorName
|
|
140
|
+
if (!isDefined(constructorName) ||
|
|
142
141
|
(!isDiscardedDisposableStack(node) &&
|
|
143
142
|
!isImmediateDisposableStackMethodReceiver(node))) {
|
|
144
143
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-disposable-stacks.js","sourceRoot":"","sources":["../../src/rules/no-floating-disposable-stacks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-disposable-stacks.js","sourceRoot":"","sources":["../../src/rules/no-floating-disposable-stacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-file-watchers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-file-watchers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-floating-file-watchers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-file-watchers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAqUlC,2EAA2E;AAC3E,QAAA,MAAM,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAC7C,qBAAqB,EACrB,SAAS,EAAE,CAiDb,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require Node.js file watcher handles to be retained so they can be closed.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { arrayFirst, isDefined, setHas } from "ts-extras";
|
|
6
7
|
import { getParentNode } from "../_internal/ast-node.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { getVariableInScopeChain } from "../_internal/scope-variable.js";
|
|
@@ -12,7 +13,7 @@ const fsModuleNames = ["fs", "node:fs"];
|
|
|
12
13
|
const immediateCleanupMethodNames = ["close"];
|
|
13
14
|
const fsModuleNameSet = new Set(fsModuleNames);
|
|
14
15
|
const immediateCleanupMethodNameSet = new Set(immediateCleanupMethodNames);
|
|
15
|
-
const isImmediateCleanupMethodName = (name) => immediateCleanupMethodNameSet
|
|
16
|
+
const isImmediateCleanupMethodName = (name) => setHas(immediateCleanupMethodNameSet, name);
|
|
16
17
|
const getTransparentWrappedExpression = (node) => {
|
|
17
18
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
18
19
|
return node.expression;
|
|
@@ -72,32 +73,31 @@ const getDefinitionModuleSource = (node) => {
|
|
|
72
73
|
}
|
|
73
74
|
return undefined;
|
|
74
75
|
};
|
|
75
|
-
const isFsModuleSource = (source) => source
|
|
76
|
+
const isFsModuleSource = (source) => isDefined(source) && setHas(fsModuleNameSet, source);
|
|
76
77
|
const getDefinitionForIdentifier = (context, identifier) => {
|
|
77
78
|
const scope = context.sourceCode.getScope(identifier);
|
|
78
79
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
79
|
-
return variable?.defs[
|
|
80
|
+
return arrayFirst(variable?.defs ?? []);
|
|
80
81
|
};
|
|
81
82
|
const isFsModuleBinding = (context, identifier) => {
|
|
82
83
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
83
|
-
return (definition
|
|
84
|
+
return (isDefined(definition) &&
|
|
84
85
|
isFsModuleSource(getDefinitionModuleSource(definition.node)));
|
|
85
86
|
};
|
|
86
87
|
const getImportedSpecifierName = (node) => getStaticPropertyName(node.imported);
|
|
87
88
|
const getObjectPatternPropertyNameForIdentifier = (objectPattern, identifierName) => {
|
|
88
89
|
for (const property of objectPattern.properties) {
|
|
89
|
-
if (property.type
|
|
90
|
-
property.value.type
|
|
91
|
-
property.value.name
|
|
92
|
-
|
|
90
|
+
if (property.type === AST_NODE_TYPES.Property &&
|
|
91
|
+
property.value.type === AST_NODE_TYPES.Identifier &&
|
|
92
|
+
property.value.name === identifierName) {
|
|
93
|
+
return getStaticPropertyName(property.key);
|
|
93
94
|
}
|
|
94
|
-
return getStaticPropertyName(property.key);
|
|
95
95
|
}
|
|
96
96
|
return undefined;
|
|
97
97
|
};
|
|
98
98
|
const getNamedFileWatcherBindingName = (context, identifier) => {
|
|
99
99
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
100
|
-
if (definition
|
|
100
|
+
if (!isDefined(definition)) {
|
|
101
101
|
return undefined;
|
|
102
102
|
}
|
|
103
103
|
const source = getDefinitionModuleSource(definition.node);
|
|
@@ -152,47 +152,45 @@ const getFileWatcherFactoryName = (context, callee) => {
|
|
|
152
152
|
const isDiscardedFileWatcherHandle = (node) => {
|
|
153
153
|
let current = node;
|
|
154
154
|
let parent = getParentNode(current);
|
|
155
|
-
while (parent
|
|
155
|
+
while (isDefined(parent)) {
|
|
156
156
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
157
|
-
if (wrappedExpression
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const unaryParent = getParentNode(parent);
|
|
170
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
157
|
+
if (wrappedExpression !== current) {
|
|
158
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
159
|
+
parent.expression === current) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
163
|
+
parent.operator === "void" &&
|
|
164
|
+
parent.argument === current) {
|
|
165
|
+
const unaryParent = getParentNode(parent);
|
|
166
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
171
169
|
}
|
|
172
|
-
|
|
170
|
+
current = parent;
|
|
171
|
+
parent = getParentNode(current);
|
|
173
172
|
}
|
|
174
173
|
return false;
|
|
175
174
|
};
|
|
176
175
|
const isImmediateFileWatcherMethodReceiver = (node) => {
|
|
177
176
|
let current = node;
|
|
178
177
|
let parent = getParentNode(current);
|
|
179
|
-
while (parent
|
|
178
|
+
while (isDefined(parent)) {
|
|
180
179
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
181
|
-
if (wrappedExpression
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
180
|
+
if (wrappedExpression !== current) {
|
|
181
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
182
|
+
parent.object !== current ||
|
|
183
|
+
parent.computed ||
|
|
184
|
+
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
185
|
+
isImmediateCleanupMethodName(parent.property.name)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
const callExpression = getParentNode(parent);
|
|
189
|
+
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
190
|
+
callExpression.callee === parent);
|
|
192
191
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
callExpression.callee === parent);
|
|
192
|
+
current = parent;
|
|
193
|
+
parent = getParentNode(current);
|
|
196
194
|
}
|
|
197
195
|
return false;
|
|
198
196
|
};
|
|
@@ -202,7 +200,7 @@ const noFloatingFileWatchers = createTypedRule({
|
|
|
202
200
|
return {
|
|
203
201
|
CallExpression(node) {
|
|
204
202
|
const factoryName = getFileWatcherFactoryName(context, node.callee);
|
|
205
|
-
if (factoryName
|
|
203
|
+
if (!isDefined(factoryName) ||
|
|
206
204
|
(!isDiscardedFileWatcherHandle(node) &&
|
|
207
205
|
!isImmediateFileWatcherMethodReceiver(node))) {
|
|
208
206
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-file-watchers.js","sourceRoot":"","sources":["../../src/rules/no-floating-file-watchers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,cAAc,GAGjB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-floating-file-watchers.js","sourceRoot":"","sources":["../../src/rules/no-floating-file-watchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require geolocation watch IDs to be retained so they can be cleared.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { arrayFirst, isDefined, setHas } from "ts-extras";
|
|
6
7
|
import { getParentNode } from "../_internal/ast-node.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { getVariableInScopeChain } from "../_internal/scope-variable.js";
|
|
@@ -48,7 +49,7 @@ const collectStaticMemberPath = (node) => {
|
|
|
48
49
|
}
|
|
49
50
|
const objectPath = collectStaticMemberPath(node.object);
|
|
50
51
|
const propertyName = getStaticPropertyName(node.property, node.computed);
|
|
51
|
-
return objectPath
|
|
52
|
+
return !isDefined(objectPath) || !isDefined(propertyName)
|
|
52
53
|
? undefined
|
|
53
54
|
: [...objectPath, propertyName];
|
|
54
55
|
};
|
|
@@ -74,11 +75,11 @@ const isNavigatorPathShadowed = (context, callee) => {
|
|
|
74
75
|
isShadowedNavigatorIdentifier(context, rootIdentifier));
|
|
75
76
|
};
|
|
76
77
|
const isGeolocationWatchPath = (path) => (path.length === 3 &&
|
|
77
|
-
path
|
|
78
|
+
arrayFirst(path) === "navigator" &&
|
|
78
79
|
path[1] === "geolocation" &&
|
|
79
80
|
path[2] === geolocationWatchFunctionName) ||
|
|
80
81
|
(path.length === 4 &&
|
|
81
|
-
globalNavigatorReceiverNameSet
|
|
82
|
+
setHas(globalNavigatorReceiverNameSet, arrayFirst(path) ?? "") &&
|
|
82
83
|
path[1] === "navigator" &&
|
|
83
84
|
path[2] === "geolocation" &&
|
|
84
85
|
path[3] === geolocationWatchFunctionName);
|
|
@@ -88,29 +89,28 @@ const isGeolocationWatchCall = (context, callee) => {
|
|
|
88
89
|
return false;
|
|
89
90
|
}
|
|
90
91
|
const path = collectStaticMemberPath(callee);
|
|
91
|
-
return path
|
|
92
|
+
return isDefined(path) && isGeolocationWatchPath(path);
|
|
92
93
|
};
|
|
93
94
|
const isDiscardedWatchId = (node) => {
|
|
94
95
|
let current = node;
|
|
95
96
|
let parent = getParentNode(current);
|
|
96
|
-
while (parent
|
|
97
|
+
while (isDefined(parent)) {
|
|
97
98
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
98
|
-
if (wrappedExpression
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
if (wrappedExpression !== current) {
|
|
100
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
101
|
+
parent.expression === current) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
105
|
+
parent.operator === "void" &&
|
|
106
|
+
parent.argument === current) {
|
|
107
|
+
const unaryParent = getParentNode(parent);
|
|
108
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
102
111
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
108
|
-
parent.operator === "void" &&
|
|
109
|
-
parent.argument === current) {
|
|
110
|
-
const unaryParent = getParentNode(parent);
|
|
111
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
112
|
+
current = parent;
|
|
113
|
+
parent = getParentNode(current);
|
|
114
114
|
}
|
|
115
115
|
return false;
|
|
116
116
|
};
|