@@ -785,6 +785,7 @@ const rule: TSESLint.RuleModule<MessageIds, []> = {
785
785
| T . VariableDeclarator
786
786
| T . AssignmentExpression
787
787
| T . TaggedTemplateExpression
788
+ | T . NewExpression
788
789
) => {
789
790
const pushTrackedScope = ( node : T . Node , expect : TrackedScope [ "expect" ] ) => {
790
791
currentScope ( ) . trackedScopes . push ( { node, expect } ) ;
@@ -848,7 +849,7 @@ const rule: TSESLint.RuleModule<MessageIds, []> = {
848
849
} else if ( node . type === "JSXSpreadAttribute" ) {
849
850
// allow <div {...props.nestedProps} />; {...props} is already ignored
850
851
pushTrackedScope ( node . argument , "expression" ) ;
851
- } else if ( node . type === "CallExpression" ) {
852
+ } else if ( node . type === "CallExpression" || node . type === "NewExpression" ) {
852
853
if ( node . callee . type === "Identifier" ) {
853
854
const {
854
855
callee,
@@ -878,11 +879,18 @@ const rule: TSESLint.RuleModule<MessageIds, []> = {
878
879
} else if (
879
880
matchImport ( [ "onMount" , "onCleanup" , "onError" ] , callee . name ) ||
880
881
[
882
+ // Timers
881
883
"setInterval" ,
882
884
"setTimeout" ,
883
885
"setImmediate" ,
884
886
"requestAnimationFrame" ,
885
887
"requestIdleCallback" ,
888
+ // Observers from Standard Web APIs
889
+ "IntersectionObserver" ,
890
+ "MutationObserver" ,
891
+ "PerformanceObserver" ,
892
+ "ReportingObserver" ,
893
+ "ResizeObserver" ,
886
894
] . includes ( callee . name )
887
895
) {
888
896
// on* and timers are NOT tracked scopes. However, they don't need to react
@@ -1072,6 +1080,9 @@ const rule: TSESLint.RuleModule<MessageIds, []> = {
1072
1080
checkForReactiveAssignment ( null , node ) ;
1073
1081
}
1074
1082
} ,
1083
+ NewExpression ( node : T . NewExpression ) {
1084
+ checkForTrackedScopes ( node ) ;
1085
+ } ,
1075
1086
VariableDeclarator ( node : T . VariableDeclarator ) {
1076
1087
if ( node . init ) {
1077
1088
checkForReactiveAssignment ( node . id , node . init ) ;
0 commit comments