eslint-plugin-runtime-cleanup 1.2.9 → 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/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 +2 -1
- 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 +565 -656
- 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/package.json +7 -4
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require observer instances to be retained so they can be disconnected.
|
|
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";
|
|
@@ -21,8 +22,8 @@ const globalReceiverNames = [
|
|
|
21
22
|
];
|
|
22
23
|
const globalReceiverNameSet = new Set(globalReceiverNames);
|
|
23
24
|
const observerConstructorNameSet = new Set(observerConstructorNames);
|
|
24
|
-
const isGlobalReceiverName = (name) => globalReceiverNameSet
|
|
25
|
-
const isObserverConstructorName = (name) => observerConstructorNameSet
|
|
25
|
+
const isGlobalReceiverName = (name) => setHas(globalReceiverNameSet, name);
|
|
26
|
+
const isObserverConstructorName = (name) => setHas(observerConstructorNameSet, name);
|
|
26
27
|
const getTransparentWrappedExpression = (node) => {
|
|
27
28
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
28
29
|
return node.expression;
|
|
@@ -71,47 +72,45 @@ const getObserverConstructorName = (context, callee) => getDirectObserverConstru
|
|
|
71
72
|
const isObserveMethodCallReceiver = (node) => {
|
|
72
73
|
let current = node;
|
|
73
74
|
let parent = getParentNode(current);
|
|
74
|
-
while (parent
|
|
75
|
+
while (isDefined(parent)) {
|
|
75
76
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
76
|
-
if (wrappedExpression
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
if (wrappedExpression !== current) {
|
|
78
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
79
|
+
parent.object !== current ||
|
|
80
|
+
parent.computed ||
|
|
81
|
+
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
82
|
+
parent.property.name !== "observe") {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const callExpression = getParentNode(parent);
|
|
86
|
+
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
87
|
+
callExpression.callee === parent);
|
|
80
88
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
parent.computed ||
|
|
84
|
-
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
85
|
-
parent.property.name !== "observe") {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
const callExpression = getParentNode(parent);
|
|
89
|
-
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
90
|
-
callExpression.callee === parent);
|
|
89
|
+
current = parent;
|
|
90
|
+
parent = getParentNode(current);
|
|
91
91
|
}
|
|
92
92
|
return false;
|
|
93
93
|
};
|
|
94
94
|
const isDiscardedObserverInstance = (node) => {
|
|
95
95
|
let current = node;
|
|
96
96
|
let parent = getParentNode(current);
|
|
97
|
-
while (parent
|
|
97
|
+
while (isDefined(parent)) {
|
|
98
98
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
99
|
-
if (wrappedExpression
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const unaryParent = getParentNode(parent);
|
|
112
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
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;
|
|
113
111
|
}
|
|
114
|
-
|
|
112
|
+
current = parent;
|
|
113
|
+
parent = getParentNode(current);
|
|
115
114
|
}
|
|
116
115
|
return false;
|
|
117
116
|
};
|
|
@@ -121,7 +120,7 @@ const noFloatingObservers = createTypedRule({
|
|
|
121
120
|
return {
|
|
122
121
|
NewExpression(node) {
|
|
123
122
|
const observerName = getObserverConstructorName(context, node.callee);
|
|
124
|
-
if (observerName
|
|
123
|
+
if (!isDefined(observerName) ||
|
|
125
124
|
(!isDiscardedObserverInstance(node) &&
|
|
126
125
|
!isObserveMethodCallReceiver(node))) {
|
|
127
126
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-observers.js","sourceRoot":"","sources":["../../src/rules/no-floating-observers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-observers.js","sourceRoot":"","sources":["../../src/rules/no-floating-observers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-servers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-servers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-servers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-servers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAuYlC,qEAAqE;AACrE,QAAA,MAAM,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CACxC,gBAAgB,EAChB,SAAS,EAAE,CA6Cb,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require Node.js server 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";
|
|
@@ -29,11 +30,11 @@ const http2OnlyServerFactoryNameSet = new Set(http2OnlyServerFactoryNames);
|
|
|
29
30
|
const serverModuleNameSet = new Set(serverModuleNames);
|
|
30
31
|
const http2ServerModuleNameSet = new Set(http2ServerModuleNames);
|
|
31
32
|
const immediateCleanupMethodNameSet = new Set(immediateCleanupMethodNames);
|
|
32
|
-
const isServerFactoryName = (name) => serverFactoryNameSet
|
|
33
|
-
const isHttp2OnlyServerFactoryName = (name) => http2OnlyServerFactoryNameSet
|
|
34
|
-
const isServerModuleSource = (source) => source
|
|
35
|
-
const isHttp2ServerModuleSource = (source) => source
|
|
36
|
-
const isImmediateCleanupMethodName = (name) => immediateCleanupMethodNameSet
|
|
33
|
+
const isServerFactoryName = (name) => setHas(serverFactoryNameSet, name);
|
|
34
|
+
const isHttp2OnlyServerFactoryName = (name) => setHas(http2OnlyServerFactoryNameSet, name);
|
|
35
|
+
const isServerModuleSource = (source) => isDefined(source) && setHas(serverModuleNameSet, source);
|
|
36
|
+
const isHttp2ServerModuleSource = (source) => isDefined(source) && setHas(http2ServerModuleNameSet, source);
|
|
37
|
+
const isImmediateCleanupMethodName = (name) => setHas(immediateCleanupMethodNameSet, name);
|
|
37
38
|
const isValidServerFactoryForSource = (source, factoryName) => isServerModuleSource(source) &&
|
|
38
39
|
isServerFactoryName(factoryName) &&
|
|
39
40
|
(!isHttp2OnlyServerFactoryName(factoryName) ||
|
|
@@ -100,35 +101,34 @@ const getDefinitionModuleSource = (node) => {
|
|
|
100
101
|
const getDefinitionForIdentifier = (context, identifier) => {
|
|
101
102
|
const scope = context.sourceCode.getScope(identifier);
|
|
102
103
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
103
|
-
return variable?.defs[
|
|
104
|
+
return arrayFirst(variable?.defs ?? []);
|
|
104
105
|
};
|
|
105
106
|
const getImportedSpecifierName = (node) => getStaticPropertyName(node.imported);
|
|
106
107
|
const getObjectPatternPropertyNameForIdentifier = (objectPattern, identifierName) => {
|
|
107
108
|
for (const property of objectPattern.properties) {
|
|
108
|
-
if (property.type
|
|
109
|
-
property.value.type
|
|
110
|
-
property.value.name
|
|
111
|
-
|
|
109
|
+
if (property.type === AST_NODE_TYPES.Property &&
|
|
110
|
+
property.value.type === AST_NODE_TYPES.Identifier &&
|
|
111
|
+
property.value.name === identifierName) {
|
|
112
|
+
return getStaticPropertyName(property.key);
|
|
112
113
|
}
|
|
113
|
-
return getStaticPropertyName(property.key);
|
|
114
114
|
}
|
|
115
115
|
return undefined;
|
|
116
116
|
};
|
|
117
117
|
const getModuleSourceForBinding = (context, identifier) => {
|
|
118
118
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
119
|
-
return definition
|
|
120
|
-
?
|
|
121
|
-
:
|
|
119
|
+
return isDefined(definition)
|
|
120
|
+
? getDefinitionModuleSource(definition.node)
|
|
121
|
+
: undefined;
|
|
122
122
|
};
|
|
123
123
|
const getNamedServerFactoryBindingName = (context, identifier) => {
|
|
124
124
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
125
|
-
if (definition
|
|
125
|
+
if (!isDefined(definition)) {
|
|
126
126
|
return undefined;
|
|
127
127
|
}
|
|
128
128
|
const source = getDefinitionModuleSource(definition.node);
|
|
129
129
|
if (definition.node.type === AST_NODE_TYPES.ImportSpecifier) {
|
|
130
130
|
const importedName = getImportedSpecifierName(definition.node);
|
|
131
|
-
return importedName
|
|
131
|
+
return isDefined(importedName) &&
|
|
132
132
|
isValidServerFactoryForSource(source, importedName)
|
|
133
133
|
? importedName
|
|
134
134
|
: undefined;
|
|
@@ -136,7 +136,7 @@ const getNamedServerFactoryBindingName = (context, identifier) => {
|
|
|
136
136
|
if (definition.node.type === AST_NODE_TYPES.VariableDeclarator &&
|
|
137
137
|
definition.node.id.type === AST_NODE_TYPES.ObjectPattern) {
|
|
138
138
|
const propertyName = getObjectPatternPropertyNameForIdentifier(definition.node.id, identifier.name);
|
|
139
|
-
return propertyName
|
|
139
|
+
return isDefined(propertyName) &&
|
|
140
140
|
isValidServerFactoryForSource(source, propertyName)
|
|
141
141
|
? propertyName
|
|
142
142
|
: undefined;
|
|
@@ -181,55 +181,53 @@ const getServerFactoryName = (context, callee) => {
|
|
|
181
181
|
const isDiscardedExpression = (node) => {
|
|
182
182
|
let current = node;
|
|
183
183
|
let parent = getParentNode(current);
|
|
184
|
-
while (parent
|
|
184
|
+
while (isDefined(parent)) {
|
|
185
185
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
186
|
-
if (wrappedExpression
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
186
|
+
if (wrappedExpression !== current) {
|
|
187
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
188
|
+
parent.expression === current) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
192
|
+
parent.operator === "void" &&
|
|
193
|
+
parent.argument === current) {
|
|
194
|
+
const unaryParent = getParentNode(parent);
|
|
195
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
194
198
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
parent.argument === current) {
|
|
198
|
-
const unaryParent = getParentNode(parent);
|
|
199
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
200
|
-
}
|
|
201
|
-
return false;
|
|
199
|
+
current = parent;
|
|
200
|
+
parent = getParentNode(current);
|
|
202
201
|
}
|
|
203
202
|
return false;
|
|
204
203
|
};
|
|
205
204
|
const getImmediateServerMethodCall = (node) => {
|
|
206
205
|
let current = node;
|
|
207
206
|
let parent = getParentNode(current);
|
|
208
|
-
while (parent
|
|
207
|
+
while (isDefined(parent)) {
|
|
209
208
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
210
|
-
if (wrappedExpression
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
209
|
+
if (wrappedExpression !== current) {
|
|
210
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
211
|
+
parent.object !== current ||
|
|
212
|
+
parent.computed ||
|
|
213
|
+
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
214
|
+
isImmediateCleanupMethodName(parent.property.name)) {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
const callExpression = getParentNode(parent);
|
|
218
|
+
return callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
219
|
+
callExpression.callee === parent
|
|
220
|
+
? callExpression
|
|
221
|
+
: undefined;
|
|
221
222
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
callExpression.callee === parent
|
|
225
|
-
? callExpression
|
|
226
|
-
: undefined;
|
|
223
|
+
current = parent;
|
|
224
|
+
parent = getParentNode(current);
|
|
227
225
|
}
|
|
228
226
|
return undefined;
|
|
229
227
|
};
|
|
230
228
|
const isDiscardedImmediateServerMethodChain = (node) => {
|
|
231
229
|
let currentCall = getImmediateServerMethodCall(node);
|
|
232
|
-
while (currentCall
|
|
230
|
+
while (isDefined(currentCall)) {
|
|
233
231
|
if (isDiscardedExpression(currentCall)) {
|
|
234
232
|
return true;
|
|
235
233
|
}
|
|
@@ -244,7 +242,7 @@ const noFloatingServers = createTypedRule({
|
|
|
244
242
|
return {
|
|
245
243
|
CallExpression(node) {
|
|
246
244
|
const factoryName = getServerFactoryName(context, node.callee);
|
|
247
|
-
if (factoryName
|
|
245
|
+
if (!isDefined(factoryName) ||
|
|
248
246
|
!isDiscardedServerHandle(node)) {
|
|
249
247
|
return;
|
|
250
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-servers.js","sourceRoot":"","sources":["../../src/rules/no-floating-servers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-servers.js","sourceRoot":"","sources":["../../src/rules/no-floating-servers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-streams.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-streams.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-streams.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-streams.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AA2SlC,qEAAqE;AACrE,QAAA,MAAM,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAgDpE,CAAC;AAEP,eAAe,iBAAiB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require Node.js file stream handles to be retained so they can be closed 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";
|
|
@@ -14,7 +15,7 @@ const fileStreamFactoryNames = [
|
|
|
14
15
|
const fsModuleNames = ["fs", "node:fs"];
|
|
15
16
|
const fileStreamFactoryNameSet = new Set(fileStreamFactoryNames);
|
|
16
17
|
const fsModuleNameSet = new Set(fsModuleNames);
|
|
17
|
-
const isFileStreamFactoryName = (name) => fileStreamFactoryNameSet
|
|
18
|
+
const isFileStreamFactoryName = (name) => setHas(fileStreamFactoryNameSet, name);
|
|
18
19
|
const getTransparentWrappedExpression = (node) => {
|
|
19
20
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
20
21
|
return node.expression;
|
|
@@ -77,29 +78,28 @@ const getDefinitionModuleSource = (node) => {
|
|
|
77
78
|
const getImportedSpecifierName = (node) => getStaticPropertyName(node.imported);
|
|
78
79
|
const getObjectPatternPropertyNameForIdentifier = (objectPattern, identifierName) => {
|
|
79
80
|
for (const property of objectPattern.properties) {
|
|
80
|
-
if (property.type
|
|
81
|
-
property.value.type
|
|
82
|
-
property.value.name
|
|
83
|
-
|
|
81
|
+
if (property.type === AST_NODE_TYPES.Property &&
|
|
82
|
+
property.value.type === AST_NODE_TYPES.Identifier &&
|
|
83
|
+
property.value.name === identifierName) {
|
|
84
|
+
return getStaticPropertyName(property.key);
|
|
84
85
|
}
|
|
85
|
-
return getStaticPropertyName(property.key);
|
|
86
86
|
}
|
|
87
87
|
return undefined;
|
|
88
88
|
};
|
|
89
|
-
const isFsModuleSource = (source) => source
|
|
89
|
+
const isFsModuleSource = (source) => isDefined(source) && setHas(fsModuleNameSet, source);
|
|
90
90
|
const getDefinitionForIdentifier = (context, identifier) => {
|
|
91
91
|
const scope = context.sourceCode.getScope(identifier);
|
|
92
92
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
93
|
-
return variable?.defs[
|
|
93
|
+
return arrayFirst(variable?.defs ?? []);
|
|
94
94
|
};
|
|
95
95
|
const isFsModuleBinding = (context, identifier) => {
|
|
96
96
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
97
|
-
return (definition
|
|
97
|
+
return (isDefined(definition) &&
|
|
98
98
|
isFsModuleSource(getDefinitionModuleSource(definition.node)));
|
|
99
99
|
};
|
|
100
100
|
const getNamedFileStreamFactoryBindingName = (context, identifier) => {
|
|
101
101
|
const definition = getDefinitionForIdentifier(context, identifier);
|
|
102
|
-
if (definition
|
|
102
|
+
if (!isDefined(definition)) {
|
|
103
103
|
return undefined;
|
|
104
104
|
}
|
|
105
105
|
const source = getDefinitionModuleSource(definition.node);
|
|
@@ -108,7 +108,7 @@ const getNamedFileStreamFactoryBindingName = (context, identifier) => {
|
|
|
108
108
|
}
|
|
109
109
|
if (definition.node.type === AST_NODE_TYPES.ImportSpecifier) {
|
|
110
110
|
const importedName = getImportedSpecifierName(definition.node);
|
|
111
|
-
return importedName
|
|
111
|
+
return isDefined(importedName) &&
|
|
112
112
|
isFileStreamFactoryName(importedName)
|
|
113
113
|
? importedName
|
|
114
114
|
: undefined;
|
|
@@ -116,7 +116,7 @@ const getNamedFileStreamFactoryBindingName = (context, identifier) => {
|
|
|
116
116
|
if (definition.node.type === AST_NODE_TYPES.VariableDeclarator &&
|
|
117
117
|
definition.node.id.type === AST_NODE_TYPES.ObjectPattern) {
|
|
118
118
|
const propertyName = getObjectPatternPropertyNameForIdentifier(definition.node.id, identifier.name);
|
|
119
|
-
return propertyName
|
|
119
|
+
return isDefined(propertyName) &&
|
|
120
120
|
isFileStreamFactoryName(propertyName)
|
|
121
121
|
? propertyName
|
|
122
122
|
: undefined;
|
|
@@ -157,24 +157,23 @@ const getFileStreamFactoryName = (context, callee) => {
|
|
|
157
157
|
const isDiscardedFileStreamHandle = (node) => {
|
|
158
158
|
let current = node;
|
|
159
159
|
let parent = getParentNode(current);
|
|
160
|
-
while (parent
|
|
160
|
+
while (isDefined(parent)) {
|
|
161
161
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
162
|
-
if (wrappedExpression
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
if (wrappedExpression !== current) {
|
|
163
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
164
|
+
parent.expression === current) {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
168
|
+
parent.operator === "void" &&
|
|
169
|
+
parent.argument === current) {
|
|
170
|
+
const unaryParent = getParentNode(parent);
|
|
171
|
+
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
166
174
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return true;
|
|
170
|
-
}
|
|
171
|
-
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
172
|
-
parent.operator === "void" &&
|
|
173
|
-
parent.argument === current) {
|
|
174
|
-
const unaryParent = getParentNode(parent);
|
|
175
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
176
|
-
}
|
|
177
|
-
return false;
|
|
175
|
+
current = parent;
|
|
176
|
+
parent = getParentNode(current);
|
|
178
177
|
}
|
|
179
178
|
return false;
|
|
180
179
|
};
|
|
@@ -184,7 +183,7 @@ const noFloatingStreams = createTypedRule({
|
|
|
184
183
|
return {
|
|
185
184
|
CallExpression(node) {
|
|
186
185
|
const factoryName = getFileStreamFactoryName(context, node.callee);
|
|
187
|
-
if (factoryName
|
|
186
|
+
if (!isDefined(factoryName) ||
|
|
188
187
|
!isDiscardedFileStreamHandle(node)) {
|
|
189
188
|
return;
|
|
190
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-streams.js","sourceRoot":"","sources":["../../src/rules/no-floating-streams.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-streams.js","sourceRoot":"","sources":["../../src/rules/no-floating-streams.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-timers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-timers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-timers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-timers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAsFlC,oEAAoE;AACpE,QAAA,MAAM,gBAAgB,EAAE,QAAQ,CAAC,UAAU,CACvC,eAAe,EACf,SAAS,EAAE,CA8Db,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Require timer handles to be retained so they can be cleared during cleanup.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
-
import {
|
|
6
|
+
import { isDefined, setHas } from "ts-extras";
|
|
7
|
+
import { isDiscardedResourceExpression } from "../_internal/floating-resource.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { getVariableInScopeChain } from "../_internal/scope-variable.js";
|
|
9
10
|
import { createTypedRule, } from "../_internal/typed-rule.js";
|
|
@@ -22,50 +23,9 @@ const globalReceiverNames = [
|
|
|
22
23
|
];
|
|
23
24
|
const timerFunctionNameSet = new Set(timerFunctionNames);
|
|
24
25
|
const globalReceiverNameSet = new Set(globalReceiverNames);
|
|
25
|
-
const isTimerFunctionName = (name) => timerFunctionNameSet
|
|
26
|
-
const isGlobalReceiverName = (name) => globalReceiverNameSet
|
|
27
|
-
const
|
|
28
|
-
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
29
|
-
return node.expression;
|
|
30
|
-
}
|
|
31
|
-
if (node.type === AST_NODE_TYPES.TSAsExpression) {
|
|
32
|
-
return node.expression;
|
|
33
|
-
}
|
|
34
|
-
if (node.type === AST_NODE_TYPES.TSNonNullExpression) {
|
|
35
|
-
return node.expression;
|
|
36
|
-
}
|
|
37
|
-
if (node.type === AST_NODE_TYPES.TSSatisfiesExpression) {
|
|
38
|
-
return node.expression;
|
|
39
|
-
}
|
|
40
|
-
if (node.type === AST_NODE_TYPES.TSTypeAssertion) {
|
|
41
|
-
return node.expression;
|
|
42
|
-
}
|
|
43
|
-
return undefined;
|
|
44
|
-
};
|
|
45
|
-
const isDiscardedTimerHandle = (node) => {
|
|
46
|
-
let current = node;
|
|
47
|
-
let parent = getParentNode(current);
|
|
48
|
-
while (parent !== undefined) {
|
|
49
|
-
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
50
|
-
if (wrappedExpression === current) {
|
|
51
|
-
current = parent;
|
|
52
|
-
parent = getParentNode(current);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
56
|
-
parent.expression === current) {
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
60
|
-
parent.operator === "void" &&
|
|
61
|
-
parent.argument === current) {
|
|
62
|
-
const unaryParent = getParentNode(parent);
|
|
63
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
64
|
-
}
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
return false;
|
|
68
|
-
};
|
|
26
|
+
const isTimerFunctionName = (name) => setHas(timerFunctionNameSet, name);
|
|
27
|
+
const isGlobalReceiverName = (name) => setHas(globalReceiverNameSet, name);
|
|
28
|
+
const isDiscardedTimerHandle = (node) => isDiscardedResourceExpression(node);
|
|
69
29
|
const isShadowedIdentifier = (context, identifier) => {
|
|
70
30
|
const scope = context.sourceCode.getScope(identifier);
|
|
71
31
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
@@ -107,13 +67,13 @@ const noFloatingTimers = createTypedRule({
|
|
|
107
67
|
return {
|
|
108
68
|
'CallExpression[callee.type="Identifier"]'(node) {
|
|
109
69
|
const timerName = getDirectTimerName(context, node.callee);
|
|
110
|
-
if (timerName
|
|
70
|
+
if (isDefined(timerName)) {
|
|
111
71
|
reportFloatingTimer(node, timerName);
|
|
112
72
|
}
|
|
113
73
|
},
|
|
114
74
|
'CallExpression[callee.type="MemberExpression"]'(node) {
|
|
115
75
|
const timerName = getMemberTimerName(node.callee);
|
|
116
|
-
if (timerName
|
|
76
|
+
if (isDefined(timerName)) {
|
|
117
77
|
reportFloatingTimer(node, timerName);
|
|
118
78
|
}
|
|
119
79
|
},
|