eslint-plugin-react-web-api 1.23.2 → 1.23.3-next.1
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/index.js +103 -35
- package/dist/index.mjs +103 -35
- package/package.json +10 -10
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ var VAR2__namespace = /*#__PURE__*/_interopNamespace(VAR2);
|
|
|
34
34
|
|
|
35
35
|
// package.json
|
|
36
36
|
var name = "eslint-plugin-react-web-api";
|
|
37
|
-
var version = "1.23.
|
|
37
|
+
var version = "1.23.3-next.1";
|
|
38
38
|
var createRule = shared.createRuleForPlugin("web-api");
|
|
39
39
|
function getInstanceID(node, prev) {
|
|
40
40
|
switch (true) {
|
|
@@ -102,7 +102,9 @@ function getOptions(node, initialScope) {
|
|
|
102
102
|
return JSX__namespace.findPropInProperties(properties, initialScope)(propName);
|
|
103
103
|
};
|
|
104
104
|
const getPropValue = (prop) => {
|
|
105
|
-
if (prop.type !== utils.AST_NODE_TYPES.Property)
|
|
105
|
+
if (prop.type !== utils.AST_NODE_TYPES.Property) {
|
|
106
|
+
return eff.O.none();
|
|
107
|
+
}
|
|
106
108
|
const { value } = prop;
|
|
107
109
|
switch (value.type) {
|
|
108
110
|
case utils.AST_NODE_TYPES.Literal: {
|
|
@@ -134,7 +136,9 @@ function getOptions(node, initialScope) {
|
|
|
134
136
|
const vCapture = eff.O.flatMap(pCapture, getPropValue).pipe(eff.O.filter(eff.isBoolean));
|
|
135
137
|
const pSignal = findProp(node2.properties, "signal");
|
|
136
138
|
const vSignal = eff.O.flatMap(pSignal, (prop) => {
|
|
137
|
-
if (prop.type !== utils.AST_NODE_TYPES.Property)
|
|
139
|
+
if (prop.type !== utils.AST_NODE_TYPES.Property) {
|
|
140
|
+
return eff.O.none();
|
|
141
|
+
}
|
|
138
142
|
const { value } = prop;
|
|
139
143
|
return getSignalValueExpression(value, initialScope);
|
|
140
144
|
});
|
|
@@ -163,8 +167,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
163
167
|
},
|
|
164
168
|
name: RULE_NAME,
|
|
165
169
|
create(context) {
|
|
166
|
-
if (!context.sourceCode.text.includes("addEventListener"))
|
|
167
|
-
|
|
170
|
+
if (!context.sourceCode.text.includes("addEventListener")) {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
if (!/use\w*Effect|componentDidMount|componentWillUnmount/u.test(context.sourceCode.text)) {
|
|
174
|
+
return {};
|
|
175
|
+
}
|
|
168
176
|
const fStack = [];
|
|
169
177
|
const aEntries = [];
|
|
170
178
|
const rEntries = [];
|
|
@@ -181,7 +189,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
181
189
|
function isInverseEntry(aEntry, rEntry) {
|
|
182
190
|
const { type: aType, callee: aCallee, capture: aCapture, listener: aListener, phase: aPhase } = aEntry;
|
|
183
191
|
const { type: rType, callee: rCallee, capture: rCapture, listener: rListener, phase: rPhase } = rEntry;
|
|
184
|
-
if (!core.isInversePhase(aPhase, rPhase))
|
|
192
|
+
if (!core.isInversePhase(aPhase, rPhase)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
185
195
|
return isSameObject(aCallee, rCallee) && AST2__namespace.isNodeEqual(aListener, rListener) && VAR2__namespace.isNodeValueEqual(aType, rType, [
|
|
186
196
|
context.sourceCode.getScope(aType),
|
|
187
197
|
context.sourceCode.getScope(rType)
|
|
@@ -189,8 +199,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
189
199
|
}
|
|
190
200
|
function checkInlineFunction(node, callKind, options) {
|
|
191
201
|
const [_, listener] = node.arguments;
|
|
192
|
-
if (!AST2__namespace.isFunction(listener))
|
|
193
|
-
|
|
202
|
+
if (!AST2__namespace.isFunction(listener)) {
|
|
203
|
+
return eff.O.none();
|
|
204
|
+
}
|
|
205
|
+
if (eff.O.isSome(options.signal)) {
|
|
206
|
+
return eff.O.none();
|
|
207
|
+
}
|
|
194
208
|
return eff.O.some({
|
|
195
209
|
messageId: "noLeakedEventListenerOfInlineFunction",
|
|
196
210
|
node: listener,
|
|
@@ -207,11 +221,17 @@ var no_leaked_event_listener_default = createRule({
|
|
|
207
221
|
},
|
|
208
222
|
["CallExpression"](node) {
|
|
209
223
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
210
|
-
if (!fNode || !fKind)
|
|
211
|
-
|
|
224
|
+
if (!fNode || !fKind) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (!core.ERPhaseRelevance.has(fKind)) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
212
230
|
tsPattern.match(getCallKind(node)).with("addEventListener", (callKind) => {
|
|
213
231
|
const [type, listener, options] = node.arguments;
|
|
214
|
-
if (!type || !listener)
|
|
232
|
+
if (!type || !listener) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
215
235
|
const opts = options ? getOptions(options, context.sourceCode.getScope(options)) : defaultOptions;
|
|
216
236
|
const { callee } = node;
|
|
217
237
|
eff.O.map(checkInlineFunction(node, callKind, opts), context.report);
|
|
@@ -226,7 +246,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
226
246
|
});
|
|
227
247
|
}).with("removeEventListener", (callKind) => {
|
|
228
248
|
const [type, listener, options] = node.arguments;
|
|
229
|
-
if (!type || !listener)
|
|
249
|
+
if (!type || !listener) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
230
252
|
const opts = options ? getOptions(options, context.sourceCode.getScope(options)) : defaultOptions;
|
|
231
253
|
const { callee } = node;
|
|
232
254
|
eff.O.map(checkInlineFunction(node, callKind, opts), context.report);
|
|
@@ -245,8 +267,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
245
267
|
},
|
|
246
268
|
["Program:exit"]() {
|
|
247
269
|
for (const aEntry of aEntries) {
|
|
248
|
-
if (eff.O.exists(aEntry.signal, (signal) => abortedSignals.some((as) => isSameObject(as, signal))))
|
|
249
|
-
|
|
270
|
+
if (eff.O.exists(aEntry.signal, (signal) => abortedSignals.some((as) => isSameObject(as, signal)))) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (rEntries.some((rEntry) => isInverseEntry(aEntry, rEntry))) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
250
276
|
switch (aEntry.phase) {
|
|
251
277
|
case "setup":
|
|
252
278
|
case "cleanup":
|
|
@@ -302,7 +328,9 @@ var no_leaked_interval_default = createRule({
|
|
|
302
328
|
},
|
|
303
329
|
name: RULE_NAME2,
|
|
304
330
|
create(context) {
|
|
305
|
-
if (!context.sourceCode.text.includes("setInterval"))
|
|
331
|
+
if (!context.sourceCode.text.includes("setInterval")) {
|
|
332
|
+
return {};
|
|
333
|
+
}
|
|
306
334
|
const fStack = [];
|
|
307
335
|
const sEntries = [];
|
|
308
336
|
const cEntries = [];
|
|
@@ -321,8 +349,12 @@ var no_leaked_interval_default = createRule({
|
|
|
321
349
|
switch (getCallKind2(node)) {
|
|
322
350
|
case "setInterval": {
|
|
323
351
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
324
|
-
if (!fNode || !fKind)
|
|
325
|
-
|
|
352
|
+
if (!fNode || !fKind) {
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
if (!core.ERPhaseRelevance.has(fKind)) {
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
326
358
|
const intervalIdNode = eff.O.getOrNull(VAR2__namespace.getVariableDeclaratorID(node));
|
|
327
359
|
if (!intervalIdNode) {
|
|
328
360
|
context.report({
|
|
@@ -342,10 +374,16 @@ var no_leaked_interval_default = createRule({
|
|
|
342
374
|
}
|
|
343
375
|
case "clearInterval": {
|
|
344
376
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
345
|
-
if (!fNode || !fKind)
|
|
346
|
-
|
|
377
|
+
if (!fNode || !fKind) {
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
if (!core.ERPhaseRelevance.has(fKind)) {
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
347
383
|
const [intervalIdNode] = node.arguments;
|
|
348
|
-
if (!intervalIdNode)
|
|
384
|
+
if (!intervalIdNode) {
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
349
387
|
cEntries.push({
|
|
350
388
|
kind: "interval",
|
|
351
389
|
node,
|
|
@@ -359,7 +397,9 @@ var no_leaked_interval_default = createRule({
|
|
|
359
397
|
},
|
|
360
398
|
["Program:exit"]() {
|
|
361
399
|
for (const sEntry of sEntries) {
|
|
362
|
-
if (cEntries.some((cEntry) => isInverseEntry(sEntry, cEntry)))
|
|
400
|
+
if (cEntries.some((cEntry) => isInverseEntry(sEntry, cEntry))) {
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
363
403
|
switch (sEntry.phase) {
|
|
364
404
|
case "setup":
|
|
365
405
|
case "cleanup":
|
|
@@ -438,7 +478,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
438
478
|
},
|
|
439
479
|
name: RULE_NAME3,
|
|
440
480
|
create(context) {
|
|
441
|
-
if (!context.sourceCode.text.includes("ResizeObserver"))
|
|
481
|
+
if (!context.sourceCode.text.includes("ResizeObserver")) {
|
|
482
|
+
return {};
|
|
483
|
+
}
|
|
442
484
|
const fStack = [];
|
|
443
485
|
const observers = [];
|
|
444
486
|
const oEntries = [];
|
|
@@ -454,8 +496,12 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
454
496
|
},
|
|
455
497
|
["CallExpression"](node) {
|
|
456
498
|
const [_, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
457
|
-
if (node.callee.type !== utils.AST_NODE_TYPES.MemberExpression)
|
|
458
|
-
|
|
499
|
+
if (node.callee.type !== utils.AST_NODE_TYPES.MemberExpression) {
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
if (!core.ERPhaseRelevance.has(fKind)) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
459
505
|
const { object } = node.callee;
|
|
460
506
|
tsPattern.match(getCallKind3(node, context)).with("disconnect", () => {
|
|
461
507
|
dEntries.push({
|
|
@@ -468,7 +514,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
468
514
|
});
|
|
469
515
|
}).with("observe", () => {
|
|
470
516
|
const [element] = node.arguments;
|
|
471
|
-
if (!element)
|
|
517
|
+
if (!element) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
472
520
|
oEntries.push({
|
|
473
521
|
kind: "observe",
|
|
474
522
|
node,
|
|
@@ -480,7 +528,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
480
528
|
});
|
|
481
529
|
}).with("unobserve", () => {
|
|
482
530
|
const [element] = node.arguments;
|
|
483
|
-
if (!element)
|
|
531
|
+
if (!element) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
484
534
|
uEntries.push({
|
|
485
535
|
kind: "unobserve",
|
|
486
536
|
node,
|
|
@@ -494,8 +544,12 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
494
544
|
},
|
|
495
545
|
["NewExpression"](node) {
|
|
496
546
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
497
|
-
if (!fNode || !core.ERPhaseRelevance.has(fKind))
|
|
498
|
-
|
|
547
|
+
if (!fNode || !core.ERPhaseRelevance.has(fKind)) {
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
if (!isNewResizeObserver(node)) {
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
499
553
|
const id = getInstanceID(node);
|
|
500
554
|
if (eff.O.isNone(id)) {
|
|
501
555
|
context.report({
|
|
@@ -508,7 +562,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
508
562
|
},
|
|
509
563
|
["Program:exit"]() {
|
|
510
564
|
for (const [node, id, _, phaseNode] of observers) {
|
|
511
|
-
if (dEntries.some((e) => isInstanceIDEqual(e.observer, id, context)))
|
|
565
|
+
if (dEntries.some((e) => isInstanceIDEqual(e.observer, id, context))) {
|
|
566
|
+
continue;
|
|
567
|
+
}
|
|
512
568
|
const oentries = oEntries.filter((e) => isInstanceIDEqual(e.observer, id, context));
|
|
513
569
|
const uentries = uEntries.filter((e) => isInstanceIDEqual(e.observer, id, context));
|
|
514
570
|
const isDynamic = eff.or(AST2__namespace.isConditional, AST2__namespace.is(utils.AST_NODE_TYPES.CallExpression));
|
|
@@ -519,7 +575,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
519
575
|
continue;
|
|
520
576
|
}
|
|
521
577
|
for (const oEntry of oentries) {
|
|
522
|
-
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context)))
|
|
578
|
+
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context))) {
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
523
581
|
context.report({ messageId: "noLeakedResizeObserver", node: oEntry.node });
|
|
524
582
|
}
|
|
525
583
|
}
|
|
@@ -558,7 +616,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
558
616
|
},
|
|
559
617
|
name: RULE_NAME4,
|
|
560
618
|
create(context) {
|
|
561
|
-
if (!context.sourceCode.text.includes("setTimeout"))
|
|
619
|
+
if (!context.sourceCode.text.includes("setTimeout")) {
|
|
620
|
+
return {};
|
|
621
|
+
}
|
|
562
622
|
const fStack = [];
|
|
563
623
|
const sEntries = [];
|
|
564
624
|
const rEntries = [];
|
|
@@ -575,8 +635,12 @@ var no_leaked_timeout_default = createRule({
|
|
|
575
635
|
},
|
|
576
636
|
["CallExpression"](node) {
|
|
577
637
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
578
|
-
if (!fNode || !fKind)
|
|
579
|
-
|
|
638
|
+
if (!fNode || !fKind) {
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
if (!core.ERPhaseRelevance.has(fKind)) {
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
580
644
|
switch (getCallKind4(node)) {
|
|
581
645
|
case "setTimeout": {
|
|
582
646
|
const timeoutIdNode = eff.O.getOrNull(VAR2__namespace.getVariableDeclaratorID(node));
|
|
@@ -598,7 +662,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
598
662
|
}
|
|
599
663
|
case "clearTimeout": {
|
|
600
664
|
const [timeoutIdNode] = node.arguments;
|
|
601
|
-
if (!timeoutIdNode)
|
|
665
|
+
if (!timeoutIdNode) {
|
|
666
|
+
break;
|
|
667
|
+
}
|
|
602
668
|
rEntries.push({
|
|
603
669
|
kind: "timeout",
|
|
604
670
|
node,
|
|
@@ -612,7 +678,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
612
678
|
},
|
|
613
679
|
["Program:exit"]() {
|
|
614
680
|
for (const sEntry of sEntries) {
|
|
615
|
-
if (rEntries.some((rEntry) => isInverseEntry(sEntry, rEntry)))
|
|
681
|
+
if (rEntries.some((rEntry) => isInverseEntry(sEntry, rEntry))) {
|
|
682
|
+
continue;
|
|
683
|
+
}
|
|
616
684
|
switch (sEntry.phase) {
|
|
617
685
|
case "setup":
|
|
618
686
|
case "cleanup":
|
package/dist/index.mjs
CHANGED
|
@@ -10,7 +10,7 @@ import { AST_NODE_TYPES as AST_NODE_TYPES$1 } from '@typescript-eslint/types';
|
|
|
10
10
|
|
|
11
11
|
// package.json
|
|
12
12
|
var name = "eslint-plugin-react-web-api";
|
|
13
|
-
var version = "1.23.
|
|
13
|
+
var version = "1.23.3-next.1";
|
|
14
14
|
var createRule = createRuleForPlugin("web-api");
|
|
15
15
|
function getInstanceID(node, prev) {
|
|
16
16
|
switch (true) {
|
|
@@ -78,7 +78,9 @@ function getOptions(node, initialScope) {
|
|
|
78
78
|
return JSX.findPropInProperties(properties, initialScope)(propName);
|
|
79
79
|
};
|
|
80
80
|
const getPropValue = (prop) => {
|
|
81
|
-
if (prop.type !== AST_NODE_TYPES.Property)
|
|
81
|
+
if (prop.type !== AST_NODE_TYPES.Property) {
|
|
82
|
+
return O.none();
|
|
83
|
+
}
|
|
82
84
|
const { value } = prop;
|
|
83
85
|
switch (value.type) {
|
|
84
86
|
case AST_NODE_TYPES.Literal: {
|
|
@@ -110,7 +112,9 @@ function getOptions(node, initialScope) {
|
|
|
110
112
|
const vCapture = O.flatMap(pCapture, getPropValue).pipe(O.filter(isBoolean));
|
|
111
113
|
const pSignal = findProp(node2.properties, "signal");
|
|
112
114
|
const vSignal = O.flatMap(pSignal, (prop) => {
|
|
113
|
-
if (prop.type !== AST_NODE_TYPES.Property)
|
|
115
|
+
if (prop.type !== AST_NODE_TYPES.Property) {
|
|
116
|
+
return O.none();
|
|
117
|
+
}
|
|
114
118
|
const { value } = prop;
|
|
115
119
|
return getSignalValueExpression(value, initialScope);
|
|
116
120
|
});
|
|
@@ -139,8 +143,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
139
143
|
},
|
|
140
144
|
name: RULE_NAME,
|
|
141
145
|
create(context) {
|
|
142
|
-
if (!context.sourceCode.text.includes("addEventListener"))
|
|
143
|
-
|
|
146
|
+
if (!context.sourceCode.text.includes("addEventListener")) {
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
if (!/use\w*Effect|componentDidMount|componentWillUnmount/u.test(context.sourceCode.text)) {
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
144
152
|
const fStack = [];
|
|
145
153
|
const aEntries = [];
|
|
146
154
|
const rEntries = [];
|
|
@@ -157,7 +165,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
157
165
|
function isInverseEntry(aEntry, rEntry) {
|
|
158
166
|
const { type: aType, callee: aCallee, capture: aCapture, listener: aListener, phase: aPhase } = aEntry;
|
|
159
167
|
const { type: rType, callee: rCallee, capture: rCapture, listener: rListener, phase: rPhase } = rEntry;
|
|
160
|
-
if (!isInversePhase(aPhase, rPhase))
|
|
168
|
+
if (!isInversePhase(aPhase, rPhase)) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
161
171
|
return isSameObject(aCallee, rCallee) && AST2.isNodeEqual(aListener, rListener) && VAR2.isNodeValueEqual(aType, rType, [
|
|
162
172
|
context.sourceCode.getScope(aType),
|
|
163
173
|
context.sourceCode.getScope(rType)
|
|
@@ -165,8 +175,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
165
175
|
}
|
|
166
176
|
function checkInlineFunction(node, callKind, options) {
|
|
167
177
|
const [_, listener] = node.arguments;
|
|
168
|
-
if (!AST2.isFunction(listener))
|
|
169
|
-
|
|
178
|
+
if (!AST2.isFunction(listener)) {
|
|
179
|
+
return O.none();
|
|
180
|
+
}
|
|
181
|
+
if (O.isSome(options.signal)) {
|
|
182
|
+
return O.none();
|
|
183
|
+
}
|
|
170
184
|
return O.some({
|
|
171
185
|
messageId: "noLeakedEventListenerOfInlineFunction",
|
|
172
186
|
node: listener,
|
|
@@ -183,11 +197,17 @@ var no_leaked_event_listener_default = createRule({
|
|
|
183
197
|
},
|
|
184
198
|
["CallExpression"](node) {
|
|
185
199
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
186
|
-
if (!fNode || !fKind)
|
|
187
|
-
|
|
200
|
+
if (!fNode || !fKind) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!ERPhaseRelevance.has(fKind)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
188
206
|
match(getCallKind(node)).with("addEventListener", (callKind) => {
|
|
189
207
|
const [type, listener, options] = node.arguments;
|
|
190
|
-
if (!type || !listener)
|
|
208
|
+
if (!type || !listener) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
191
211
|
const opts = options ? getOptions(options, context.sourceCode.getScope(options)) : defaultOptions;
|
|
192
212
|
const { callee } = node;
|
|
193
213
|
O.map(checkInlineFunction(node, callKind, opts), context.report);
|
|
@@ -202,7 +222,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
202
222
|
});
|
|
203
223
|
}).with("removeEventListener", (callKind) => {
|
|
204
224
|
const [type, listener, options] = node.arguments;
|
|
205
|
-
if (!type || !listener)
|
|
225
|
+
if (!type || !listener) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
206
228
|
const opts = options ? getOptions(options, context.sourceCode.getScope(options)) : defaultOptions;
|
|
207
229
|
const { callee } = node;
|
|
208
230
|
O.map(checkInlineFunction(node, callKind, opts), context.report);
|
|
@@ -221,8 +243,12 @@ var no_leaked_event_listener_default = createRule({
|
|
|
221
243
|
},
|
|
222
244
|
["Program:exit"]() {
|
|
223
245
|
for (const aEntry of aEntries) {
|
|
224
|
-
if (O.exists(aEntry.signal, (signal) => abortedSignals.some((as) => isSameObject(as, signal))))
|
|
225
|
-
|
|
246
|
+
if (O.exists(aEntry.signal, (signal) => abortedSignals.some((as) => isSameObject(as, signal)))) {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
if (rEntries.some((rEntry) => isInverseEntry(aEntry, rEntry))) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
226
252
|
switch (aEntry.phase) {
|
|
227
253
|
case "setup":
|
|
228
254
|
case "cleanup":
|
|
@@ -278,7 +304,9 @@ var no_leaked_interval_default = createRule({
|
|
|
278
304
|
},
|
|
279
305
|
name: RULE_NAME2,
|
|
280
306
|
create(context) {
|
|
281
|
-
if (!context.sourceCode.text.includes("setInterval"))
|
|
307
|
+
if (!context.sourceCode.text.includes("setInterval")) {
|
|
308
|
+
return {};
|
|
309
|
+
}
|
|
282
310
|
const fStack = [];
|
|
283
311
|
const sEntries = [];
|
|
284
312
|
const cEntries = [];
|
|
@@ -297,8 +325,12 @@ var no_leaked_interval_default = createRule({
|
|
|
297
325
|
switch (getCallKind2(node)) {
|
|
298
326
|
case "setInterval": {
|
|
299
327
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
300
|
-
if (!fNode || !fKind)
|
|
301
|
-
|
|
328
|
+
if (!fNode || !fKind) {
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
if (!ERPhaseRelevance.has(fKind)) {
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
302
334
|
const intervalIdNode = O.getOrNull(VAR2.getVariableDeclaratorID(node));
|
|
303
335
|
if (!intervalIdNode) {
|
|
304
336
|
context.report({
|
|
@@ -318,10 +350,16 @@ var no_leaked_interval_default = createRule({
|
|
|
318
350
|
}
|
|
319
351
|
case "clearInterval": {
|
|
320
352
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
321
|
-
if (!fNode || !fKind)
|
|
322
|
-
|
|
353
|
+
if (!fNode || !fKind) {
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
if (!ERPhaseRelevance.has(fKind)) {
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
323
359
|
const [intervalIdNode] = node.arguments;
|
|
324
|
-
if (!intervalIdNode)
|
|
360
|
+
if (!intervalIdNode) {
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
325
363
|
cEntries.push({
|
|
326
364
|
kind: "interval",
|
|
327
365
|
node,
|
|
@@ -335,7 +373,9 @@ var no_leaked_interval_default = createRule({
|
|
|
335
373
|
},
|
|
336
374
|
["Program:exit"]() {
|
|
337
375
|
for (const sEntry of sEntries) {
|
|
338
|
-
if (cEntries.some((cEntry) => isInverseEntry(sEntry, cEntry)))
|
|
376
|
+
if (cEntries.some((cEntry) => isInverseEntry(sEntry, cEntry))) {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
339
379
|
switch (sEntry.phase) {
|
|
340
380
|
case "setup":
|
|
341
381
|
case "cleanup":
|
|
@@ -414,7 +454,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
414
454
|
},
|
|
415
455
|
name: RULE_NAME3,
|
|
416
456
|
create(context) {
|
|
417
|
-
if (!context.sourceCode.text.includes("ResizeObserver"))
|
|
457
|
+
if (!context.sourceCode.text.includes("ResizeObserver")) {
|
|
458
|
+
return {};
|
|
459
|
+
}
|
|
418
460
|
const fStack = [];
|
|
419
461
|
const observers = [];
|
|
420
462
|
const oEntries = [];
|
|
@@ -430,8 +472,12 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
430
472
|
},
|
|
431
473
|
["CallExpression"](node) {
|
|
432
474
|
const [_, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
433
|
-
if (node.callee.type !== AST_NODE_TYPES.MemberExpression)
|
|
434
|
-
|
|
475
|
+
if (node.callee.type !== AST_NODE_TYPES.MemberExpression) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
if (!ERPhaseRelevance.has(fKind)) {
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
435
481
|
const { object } = node.callee;
|
|
436
482
|
match(getCallKind3(node, context)).with("disconnect", () => {
|
|
437
483
|
dEntries.push({
|
|
@@ -444,7 +490,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
444
490
|
});
|
|
445
491
|
}).with("observe", () => {
|
|
446
492
|
const [element] = node.arguments;
|
|
447
|
-
if (!element)
|
|
493
|
+
if (!element) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
448
496
|
oEntries.push({
|
|
449
497
|
kind: "observe",
|
|
450
498
|
node,
|
|
@@ -456,7 +504,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
456
504
|
});
|
|
457
505
|
}).with("unobserve", () => {
|
|
458
506
|
const [element] = node.arguments;
|
|
459
|
-
if (!element)
|
|
507
|
+
if (!element) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
460
510
|
uEntries.push({
|
|
461
511
|
kind: "unobserve",
|
|
462
512
|
node,
|
|
@@ -470,8 +520,12 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
470
520
|
},
|
|
471
521
|
["NewExpression"](node) {
|
|
472
522
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
473
|
-
if (!fNode || !ERPhaseRelevance.has(fKind))
|
|
474
|
-
|
|
523
|
+
if (!fNode || !ERPhaseRelevance.has(fKind)) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
if (!isNewResizeObserver(node)) {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
475
529
|
const id = getInstanceID(node);
|
|
476
530
|
if (O.isNone(id)) {
|
|
477
531
|
context.report({
|
|
@@ -484,7 +538,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
484
538
|
},
|
|
485
539
|
["Program:exit"]() {
|
|
486
540
|
for (const [node, id, _, phaseNode] of observers) {
|
|
487
|
-
if (dEntries.some((e) => isInstanceIDEqual(e.observer, id, context)))
|
|
541
|
+
if (dEntries.some((e) => isInstanceIDEqual(e.observer, id, context))) {
|
|
542
|
+
continue;
|
|
543
|
+
}
|
|
488
544
|
const oentries = oEntries.filter((e) => isInstanceIDEqual(e.observer, id, context));
|
|
489
545
|
const uentries = uEntries.filter((e) => isInstanceIDEqual(e.observer, id, context));
|
|
490
546
|
const isDynamic = or(AST2.isConditional, AST2.is(AST_NODE_TYPES.CallExpression));
|
|
@@ -495,7 +551,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
495
551
|
continue;
|
|
496
552
|
}
|
|
497
553
|
for (const oEntry of oentries) {
|
|
498
|
-
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context)))
|
|
554
|
+
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context))) {
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
499
557
|
context.report({ messageId: "noLeakedResizeObserver", node: oEntry.node });
|
|
500
558
|
}
|
|
501
559
|
}
|
|
@@ -534,7 +592,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
534
592
|
},
|
|
535
593
|
name: RULE_NAME4,
|
|
536
594
|
create(context) {
|
|
537
|
-
if (!context.sourceCode.text.includes("setTimeout"))
|
|
595
|
+
if (!context.sourceCode.text.includes("setTimeout")) {
|
|
596
|
+
return {};
|
|
597
|
+
}
|
|
538
598
|
const fStack = [];
|
|
539
599
|
const sEntries = [];
|
|
540
600
|
const rEntries = [];
|
|
@@ -551,8 +611,12 @@ var no_leaked_timeout_default = createRule({
|
|
|
551
611
|
},
|
|
552
612
|
["CallExpression"](node) {
|
|
553
613
|
const [fNode, fKind] = fStack.findLast((f) => f.at(1) !== "other") ?? [];
|
|
554
|
-
if (!fNode || !fKind)
|
|
555
|
-
|
|
614
|
+
if (!fNode || !fKind) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
if (!ERPhaseRelevance.has(fKind)) {
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
556
620
|
switch (getCallKind4(node)) {
|
|
557
621
|
case "setTimeout": {
|
|
558
622
|
const timeoutIdNode = O.getOrNull(VAR2.getVariableDeclaratorID(node));
|
|
@@ -574,7 +638,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
574
638
|
}
|
|
575
639
|
case "clearTimeout": {
|
|
576
640
|
const [timeoutIdNode] = node.arguments;
|
|
577
|
-
if (!timeoutIdNode)
|
|
641
|
+
if (!timeoutIdNode) {
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
578
644
|
rEntries.push({
|
|
579
645
|
kind: "timeout",
|
|
580
646
|
node,
|
|
@@ -588,7 +654,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
588
654
|
},
|
|
589
655
|
["Program:exit"]() {
|
|
590
656
|
for (const sEntry of sEntries) {
|
|
591
|
-
if (rEntries.some((rEntry) => isInverseEntry(sEntry, rEntry)))
|
|
657
|
+
if (rEntries.some((rEntry) => isInverseEntry(sEntry, rEntry))) {
|
|
658
|
+
continue;
|
|
659
|
+
}
|
|
592
660
|
switch (sEntry.phase) {
|
|
593
661
|
case "setup":
|
|
594
662
|
case "cleanup":
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-web-api",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.3-next.1",
|
|
4
4
|
"description": "ESLint React's ESLint plugin for interacting with Web APIs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"author": "Eva1ent<rel1cx@proton.me>",
|
|
24
|
+
"sideEffects": false,
|
|
24
25
|
"exports": {
|
|
25
26
|
".": {
|
|
26
27
|
"import": {
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
"./package.json": "./package.json"
|
|
36
37
|
},
|
|
37
38
|
"main": "dist/index.js",
|
|
39
|
+
"module": "dist/index.mjs",
|
|
38
40
|
"types": "dist/index.d.ts",
|
|
39
41
|
"files": [
|
|
40
42
|
"dist",
|
|
@@ -46,13 +48,13 @@
|
|
|
46
48
|
"@typescript-eslint/utils": "^8.19.1",
|
|
47
49
|
"string-ts": "^2.2.0",
|
|
48
50
|
"ts-pattern": "^5.6.0",
|
|
49
|
-
"@eslint-react/ast": "1.23.
|
|
50
|
-
"@eslint-react/core": "1.23.
|
|
51
|
-
"@eslint-react/eff": "1.23.
|
|
52
|
-
"@eslint-react/jsx": "1.23.
|
|
53
|
-
"@eslint-react/
|
|
54
|
-
"@eslint-react/
|
|
55
|
-
"@eslint-react/var": "1.23.
|
|
51
|
+
"@eslint-react/ast": "1.23.3-next.1",
|
|
52
|
+
"@eslint-react/core": "1.23.3-next.1",
|
|
53
|
+
"@eslint-react/eff": "1.23.3-next.1",
|
|
54
|
+
"@eslint-react/jsx": "1.23.3-next.1",
|
|
55
|
+
"@eslint-react/shared": "1.23.3-next.1",
|
|
56
|
+
"@eslint-react/types": "1.23.3-next.1",
|
|
57
|
+
"@eslint-react/var": "1.23.3-next.1"
|
|
56
58
|
},
|
|
57
59
|
"devDependencies": {
|
|
58
60
|
"@types/react": "^19.0.3",
|
|
@@ -79,8 +81,6 @@
|
|
|
79
81
|
"publishConfig": {
|
|
80
82
|
"access": "public"
|
|
81
83
|
},
|
|
82
|
-
"sideEffects": false,
|
|
83
|
-
"module": "dist/index.mjs",
|
|
84
84
|
"scripts": {
|
|
85
85
|
"build": "tsup --dts-resolve",
|
|
86
86
|
"lint:publish": "publint",
|