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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-timers.js","sourceRoot":"","sources":["../../src/rules/no-floating-timers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-timers.js","sourceRoot":"","sources":["../../src/rules/no-floating-timers.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require WakeLockSentinel handles to be retained so they can be released.
|
|
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";
|
|
@@ -51,7 +52,7 @@ const collectStaticMemberPath = (node) => {
|
|
|
51
52
|
}
|
|
52
53
|
const objectPath = collectStaticMemberPath(node.object);
|
|
53
54
|
const propertyName = getStaticPropertyName(node.property, node.computed);
|
|
54
|
-
return objectPath
|
|
55
|
+
return !isDefined(objectPath) || !isDefined(propertyName)
|
|
55
56
|
? undefined
|
|
56
57
|
: [...objectPath, propertyName];
|
|
57
58
|
};
|
|
@@ -77,11 +78,11 @@ const isNavigatorPathShadowed = (context, callee) => {
|
|
|
77
78
|
isShadowedNavigatorIdentifier(context, rootIdentifier));
|
|
78
79
|
};
|
|
79
80
|
const isWakeLockRequestPath = (path) => (path.length === 3 &&
|
|
80
|
-
path
|
|
81
|
+
arrayFirst(path) === "navigator" &&
|
|
81
82
|
path[1] === "wakeLock" &&
|
|
82
83
|
path[2] === wakeLockRequestFunctionName) ||
|
|
83
84
|
(path.length === 4 &&
|
|
84
|
-
globalNavigatorReceiverNameSet
|
|
85
|
+
setHas(globalNavigatorReceiverNameSet, arrayFirst(path) ?? "") &&
|
|
85
86
|
path[1] === "navigator" &&
|
|
86
87
|
path[2] === "wakeLock" &&
|
|
87
88
|
path[3] === wakeLockRequestFunctionName);
|
|
@@ -91,29 +92,28 @@ const isWakeLockRequestCall = (context, callee) => {
|
|
|
91
92
|
return false;
|
|
92
93
|
}
|
|
93
94
|
const path = collectStaticMemberPath(callee);
|
|
94
|
-
return path
|
|
95
|
+
return isDefined(path) && isWakeLockRequestPath(path);
|
|
95
96
|
};
|
|
96
97
|
const isDiscardedWakeLockRequest = (node) => {
|
|
97
98
|
let current = node;
|
|
98
99
|
let parent = getParentNode(current);
|
|
99
|
-
while (parent
|
|
100
|
+
while (isDefined(parent)) {
|
|
100
101
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
101
|
-
if (wrappedExpression
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
if (wrappedExpression !== current) {
|
|
103
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
104
|
+
parent.expression === current) {
|
|
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;
|
|
105
114
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
if (parent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
111
|
-
parent.operator === "void" &&
|
|
112
|
-
parent.argument === current) {
|
|
113
|
-
const unaryParent = getParentNode(parent);
|
|
114
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
115
|
-
}
|
|
116
|
-
return false;
|
|
115
|
+
current = parent;
|
|
116
|
+
parent = getParentNode(current);
|
|
117
117
|
}
|
|
118
118
|
return false;
|
|
119
119
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-wake-locks.js","sourceRoot":"","sources":["../../src/rules/no-floating-wake-locks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,cAAc,GAGjB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-floating-wake-locks.js","sourceRoot":"","sources":["../../src/rules/no-floating-wake-locks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-web-stream-locks.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-web-stream-locks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-web-stream-locks.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-web-stream-locks.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAkFlC,8EAA8E;AAC9E,QAAA,MAAM,wBAAwB,EAAE,QAAQ,CAAC,UAAU,CAC/C,uBAAuB,EACvB,SAAS,EAAE,CAqDb,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require Web Stream readers and writers to be retained so their locks can be released.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { isDefined, setHas } from "ts-extras";
|
|
6
7
|
import { getStaticPropertyName, isDiscardedResourceExpression, isImmediateUnownedMemberReceiver, } from "../_internal/floating-resource.js";
|
|
7
8
|
import { createRuleDocsUrl } from "../_internal/rule-docs-url.js";
|
|
8
9
|
import { hasTypeNameInHierarchy } from "../_internal/type-checker.js";
|
|
@@ -20,7 +21,7 @@ const lockFactoryMetadataByName = {
|
|
|
20
21
|
},
|
|
21
22
|
};
|
|
22
23
|
const lockFactoryNameSet = new Set(lockFactoryNames);
|
|
23
|
-
const isLockFactoryName = (name) => lockFactoryNameSet
|
|
24
|
+
const isLockFactoryName = (name) => setHas(lockFactoryNameSet, name);
|
|
24
25
|
const getLockFactoryMetadata = (callee) => {
|
|
25
26
|
if (callee.type !== AST_NODE_TYPES.MemberExpression || callee.optional) {
|
|
26
27
|
return undefined;
|
|
@@ -29,7 +30,7 @@ const getLockFactoryMetadata = (callee) => {
|
|
|
29
30
|
return undefined;
|
|
30
31
|
}
|
|
31
32
|
const factoryName = getStaticPropertyName(callee.property, callee.computed);
|
|
32
|
-
if (factoryName
|
|
33
|
+
if (!isDefined(factoryName) || !isLockFactoryName(factoryName)) {
|
|
33
34
|
return undefined;
|
|
34
35
|
}
|
|
35
36
|
return {
|
|
@@ -48,7 +49,7 @@ const noFloatingWebStreamLocks = createTypedRule({
|
|
|
48
49
|
return {
|
|
49
50
|
CallExpression(node) {
|
|
50
51
|
const metadata = getLockFactoryMetadata(node.callee);
|
|
51
|
-
if (metadata
|
|
52
|
+
if (!isDefined(metadata) ||
|
|
52
53
|
!isReceiverExpectedWebStream(context, metadata.receiver, metadata.streamTypeName) ||
|
|
53
54
|
(!isDiscardedResourceExpression(node) &&
|
|
54
55
|
!isImmediateUnownedMemberReceiver(node, cleanupMemberNames))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-web-stream-locks.js","sourceRoot":"","sources":["../../src/rules/no-floating-web-stream-locks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-web-stream-locks.js","sourceRoot":"","sources":["../../src/rules/no-floating-web-stream-locks.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EACH,cAAc,GAGjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EACH,qBAAqB,EACrB,6BAA6B,EAC7B,gCAAgC,GACnC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EACH,eAAe,EACf,oBAAoB,GAEvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAU,CAAC;AAC7D,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AASzE,MAAM,yBAAyB,GAE3B;IACA,SAAS,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,gBAAgB;KACnC;IACD,SAAS,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,gBAAgB;KACnC;CACJ,CAAC;AACF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE1E,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAA2B,EAAE,CAChE,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;AAErC,MAAM,sBAAsB,GAAG,CAC3B,MAAmD,EAIvC,EAAE;IACd,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrE,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5E,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,GAAG,yBAAyB,CAAC,WAAW,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAChC,OAAyB,EACzB,QAAuC,EACvC,cAAqD,EAC9C,EAAE;IACT,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAC1C,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrD,CAAC;IAEF,OAAO,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,wBAAwB,GAG1B,eAAe,CAAC;IAChB,MAAM,CAAC,OAAO;QACV,OAAO;YACH,cAAc,CAAC,IAAuC;gBAClD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAErD,IACI,CAAC,SAAS,CAAC,QAAQ,CAAC;oBACpB,CAAC,2BAA2B,CACxB,OAAO,EACP,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,cAAc,CAC1B;oBACD,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC;wBACjC,CAAC,gCAAgC,CAC7B,IAAI,EACJ,kBAAkB,CACrB,CAAC,EACR,CAAC;oBACC,OAAO;gBACX,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACX,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;oBACrC,SAAS,EAAE,uBAAuB;oBAClC,IAAI;iBACP,CAAC,CAAC;YACP,CAAC;SACJ,CAAC;IACN,CAAC;IACD,cAAc,EAAE,EAAE;IAClB,IAAI,EAAE;QACF,IAAI,EAAE;YACF,WAAW,EACP,uFAAuF;YAC3F,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,IAAI;YAC1B,qBAAqB,EAAE;gBACnB,kDAAkD;gBAClD,gCAAgC;gBAChC,6BAA6B;aAChC;YACD,GAAG,EAAE,iBAAiB,CAAC,8BAA8B,CAAC;SACzD;QACD,QAAQ,EAAE;YACN,qBAAqB,EACjB,0GAA0G;SACjH;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAClB;IACD,IAAI,EAAE,8BAA8B;CACvC,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-workers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-workers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-workers.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-workers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AA0OlC,qEAAqE;AACrE,QAAA,MAAM,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CACxC,gBAAgB,EAChB,SAAS,EAAE,CAiDb,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require worker handles to be retained so they can be terminated 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";
|
|
@@ -23,8 +24,8 @@ const workerThreadsModuleNames = [
|
|
|
23
24
|
const browserWorkerConstructorNameSet = new Set(browserWorkerConstructorNames);
|
|
24
25
|
const globalReceiverNameSet = new Set(globalReceiverNames);
|
|
25
26
|
const workerThreadsModuleNameSet = new Set(workerThreadsModuleNames);
|
|
26
|
-
const isBrowserWorkerConstructorName = (name) => browserWorkerConstructorNameSet
|
|
27
|
-
const isGlobalReceiverName = (name) => globalReceiverNameSet
|
|
27
|
+
const isBrowserWorkerConstructorName = (name) => setHas(browserWorkerConstructorNameSet, name);
|
|
28
|
+
const isGlobalReceiverName = (name) => setHas(globalReceiverNameSet, name);
|
|
28
29
|
const getTransparentWrappedExpression = (node) => {
|
|
29
30
|
if (node.type === AST_NODE_TYPES.ChainExpression) {
|
|
30
31
|
return node.expression;
|
|
@@ -54,13 +55,13 @@ const getImportSourceValue = (node) => {
|
|
|
54
55
|
const isWorkerThreadsImportBinding = (context, identifier) => {
|
|
55
56
|
const scope = context.sourceCode.getScope(identifier);
|
|
56
57
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
57
|
-
const definition = variable?.defs[
|
|
58
|
-
const importSource = definition
|
|
59
|
-
?
|
|
60
|
-
:
|
|
58
|
+
const definition = arrayFirst(variable?.defs ?? []);
|
|
59
|
+
const importSource = isDefined(definition)
|
|
60
|
+
? getImportSourceValue(definition.node)
|
|
61
|
+
: undefined;
|
|
61
62
|
return (identifier.name === "Worker" &&
|
|
62
|
-
importSource
|
|
63
|
-
workerThreadsModuleNameSet
|
|
63
|
+
isDefined(importSource) &&
|
|
64
|
+
setHas(workerThreadsModuleNameSet, importSource));
|
|
64
65
|
};
|
|
65
66
|
const isShadowedBrowserWorkerIdentifier = (context, identifier) => {
|
|
66
67
|
const scope = context.sourceCode.getScope(identifier);
|
|
@@ -96,47 +97,45 @@ const getWorkerConstructorName = (context, callee) => getDirectWorkerConstructor
|
|
|
96
97
|
const isDiscardedWorkerInstance = (node) => {
|
|
97
98
|
let current = node;
|
|
98
99
|
let parent = getParentNode(current);
|
|
99
|
-
while (parent
|
|
100
|
+
while (isDefined(parent)) {
|
|
100
101
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
101
|
-
if (wrappedExpression
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const unaryParent = getParentNode(parent);
|
|
114
|
-
return unaryParent?.type === AST_NODE_TYPES.ExpressionStatement;
|
|
102
|
+
if (wrappedExpression !== current) {
|
|
103
|
+
if (parent.type === AST_NODE_TYPES.ExpressionStatement &&
|
|
104
|
+
parent.expression === current) {
|
|
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;
|
|
115
114
|
}
|
|
116
|
-
|
|
115
|
+
current = parent;
|
|
116
|
+
parent = getParentNode(current);
|
|
117
117
|
}
|
|
118
118
|
return false;
|
|
119
119
|
};
|
|
120
120
|
const isImmediateWorkerMethodReceiver = (node) => {
|
|
121
121
|
let current = node;
|
|
122
122
|
let parent = getParentNode(current);
|
|
123
|
-
while (parent
|
|
123
|
+
while (isDefined(parent)) {
|
|
124
124
|
const wrappedExpression = getTransparentWrappedExpression(parent);
|
|
125
|
-
if (wrappedExpression
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
125
|
+
if (wrappedExpression !== current) {
|
|
126
|
+
if (parent.type !== AST_NODE_TYPES.MemberExpression ||
|
|
127
|
+
parent.object !== current ||
|
|
128
|
+
parent.computed ||
|
|
129
|
+
parent.property.type !== AST_NODE_TYPES.Identifier ||
|
|
130
|
+
parent.property.name === "terminate") {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const callExpression = getParentNode(parent);
|
|
134
|
+
return (callExpression?.type === AST_NODE_TYPES.CallExpression &&
|
|
135
|
+
callExpression.callee === parent);
|
|
136
136
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
callExpression.callee === parent);
|
|
137
|
+
current = parent;
|
|
138
|
+
parent = getParentNode(current);
|
|
140
139
|
}
|
|
141
140
|
return false;
|
|
142
141
|
};
|
|
@@ -146,7 +145,7 @@ const noFloatingWorkers = createTypedRule({
|
|
|
146
145
|
return {
|
|
147
146
|
NewExpression(node) {
|
|
148
147
|
const workerName = getWorkerConstructorName(context, node.callee);
|
|
149
|
-
if (workerName
|
|
148
|
+
if (!isDefined(workerName) ||
|
|
150
149
|
(!isDiscardedWorkerInstance(node) &&
|
|
151
150
|
!isImmediateWorkerMethodReceiver(node))) {
|
|
152
151
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-floating-workers.js","sourceRoot":"","sources":["../../src/rules/no-floating-workers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-floating-workers.js","sourceRoot":"","sources":["../../src/rules/no-floating-workers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unmanaged-event-listeners.d.ts","sourceRoot":"","sources":["../../src/rules/no-unmanaged-event-listeners.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-unmanaged-event-listeners.d.ts","sourceRoot":"","sources":["../../src/rules/no-unmanaged-event-listeners.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEH,KAAK,QAAQ,EAEhB,MAAM,0BAA0B,CAAC;AAkPlC,8EAA8E;AAC9E,QAAA,MAAM,yBAAyB,EAAE,QAAQ,CAAC,UAAU,CAChD,wBAAwB,EACxB,SAAS,EAAE,CAgHb,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Require event listeners to have an explicit cleanup path.
|
|
4
4
|
*/
|
|
5
5
|
import { AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
6
|
+
import { arrayFirst, isDefined, setHas, stringSplit } 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 isCleanupBoundary = (node) => node.type === AST_NODE_TYPES.Program ||
|
|
|
14
15
|
node.type === AST_NODE_TYPES.ArrowFunctionExpression;
|
|
15
16
|
const getCleanupBoundary = (node) => {
|
|
16
17
|
let current = node;
|
|
17
|
-
while (current
|
|
18
|
+
while (isDefined(current)) {
|
|
18
19
|
if (isCleanupBoundary(current)) {
|
|
19
20
|
return current;
|
|
20
21
|
}
|
|
@@ -42,7 +43,7 @@ const isVariableDeclarator = (node) => isUnknownRecord(node) &&
|
|
|
42
43
|
const getVariableInitializer = (context, identifier) => {
|
|
43
44
|
const scope = context.sourceCode.getScope(identifier);
|
|
44
45
|
const variable = getVariableInScopeChain(scope, identifier.name);
|
|
45
|
-
const definition = variable?.defs[
|
|
46
|
+
const definition = arrayFirst(variable?.defs ?? []);
|
|
46
47
|
const definitionNode = definition?.node;
|
|
47
48
|
if (!isVariableDeclarator(definitionNode)) {
|
|
48
49
|
return undefined;
|
|
@@ -76,7 +77,7 @@ const getBooleanPropertyValue = (objectExpression, propertyName) => {
|
|
|
76
77
|
return undefined;
|
|
77
78
|
};
|
|
78
79
|
const hasAbortSignalOption = (context, argument) => {
|
|
79
|
-
if (argument
|
|
80
|
+
if (!isDefined(argument)) {
|
|
80
81
|
return false;
|
|
81
82
|
}
|
|
82
83
|
const resolvedOptions = resolveOptionsExpression(context, argument);
|
|
@@ -84,11 +85,11 @@ const hasAbortSignalOption = (context, argument) => {
|
|
|
84
85
|
objectExpressionHasProperty(resolvedOptions, "signal"));
|
|
85
86
|
};
|
|
86
87
|
const getCaptureKey = (context, argument) => {
|
|
87
|
-
if (argument
|
|
88
|
+
if (!isDefined(argument)) {
|
|
88
89
|
return "false";
|
|
89
90
|
}
|
|
90
91
|
const resolvedOptions = resolveOptionsExpression(context, argument);
|
|
91
|
-
if (resolvedOptions
|
|
92
|
+
if (!isDefined(resolvedOptions)) {
|
|
92
93
|
return unknownCaptureKey;
|
|
93
94
|
}
|
|
94
95
|
if (resolvedOptions.type === AST_NODE_TYPES.Literal &&
|
|
@@ -97,7 +98,7 @@ const getCaptureKey = (context, argument) => {
|
|
|
97
98
|
}
|
|
98
99
|
if (resolvedOptions.type === AST_NODE_TYPES.ObjectExpression) {
|
|
99
100
|
const captureValue = getBooleanPropertyValue(resolvedOptions, "capture");
|
|
100
|
-
return captureValue
|
|
101
|
+
return isDefined(captureValue) ? String(captureValue) : "false";
|
|
101
102
|
}
|
|
102
103
|
return unknownCaptureKey;
|
|
103
104
|
};
|
|
@@ -106,8 +107,8 @@ const getCleanupKey = (context, node) => {
|
|
|
106
107
|
return undefined;
|
|
107
108
|
}
|
|
108
109
|
const [eventType, listener, options] = node.arguments;
|
|
109
|
-
if (eventType
|
|
110
|
-
listener
|
|
110
|
+
if (!isDefined(eventType) ||
|
|
111
|
+
!isDefined(listener) ||
|
|
111
112
|
eventType.type === AST_NODE_TYPES.SpreadElement ||
|
|
112
113
|
listener.type === AST_NODE_TYPES.SpreadElement) {
|
|
113
114
|
return undefined;
|
|
@@ -119,10 +120,10 @@ const getCleanupKey = (context, node) => {
|
|
|
119
120
|
return `${targetText}\u0000${eventTypeText}\u0000${listenerText}\u0000${captureKey}`;
|
|
120
121
|
};
|
|
121
122
|
const getWildcardCleanupKey = (cleanupKey) => {
|
|
122
|
-
const [targetText, eventTypeText, listenerText] = cleanupKey
|
|
123
|
-
if (targetText
|
|
124
|
-
eventTypeText
|
|
125
|
-
listenerText
|
|
123
|
+
const [targetText, eventTypeText, listenerText] = stringSplit(cleanupKey, "\u0000");
|
|
124
|
+
if (!isDefined(targetText) ||
|
|
125
|
+
!isDefined(eventTypeText) ||
|
|
126
|
+
!isDefined(listenerText)) {
|
|
126
127
|
throw new TypeError("Expected a complete event listener cleanup key.");
|
|
127
128
|
}
|
|
128
129
|
return `${targetText}\u0000${eventTypeText}\u0000${listenerText}\u0000${unknownCaptureKey}`;
|
|
@@ -134,7 +135,7 @@ const noUnmanagedEventListeners = createTypedRule({
|
|
|
134
135
|
const removesByBoundary = new Map();
|
|
135
136
|
const addRecord = (boundary, record) => {
|
|
136
137
|
const records = addsByBoundary.get(boundary);
|
|
137
|
-
if (records
|
|
138
|
+
if (!isDefined(records)) {
|
|
138
139
|
addsByBoundary.set(boundary, [record]);
|
|
139
140
|
return;
|
|
140
141
|
}
|
|
@@ -142,7 +143,7 @@ const noUnmanagedEventListeners = createTypedRule({
|
|
|
142
143
|
};
|
|
143
144
|
const addRemoveKey = (boundary, cleanupKey) => {
|
|
144
145
|
const cleanupKeys = removesByBoundary.get(boundary);
|
|
145
|
-
if (cleanupKeys
|
|
146
|
+
if (!isDefined(cleanupKeys)) {
|
|
146
147
|
removesByBoundary.set(boundary, new Set([cleanupKey]));
|
|
147
148
|
return;
|
|
148
149
|
}
|
|
@@ -153,7 +154,7 @@ const noUnmanagedEventListeners = createTypedRule({
|
|
|
153
154
|
if (isMethodCallNamed(node.callee, "addEventListener") &&
|
|
154
155
|
!hasAbortSignalOption(context, node.arguments[2])) {
|
|
155
156
|
const cleanupKey = getCleanupKey(context, node);
|
|
156
|
-
if (cleanupKey
|
|
157
|
+
if (isDefined(cleanupKey)) {
|
|
157
158
|
addRecord(getCleanupBoundary(node), {
|
|
158
159
|
cleanupKey,
|
|
159
160
|
node,
|
|
@@ -162,7 +163,7 @@ const noUnmanagedEventListeners = createTypedRule({
|
|
|
162
163
|
}
|
|
163
164
|
if (isMethodCallNamed(node.callee, "removeEventListener")) {
|
|
164
165
|
const cleanupKey = getCleanupKey(context, node);
|
|
165
|
-
if (cleanupKey
|
|
166
|
+
if (isDefined(cleanupKey)) {
|
|
166
167
|
addRemoveKey(getCleanupBoundary(node), cleanupKey);
|
|
167
168
|
}
|
|
168
169
|
}
|
|
@@ -171,14 +172,13 @@ const noUnmanagedEventListeners = createTypedRule({
|
|
|
171
172
|
for (const [boundary, addRecords] of addsByBoundary) {
|
|
172
173
|
const removeKeys = removesByBoundary.get(boundary) ?? new Set();
|
|
173
174
|
for (const { cleanupKey, node } of addRecords) {
|
|
174
|
-
if (removeKeys
|
|
175
|
-
removeKeys
|
|
176
|
-
|
|
175
|
+
if (!setHas(removeKeys, cleanupKey) &&
|
|
176
|
+
!setHas(removeKeys, getWildcardCleanupKey(cleanupKey))) {
|
|
177
|
+
context.report({
|
|
178
|
+
messageId: "unmanagedEventListener",
|
|
179
|
+
node,
|
|
180
|
+
});
|
|
177
181
|
}
|
|
178
|
-
context.report({
|
|
179
|
-
messageId: "unmanagedEventListener",
|
|
180
|
-
node,
|
|
181
|
-
});
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unmanaged-event-listeners.js","sourceRoot":"","sources":["../../src/rules/no-unmanaged-event-listeners.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,cAAc,GAGjB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-unmanaged-event-listeners.js","sourceRoot":"","sources":["../../src/rules/no-unmanaged-event-listeners.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,7 +93,7 @@ export default [
|
|
|
93
93
|
|
|
94
94
|
## When not to use it
|
|
95
95
|
|
|
96
|
-
Do not enable this rule for
|
|
96
|
+
Do not enable this rule for one-page demos where the browser page lifetime
|
|
97
97
|
is intentionally the cleanup boundary. Use narrow inline disables for those
|
|
98
98
|
examples.
|
|
99
99
|
|
|
@@ -101,4 +101,3 @@ examples.
|
|
|
101
101
|
|
|
102
102
|
- [MDN: `AudioContext`](https://developer.mozilla.org/docs/Web/API/AudioContext)
|
|
103
103
|
- [MDN: `AudioContext.close()`](https://developer.mozilla.org/docs/Web/API/AudioContext/close)
|
|
104
|
-
|
|
@@ -30,7 +30,7 @@ The rule reports:
|
|
|
30
30
|
expression
|
|
31
31
|
|
|
32
32
|
It intentionally allows promise chains and lifecycle-manager calls that receive
|
|
33
|
-
the stream. The rule focuses on
|
|
33
|
+
the stream. The rule focuses on directly unowned stream handles, not on proving
|
|
34
34
|
that every possible owner eventually stops every track.
|
|
35
35
|
|
|
36
36
|
## Why this rule exists
|
|
@@ -25,9 +25,9 @@ The rule reports:
|
|
|
25
25
|
- `void URL.createObjectURL(...)`
|
|
26
26
|
- static computed global forms such as:
|
|
27
27
|
|
|
28
|
-
```ts
|
|
29
|
-
window["URL"]["createObjectURL"](blob);
|
|
30
|
-
```
|
|
28
|
+
```ts
|
|
29
|
+
window["URL"]["createObjectURL"](blob);
|
|
30
|
+
```
|
|
31
31
|
|
|
32
32
|
The rule intentionally allows object URLs that are stored, returned, or passed to
|
|
33
33
|
a lifecycle manager. It does not try to prove that every retained URL is later
|
|
@@ -32,7 +32,7 @@ The rule reports:
|
|
|
32
32
|
`new IntersectionObserver(callback).observe(element);`
|
|
33
33
|
|
|
34
34
|
It intentionally does not require same-function `disconnect()` calls. That is a
|
|
35
|
-
separate ownership question, and
|
|
35
|
+
separate ownership question, and valid designs transfer observer ownership
|
|
36
36
|
to a manager, component instance, returned disposable, or framework lifecycle.
|
|
37
37
|
|
|
38
38
|
## Why this rule exists
|
|
@@ -114,7 +114,7 @@ export default [
|
|
|
114
114
|
|
|
115
115
|
## When not to use it
|
|
116
116
|
|
|
117
|
-
Do not enable this rule for
|
|
117
|
+
Do not enable this rule for one-off scripts where the server is
|
|
118
118
|
intentionally process-lifetime and never needs graceful shutdown. Prefer a
|
|
119
119
|
narrow disable comment with a reason in those files rather than weakening the
|
|
120
120
|
rule globally.
|
|
@@ -28,7 +28,7 @@ The rule reports:
|
|
|
28
28
|
`await navigator.wakeLock.request("screen");`
|
|
29
29
|
|
|
30
30
|
It intentionally allows promise chains and lifecycle-manager calls that receive
|
|
31
|
-
the sentinel. The rule focuses on
|
|
31
|
+
the sentinel. The rule focuses on directly unowned wake lock handles.
|
|
32
32
|
|
|
33
33
|
## Why this rule exists
|
|
34
34
|
|
|
@@ -26,7 +26,7 @@ The rule reports:
|
|
|
26
26
|
lost
|
|
27
27
|
|
|
28
28
|
Immediate `releaseLock()` calls are allowed. The rule focuses on cases where the
|
|
29
|
-
lock owner is
|
|
29
|
+
lock owner is unavailable to cleanup code.
|
|
30
30
|
|
|
31
31
|
## Why this rule exists
|
|
32
32
|
|
|
@@ -102,4 +102,3 @@ lifetime, use a narrow disable comment and document that ownership boundary.
|
|
|
102
102
|
- [MDN: `ReadableStreamDefaultReader.releaseLock()`](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock)
|
|
103
103
|
- [MDN: `WritableStream.getWriter()`](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter)
|
|
104
104
|
- [MDN: `WritableStreamDefaultWriter.releaseLock()`](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock)
|
|
105
|
-
|