eslint-plugin-react-web-api 1.26.3-next.2 → 1.26.3-next.20
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.d.mts +35 -10
- package/dist/index.d.ts +35 -10
- package/dist/index.js +77 -30
- package/dist/index.mjs +77 -30
- package/package.json +14 -14
package/dist/index.d.mts
CHANGED
|
@@ -1,23 +1,48 @@
|
|
|
1
1
|
import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
|
|
2
|
+
import { RulePreset } from '@eslint-react/shared';
|
|
2
3
|
|
|
3
|
-
type MessageID$3 = "
|
|
4
|
+
type MessageID$3 = "expectedClearTimeoutInCleanup" | "expectedClearTimeoutInUnmount" | "expectedTimeoutId";
|
|
4
5
|
|
|
5
|
-
type MessageID$2 = "
|
|
6
|
+
type MessageID$2 = "expectedDisconnectInControlFlow" | "expectedDisconnectOrUnobserveInCleanup" | "unexpectedFloatingInstance";
|
|
6
7
|
|
|
7
|
-
type MessageID$1 = "
|
|
8
|
+
type MessageID$1 = "expectedClearIntervalInCleanup" | "expectedClearIntervalInUnmount" | "expectedIntervalId";
|
|
8
9
|
|
|
9
|
-
type MessageID = "
|
|
10
|
+
type MessageID = "expectedRemoveEventListenerInCleanup" | "expectedRemoveEventListenerInUnmount" | "unexpectedInlineFunction";
|
|
10
11
|
|
|
11
12
|
declare const _default: {
|
|
13
|
+
configs: {
|
|
14
|
+
recommended: {
|
|
15
|
+
plugins: {
|
|
16
|
+
"react-web-api": {
|
|
17
|
+
readonly meta: {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly version: string;
|
|
20
|
+
};
|
|
21
|
+
readonly rules: {
|
|
22
|
+
readonly "no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
23
|
+
readonly "no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
24
|
+
readonly "no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
25
|
+
readonly "no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
name: string;
|
|
30
|
+
rules: RulePreset;
|
|
31
|
+
};
|
|
32
|
+
"recommended-legacy": {
|
|
33
|
+
plugins: string[];
|
|
34
|
+
rules: RulePreset;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
12
37
|
meta: {
|
|
13
|
-
name: string;
|
|
14
|
-
version: string;
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly version: string;
|
|
15
40
|
};
|
|
16
41
|
rules: {
|
|
17
|
-
"no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
18
|
-
"no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
19
|
-
"no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
20
|
-
"no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
42
|
+
readonly "no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
43
|
+
readonly "no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
44
|
+
readonly "no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
45
|
+
readonly "no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
21
46
|
};
|
|
22
47
|
};
|
|
23
48
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,23 +1,48 @@
|
|
|
1
1
|
import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
|
|
2
|
+
import { RulePreset } from '@eslint-react/shared';
|
|
2
3
|
|
|
3
|
-
type MessageID$3 = "
|
|
4
|
+
type MessageID$3 = "expectedClearTimeoutInCleanup" | "expectedClearTimeoutInUnmount" | "expectedTimeoutId";
|
|
4
5
|
|
|
5
|
-
type MessageID$2 = "
|
|
6
|
+
type MessageID$2 = "expectedDisconnectInControlFlow" | "expectedDisconnectOrUnobserveInCleanup" | "unexpectedFloatingInstance";
|
|
6
7
|
|
|
7
|
-
type MessageID$1 = "
|
|
8
|
+
type MessageID$1 = "expectedClearIntervalInCleanup" | "expectedClearIntervalInUnmount" | "expectedIntervalId";
|
|
8
9
|
|
|
9
|
-
type MessageID = "
|
|
10
|
+
type MessageID = "expectedRemoveEventListenerInCleanup" | "expectedRemoveEventListenerInUnmount" | "unexpectedInlineFunction";
|
|
10
11
|
|
|
11
12
|
declare const _default: {
|
|
13
|
+
configs: {
|
|
14
|
+
recommended: {
|
|
15
|
+
plugins: {
|
|
16
|
+
"react-web-api": {
|
|
17
|
+
readonly meta: {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly version: string;
|
|
20
|
+
};
|
|
21
|
+
readonly rules: {
|
|
22
|
+
readonly "no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
23
|
+
readonly "no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
24
|
+
readonly "no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
25
|
+
readonly "no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
name: string;
|
|
30
|
+
rules: RulePreset;
|
|
31
|
+
};
|
|
32
|
+
"recommended-legacy": {
|
|
33
|
+
plugins: string[];
|
|
34
|
+
rules: RulePreset;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
12
37
|
meta: {
|
|
13
|
-
name: string;
|
|
14
|
-
version: string;
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly version: string;
|
|
15
40
|
};
|
|
16
41
|
rules: {
|
|
17
|
-
"no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
18
|
-
"no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
19
|
-
"no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
20
|
-
"no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
42
|
+
readonly "no-leaked-event-listener": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
43
|
+
readonly "no-leaked-interval": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$1, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
44
|
+
readonly "no-leaked-resize-observer": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$2, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
45
|
+
readonly "no-leaked-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
21
46
|
};
|
|
22
47
|
};
|
|
23
48
|
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var shared = require('@eslint-react/shared');
|
|
3
4
|
var AST2 = require('@eslint-react/ast');
|
|
4
5
|
var core = require('@eslint-react/core');
|
|
5
6
|
var eff = require('@eslint-react/eff');
|
|
6
7
|
var VAR2 = require('@eslint-react/var');
|
|
7
8
|
var utils = require('@typescript-eslint/utils');
|
|
8
9
|
var tsPattern = require('ts-pattern');
|
|
9
|
-
var shared = require('@eslint-react/shared');
|
|
10
10
|
var types = require('@typescript-eslint/types');
|
|
11
11
|
|
|
12
12
|
function _interopNamespace(e) {
|
|
@@ -30,9 +30,33 @@ function _interopNamespace(e) {
|
|
|
30
30
|
var AST2__namespace = /*#__PURE__*/_interopNamespace(AST2);
|
|
31
31
|
var VAR2__namespace = /*#__PURE__*/_interopNamespace(VAR2);
|
|
32
32
|
|
|
33
|
+
var __defProp = Object.defineProperty;
|
|
34
|
+
var __export = (target, all) => {
|
|
35
|
+
for (var name3 in all)
|
|
36
|
+
__defProp(target, name3, { get: all[name3], enumerable: true });
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/configs/recommended.ts
|
|
40
|
+
var recommended_exports = {};
|
|
41
|
+
__export(recommended_exports, {
|
|
42
|
+
name: () => name,
|
|
43
|
+
rules: () => rules,
|
|
44
|
+
settings: () => settings
|
|
45
|
+
});
|
|
46
|
+
var name = "react-web-api/recommended";
|
|
47
|
+
var rules = {
|
|
48
|
+
"react-web-api/no-leaked-event-listener": "warn",
|
|
49
|
+
"react-web-api/no-leaked-interval": "warn",
|
|
50
|
+
"react-web-api/no-leaked-resize-observer": "warn",
|
|
51
|
+
"react-web-api/no-leaked-timeout": "warn"
|
|
52
|
+
};
|
|
53
|
+
var settings = {
|
|
54
|
+
"react-x": shared.DEFAULT_ESLINT_REACT_SETTINGS
|
|
55
|
+
};
|
|
56
|
+
|
|
33
57
|
// package.json
|
|
34
|
-
var
|
|
35
|
-
var version = "1.26.3-next.
|
|
58
|
+
var name2 = "eslint-plugin-react-web-api";
|
|
59
|
+
var version = "1.26.3-next.20";
|
|
36
60
|
var createRule = shared.createRuleForPlugin("web-api");
|
|
37
61
|
function getInstanceID(node, prev) {
|
|
38
62
|
switch (true) {
|
|
@@ -148,9 +172,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
148
172
|
[Symbol.for("rule_features")]: RULE_FEATURES
|
|
149
173
|
},
|
|
150
174
|
messages: {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
175
|
+
expectedRemoveEventListenerInCleanup: "An 'addEventListener' in '{{effectMethodKind}}' should have a corresponding 'removeEventListener' in its cleanup function.",
|
|
176
|
+
expectedRemoveEventListenerInUnmount: "An 'addEventListener' in 'componentDidMount' should have a corresponding 'removeEventListener' in 'componentWillUnmount' method.",
|
|
177
|
+
unexpectedInlineFunction: "A/an '{{eventMethodKind}}' should not have an inline listener function."
|
|
154
178
|
},
|
|
155
179
|
schema: []
|
|
156
180
|
},
|
|
@@ -195,7 +219,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
195
219
|
return;
|
|
196
220
|
}
|
|
197
221
|
context.report({
|
|
198
|
-
messageId: "
|
|
222
|
+
messageId: "unexpectedInlineFunction",
|
|
199
223
|
node: listener,
|
|
200
224
|
data: { eventMethodKind: callKind }
|
|
201
225
|
});
|
|
@@ -267,7 +291,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
267
291
|
case "setup":
|
|
268
292
|
case "cleanup":
|
|
269
293
|
context.report({
|
|
270
|
-
messageId: "
|
|
294
|
+
messageId: "expectedRemoveEventListenerInCleanup",
|
|
271
295
|
node: aEntry.node,
|
|
272
296
|
data: {
|
|
273
297
|
effectMethodKind: "useEffect"
|
|
@@ -277,7 +301,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
277
301
|
case "mount":
|
|
278
302
|
case "unmount":
|
|
279
303
|
context.report({
|
|
280
|
-
messageId: "
|
|
304
|
+
messageId: "expectedRemoveEventListenerInUnmount",
|
|
281
305
|
node: aEntry.node
|
|
282
306
|
});
|
|
283
307
|
continue;
|
|
@@ -310,9 +334,9 @@ var no_leaked_interval_default = createRule({
|
|
|
310
334
|
[Symbol.for("rule_features")]: RULE_FEATURES2
|
|
311
335
|
},
|
|
312
336
|
messages: {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
337
|
+
expectedClearIntervalInCleanup: "A 'setInterval' created in '{{ kind }}' must be cleared with 'clearInterval' in the cleanup function.",
|
|
338
|
+
expectedClearIntervalInUnmount: "A 'setInterval' created in '{{ kind }}' must be cleared with 'clearInterval' in the 'componentWillUnmount' method.",
|
|
339
|
+
expectedIntervalId: "A 'setInterval' must be assigned to a variable for proper cleanup."
|
|
316
340
|
},
|
|
317
341
|
schema: []
|
|
318
342
|
},
|
|
@@ -348,7 +372,7 @@ var no_leaked_interval_default = createRule({
|
|
|
348
372
|
const intervalIdNode = VAR2__namespace.getVariableDeclaratorId(node);
|
|
349
373
|
if (intervalIdNode == null) {
|
|
350
374
|
context.report({
|
|
351
|
-
messageId: "
|
|
375
|
+
messageId: "expectedIntervalId",
|
|
352
376
|
node
|
|
353
377
|
});
|
|
354
378
|
break;
|
|
@@ -394,7 +418,7 @@ var no_leaked_interval_default = createRule({
|
|
|
394
418
|
case "setup":
|
|
395
419
|
case "cleanup":
|
|
396
420
|
context.report({
|
|
397
|
-
messageId: "
|
|
421
|
+
messageId: "expectedClearIntervalInCleanup",
|
|
398
422
|
node: sEntry.node,
|
|
399
423
|
data: {
|
|
400
424
|
kind: "useEffect"
|
|
@@ -404,7 +428,7 @@ var no_leaked_interval_default = createRule({
|
|
|
404
428
|
case "mount":
|
|
405
429
|
case "unmount":
|
|
406
430
|
context.report({
|
|
407
|
-
messageId: "
|
|
431
|
+
messageId: "expectedClearIntervalInUnmount",
|
|
408
432
|
node: sEntry.node,
|
|
409
433
|
data: {
|
|
410
434
|
kind: "componentDidMount"
|
|
@@ -459,9 +483,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
459
483
|
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
460
484
|
},
|
|
461
485
|
messages: {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
486
|
+
expectedDisconnectInControlFlow: "Dynamically added 'ResizeObserver.observe' should be cleared all at once using 'ResizeObserver.disconnect' in the cleanup function.",
|
|
487
|
+
expectedDisconnectOrUnobserveInCleanup: "A 'ResizeObserver' instance created in 'useEffect' must be disconnected in the cleanup function.",
|
|
488
|
+
unexpectedFloatingInstance: "A 'ResizeObserver' instance created in component or custom Hook must be assigned to a variable for proper cleanup."
|
|
465
489
|
},
|
|
466
490
|
schema: []
|
|
467
491
|
},
|
|
@@ -543,7 +567,7 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
543
567
|
const id = getInstanceID(node);
|
|
544
568
|
if (id == null) {
|
|
545
569
|
context.report({
|
|
546
|
-
messageId: "
|
|
570
|
+
messageId: "unexpectedFloatingInstance",
|
|
547
571
|
node
|
|
548
572
|
});
|
|
549
573
|
return;
|
|
@@ -566,14 +590,14 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
566
590
|
const isPhaseNode = (node2) => node2 === phaseNode;
|
|
567
591
|
const hasDynamicallyAdded = oentries.some((e) => !isPhaseNode(AST2__namespace.findParentNode(e.node, eff.or(isDynamic, isPhaseNode))));
|
|
568
592
|
if (hasDynamicallyAdded) {
|
|
569
|
-
context.report({ messageId: "
|
|
593
|
+
context.report({ messageId: "expectedDisconnectInControlFlow", node });
|
|
570
594
|
continue;
|
|
571
595
|
}
|
|
572
596
|
for (const oEntry of oentries) {
|
|
573
597
|
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context))) {
|
|
574
598
|
continue;
|
|
575
599
|
}
|
|
576
|
-
context.report({ messageId: "
|
|
600
|
+
context.report({ messageId: "expectedDisconnectOrUnobserveInCleanup", node: oEntry.node });
|
|
577
601
|
}
|
|
578
602
|
}
|
|
579
603
|
}
|
|
@@ -603,9 +627,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
603
627
|
[Symbol.for("rule_features")]: RULE_FEATURES4
|
|
604
628
|
},
|
|
605
629
|
messages: {
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
630
|
+
expectedClearTimeoutInCleanup: "A 'setTimeout' created in '{{ kind }}' must be cleared with 'clearTimeout' in the cleanup function.",
|
|
631
|
+
expectedClearTimeoutInUnmount: "A 'setTimeout' created in '{{ kind }}' must be cleared with 'clearTimeout' in the 'componentWillUnmount' method.",
|
|
632
|
+
expectedTimeoutId: "A 'setTimeout' must be assigned to a variable for proper cleanup."
|
|
609
633
|
},
|
|
610
634
|
schema: []
|
|
611
635
|
},
|
|
@@ -638,7 +662,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
638
662
|
const timeoutIdNode = VAR2__namespace.getVariableDeclaratorId(node);
|
|
639
663
|
if (timeoutIdNode == null) {
|
|
640
664
|
context.report({
|
|
641
|
-
messageId: "
|
|
665
|
+
messageId: "expectedTimeoutId",
|
|
642
666
|
node
|
|
643
667
|
});
|
|
644
668
|
break;
|
|
@@ -677,7 +701,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
677
701
|
case "setup":
|
|
678
702
|
case "cleanup":
|
|
679
703
|
context.report({
|
|
680
|
-
messageId: "
|
|
704
|
+
messageId: "expectedClearTimeoutInCleanup",
|
|
681
705
|
node: sEntry.node,
|
|
682
706
|
data: {
|
|
683
707
|
kind: "useEffect"
|
|
@@ -687,7 +711,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
687
711
|
case "mount":
|
|
688
712
|
case "unmount":
|
|
689
713
|
context.report({
|
|
690
|
-
messageId: "
|
|
714
|
+
messageId: "expectedClearTimeoutInUnmount",
|
|
691
715
|
node: sEntry.node,
|
|
692
716
|
data: {
|
|
693
717
|
kind: "componentDidMount"
|
|
@@ -702,10 +726,10 @@ var no_leaked_timeout_default = createRule({
|
|
|
702
726
|
defaultOptions: []
|
|
703
727
|
});
|
|
704
728
|
|
|
705
|
-
// src/
|
|
706
|
-
var
|
|
729
|
+
// src/plugin.ts
|
|
730
|
+
var plugin = {
|
|
707
731
|
meta: {
|
|
708
|
-
name,
|
|
732
|
+
name: name2,
|
|
709
733
|
version
|
|
710
734
|
},
|
|
711
735
|
rules: {
|
|
@@ -716,4 +740,27 @@ var index_default = {
|
|
|
716
740
|
}
|
|
717
741
|
};
|
|
718
742
|
|
|
743
|
+
// src/index.ts
|
|
744
|
+
function makeConfig(config) {
|
|
745
|
+
return {
|
|
746
|
+
...config,
|
|
747
|
+
plugins: {
|
|
748
|
+
"react-web-api": plugin
|
|
749
|
+
}
|
|
750
|
+
};
|
|
751
|
+
}
|
|
752
|
+
function makeLegacyConfig({ rules: rules2 }) {
|
|
753
|
+
return {
|
|
754
|
+
plugins: ["react-web-api"],
|
|
755
|
+
rules: rules2
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
var index_default = {
|
|
759
|
+
...plugin,
|
|
760
|
+
configs: {
|
|
761
|
+
["recommended"]: makeConfig(recommended_exports),
|
|
762
|
+
["recommended-legacy"]: makeLegacyConfig(recommended_exports)
|
|
763
|
+
}
|
|
764
|
+
};
|
|
765
|
+
|
|
719
766
|
module.exports = index_default;
|
package/dist/index.mjs
CHANGED
|
@@ -1,15 +1,39 @@
|
|
|
1
|
+
import { createRuleForPlugin, DEFAULT_ESLINT_REACT_SETTINGS } from '@eslint-react/shared';
|
|
1
2
|
import * as AST2 from '@eslint-react/ast';
|
|
2
3
|
import { ERPhaseRelevance, isInversePhase, isFunctionOfUseEffectSetup, isFunctionOfUseEffectCleanup, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount } from '@eslint-react/core';
|
|
3
4
|
import { _, or } from '@eslint-react/eff';
|
|
4
5
|
import * as VAR2 from '@eslint-react/var';
|
|
5
6
|
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
6
7
|
import { match, isMatching, P } from 'ts-pattern';
|
|
7
|
-
import { createRuleForPlugin } from '@eslint-react/shared';
|
|
8
8
|
import { AST_NODE_TYPES as AST_NODE_TYPES$1 } from '@typescript-eslint/types';
|
|
9
9
|
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __export = (target, all) => {
|
|
12
|
+
for (var name3 in all)
|
|
13
|
+
__defProp(target, name3, { get: all[name3], enumerable: true });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// src/configs/recommended.ts
|
|
17
|
+
var recommended_exports = {};
|
|
18
|
+
__export(recommended_exports, {
|
|
19
|
+
name: () => name,
|
|
20
|
+
rules: () => rules,
|
|
21
|
+
settings: () => settings
|
|
22
|
+
});
|
|
23
|
+
var name = "react-web-api/recommended";
|
|
24
|
+
var rules = {
|
|
25
|
+
"react-web-api/no-leaked-event-listener": "warn",
|
|
26
|
+
"react-web-api/no-leaked-interval": "warn",
|
|
27
|
+
"react-web-api/no-leaked-resize-observer": "warn",
|
|
28
|
+
"react-web-api/no-leaked-timeout": "warn"
|
|
29
|
+
};
|
|
30
|
+
var settings = {
|
|
31
|
+
"react-x": DEFAULT_ESLINT_REACT_SETTINGS
|
|
32
|
+
};
|
|
33
|
+
|
|
10
34
|
// package.json
|
|
11
|
-
var
|
|
12
|
-
var version = "1.26.3-next.
|
|
35
|
+
var name2 = "eslint-plugin-react-web-api";
|
|
36
|
+
var version = "1.26.3-next.20";
|
|
13
37
|
var createRule = createRuleForPlugin("web-api");
|
|
14
38
|
function getInstanceID(node, prev) {
|
|
15
39
|
switch (true) {
|
|
@@ -125,9 +149,9 @@ var no_leaked_event_listener_default = createRule({
|
|
|
125
149
|
[Symbol.for("rule_features")]: RULE_FEATURES
|
|
126
150
|
},
|
|
127
151
|
messages: {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
152
|
+
expectedRemoveEventListenerInCleanup: "An 'addEventListener' in '{{effectMethodKind}}' should have a corresponding 'removeEventListener' in its cleanup function.",
|
|
153
|
+
expectedRemoveEventListenerInUnmount: "An 'addEventListener' in 'componentDidMount' should have a corresponding 'removeEventListener' in 'componentWillUnmount' method.",
|
|
154
|
+
unexpectedInlineFunction: "A/an '{{eventMethodKind}}' should not have an inline listener function."
|
|
131
155
|
},
|
|
132
156
|
schema: []
|
|
133
157
|
},
|
|
@@ -172,7 +196,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
172
196
|
return;
|
|
173
197
|
}
|
|
174
198
|
context.report({
|
|
175
|
-
messageId: "
|
|
199
|
+
messageId: "unexpectedInlineFunction",
|
|
176
200
|
node: listener,
|
|
177
201
|
data: { eventMethodKind: callKind }
|
|
178
202
|
});
|
|
@@ -244,7 +268,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
244
268
|
case "setup":
|
|
245
269
|
case "cleanup":
|
|
246
270
|
context.report({
|
|
247
|
-
messageId: "
|
|
271
|
+
messageId: "expectedRemoveEventListenerInCleanup",
|
|
248
272
|
node: aEntry.node,
|
|
249
273
|
data: {
|
|
250
274
|
effectMethodKind: "useEffect"
|
|
@@ -254,7 +278,7 @@ var no_leaked_event_listener_default = createRule({
|
|
|
254
278
|
case "mount":
|
|
255
279
|
case "unmount":
|
|
256
280
|
context.report({
|
|
257
|
-
messageId: "
|
|
281
|
+
messageId: "expectedRemoveEventListenerInUnmount",
|
|
258
282
|
node: aEntry.node
|
|
259
283
|
});
|
|
260
284
|
continue;
|
|
@@ -287,9 +311,9 @@ var no_leaked_interval_default = createRule({
|
|
|
287
311
|
[Symbol.for("rule_features")]: RULE_FEATURES2
|
|
288
312
|
},
|
|
289
313
|
messages: {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
314
|
+
expectedClearIntervalInCleanup: "A 'setInterval' created in '{{ kind }}' must be cleared with 'clearInterval' in the cleanup function.",
|
|
315
|
+
expectedClearIntervalInUnmount: "A 'setInterval' created in '{{ kind }}' must be cleared with 'clearInterval' in the 'componentWillUnmount' method.",
|
|
316
|
+
expectedIntervalId: "A 'setInterval' must be assigned to a variable for proper cleanup."
|
|
293
317
|
},
|
|
294
318
|
schema: []
|
|
295
319
|
},
|
|
@@ -325,7 +349,7 @@ var no_leaked_interval_default = createRule({
|
|
|
325
349
|
const intervalIdNode = VAR2.getVariableDeclaratorId(node);
|
|
326
350
|
if (intervalIdNode == null) {
|
|
327
351
|
context.report({
|
|
328
|
-
messageId: "
|
|
352
|
+
messageId: "expectedIntervalId",
|
|
329
353
|
node
|
|
330
354
|
});
|
|
331
355
|
break;
|
|
@@ -371,7 +395,7 @@ var no_leaked_interval_default = createRule({
|
|
|
371
395
|
case "setup":
|
|
372
396
|
case "cleanup":
|
|
373
397
|
context.report({
|
|
374
|
-
messageId: "
|
|
398
|
+
messageId: "expectedClearIntervalInCleanup",
|
|
375
399
|
node: sEntry.node,
|
|
376
400
|
data: {
|
|
377
401
|
kind: "useEffect"
|
|
@@ -381,7 +405,7 @@ var no_leaked_interval_default = createRule({
|
|
|
381
405
|
case "mount":
|
|
382
406
|
case "unmount":
|
|
383
407
|
context.report({
|
|
384
|
-
messageId: "
|
|
408
|
+
messageId: "expectedClearIntervalInUnmount",
|
|
385
409
|
node: sEntry.node,
|
|
386
410
|
data: {
|
|
387
411
|
kind: "componentDidMount"
|
|
@@ -436,9 +460,9 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
436
460
|
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
437
461
|
},
|
|
438
462
|
messages: {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
463
|
+
expectedDisconnectInControlFlow: "Dynamically added 'ResizeObserver.observe' should be cleared all at once using 'ResizeObserver.disconnect' in the cleanup function.",
|
|
464
|
+
expectedDisconnectOrUnobserveInCleanup: "A 'ResizeObserver' instance created in 'useEffect' must be disconnected in the cleanup function.",
|
|
465
|
+
unexpectedFloatingInstance: "A 'ResizeObserver' instance created in component or custom Hook must be assigned to a variable for proper cleanup."
|
|
442
466
|
},
|
|
443
467
|
schema: []
|
|
444
468
|
},
|
|
@@ -520,7 +544,7 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
520
544
|
const id = getInstanceID(node);
|
|
521
545
|
if (id == null) {
|
|
522
546
|
context.report({
|
|
523
|
-
messageId: "
|
|
547
|
+
messageId: "unexpectedFloatingInstance",
|
|
524
548
|
node
|
|
525
549
|
});
|
|
526
550
|
return;
|
|
@@ -543,14 +567,14 @@ var no_leaked_resize_observer_default = createRule({
|
|
|
543
567
|
const isPhaseNode = (node2) => node2 === phaseNode;
|
|
544
568
|
const hasDynamicallyAdded = oentries.some((e) => !isPhaseNode(AST2.findParentNode(e.node, or(isDynamic, isPhaseNode))));
|
|
545
569
|
if (hasDynamicallyAdded) {
|
|
546
|
-
context.report({ messageId: "
|
|
570
|
+
context.report({ messageId: "expectedDisconnectInControlFlow", node });
|
|
547
571
|
continue;
|
|
548
572
|
}
|
|
549
573
|
for (const oEntry of oentries) {
|
|
550
574
|
if (uentries.some((uEntry) => isInstanceIDEqual(uEntry.element, oEntry.element, context))) {
|
|
551
575
|
continue;
|
|
552
576
|
}
|
|
553
|
-
context.report({ messageId: "
|
|
577
|
+
context.report({ messageId: "expectedDisconnectOrUnobserveInCleanup", node: oEntry.node });
|
|
554
578
|
}
|
|
555
579
|
}
|
|
556
580
|
}
|
|
@@ -580,9 +604,9 @@ var no_leaked_timeout_default = createRule({
|
|
|
580
604
|
[Symbol.for("rule_features")]: RULE_FEATURES4
|
|
581
605
|
},
|
|
582
606
|
messages: {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
607
|
+
expectedClearTimeoutInCleanup: "A 'setTimeout' created in '{{ kind }}' must be cleared with 'clearTimeout' in the cleanup function.",
|
|
608
|
+
expectedClearTimeoutInUnmount: "A 'setTimeout' created in '{{ kind }}' must be cleared with 'clearTimeout' in the 'componentWillUnmount' method.",
|
|
609
|
+
expectedTimeoutId: "A 'setTimeout' must be assigned to a variable for proper cleanup."
|
|
586
610
|
},
|
|
587
611
|
schema: []
|
|
588
612
|
},
|
|
@@ -615,7 +639,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
615
639
|
const timeoutIdNode = VAR2.getVariableDeclaratorId(node);
|
|
616
640
|
if (timeoutIdNode == null) {
|
|
617
641
|
context.report({
|
|
618
|
-
messageId: "
|
|
642
|
+
messageId: "expectedTimeoutId",
|
|
619
643
|
node
|
|
620
644
|
});
|
|
621
645
|
break;
|
|
@@ -654,7 +678,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
654
678
|
case "setup":
|
|
655
679
|
case "cleanup":
|
|
656
680
|
context.report({
|
|
657
|
-
messageId: "
|
|
681
|
+
messageId: "expectedClearTimeoutInCleanup",
|
|
658
682
|
node: sEntry.node,
|
|
659
683
|
data: {
|
|
660
684
|
kind: "useEffect"
|
|
@@ -664,7 +688,7 @@ var no_leaked_timeout_default = createRule({
|
|
|
664
688
|
case "mount":
|
|
665
689
|
case "unmount":
|
|
666
690
|
context.report({
|
|
667
|
-
messageId: "
|
|
691
|
+
messageId: "expectedClearTimeoutInUnmount",
|
|
668
692
|
node: sEntry.node,
|
|
669
693
|
data: {
|
|
670
694
|
kind: "componentDidMount"
|
|
@@ -679,10 +703,10 @@ var no_leaked_timeout_default = createRule({
|
|
|
679
703
|
defaultOptions: []
|
|
680
704
|
});
|
|
681
705
|
|
|
682
|
-
// src/
|
|
683
|
-
var
|
|
706
|
+
// src/plugin.ts
|
|
707
|
+
var plugin = {
|
|
684
708
|
meta: {
|
|
685
|
-
name,
|
|
709
|
+
name: name2,
|
|
686
710
|
version
|
|
687
711
|
},
|
|
688
712
|
rules: {
|
|
@@ -693,4 +717,27 @@ var index_default = {
|
|
|
693
717
|
}
|
|
694
718
|
};
|
|
695
719
|
|
|
720
|
+
// src/index.ts
|
|
721
|
+
function makeConfig(config) {
|
|
722
|
+
return {
|
|
723
|
+
...config,
|
|
724
|
+
plugins: {
|
|
725
|
+
"react-web-api": plugin
|
|
726
|
+
}
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
function makeLegacyConfig({ rules: rules2 }) {
|
|
730
|
+
return {
|
|
731
|
+
plugins: ["react-web-api"],
|
|
732
|
+
rules: rules2
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
var index_default = {
|
|
736
|
+
...plugin,
|
|
737
|
+
configs: {
|
|
738
|
+
["recommended"]: makeConfig(recommended_exports),
|
|
739
|
+
["recommended-legacy"]: makeLegacyConfig(recommended_exports)
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
|
|
696
743
|
export { index_default as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-web-api",
|
|
3
|
-
"version": "1.26.3-next.
|
|
3
|
+
"version": "1.26.3-next.20",
|
|
4
4
|
"description": "ESLint React's ESLint plugin for interacting with Web APIs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -43,23 +43,23 @@
|
|
|
43
43
|
"./package.json"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@typescript-eslint/scope-manager": "^8.
|
|
47
|
-
"@typescript-eslint/types": "^8.
|
|
48
|
-
"@typescript-eslint/utils": "^8.
|
|
46
|
+
"@typescript-eslint/scope-manager": "^8.24.1",
|
|
47
|
+
"@typescript-eslint/types": "^8.24.1",
|
|
48
|
+
"@typescript-eslint/utils": "^8.24.1",
|
|
49
49
|
"string-ts": "^2.2.1",
|
|
50
50
|
"ts-pattern": "^5.6.2",
|
|
51
|
-
"@eslint-react/ast": "1.26.3-next.
|
|
52
|
-
"@eslint-react/core": "1.26.3-next.
|
|
53
|
-
"@eslint-react/eff": "1.26.3-next.
|
|
54
|
-
"@eslint-react/
|
|
55
|
-
"@eslint-react/var": "1.26.3-next.
|
|
56
|
-
"@eslint-react/
|
|
51
|
+
"@eslint-react/ast": "1.26.3-next.20",
|
|
52
|
+
"@eslint-react/core": "1.26.3-next.20",
|
|
53
|
+
"@eslint-react/eff": "1.26.3-next.20",
|
|
54
|
+
"@eslint-react/shared": "1.26.3-next.20",
|
|
55
|
+
"@eslint-react/var": "1.26.3-next.20",
|
|
56
|
+
"@eslint-react/jsx": "1.26.3-next.20"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@types/react": "^19.0.
|
|
60
|
-
"@types/react-dom": "^19.0.
|
|
59
|
+
"@types/react": "^19.0.10",
|
|
60
|
+
"@types/react-dom": "^19.0.4",
|
|
61
61
|
"tsup": "^8.3.6",
|
|
62
|
-
"@
|
|
62
|
+
"@local/configs": "0.0.0"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
65
|
"eslint": "^8.57.0 || ^9.0.0",
|
|
@@ -83,6 +83,6 @@
|
|
|
83
83
|
"scripts": {
|
|
84
84
|
"build": "tsup --dts-resolve",
|
|
85
85
|
"lint:publish": "publint",
|
|
86
|
-
"lint:
|
|
86
|
+
"lint:ts": "tsc --noEmit"
|
|
87
87
|
}
|
|
88
88
|
}
|