@taiga-ui/eslint-plugin-experience-next 0.467.0 → 0.468.0
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/README.md +5 -5
- package/index.esm.js +31 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -598,11 +598,11 @@ effect(async () => {
|
|
|
598
598
|
ordinary non-reactive code, nested callbacks, or code that runs after `await`, it usually does not prevent dependency
|
|
599
599
|
tracking and only adds noise. This rule reports those cases, but intentionally allows a few imperative Angular escape
|
|
600
600
|
hatches where `untracked()` can still be useful: `@Pipe().transform`, `ControlValueAccessor.writeValue`,
|
|
601
|
-
`registerOnChange
|
|
602
|
-
|
|
603
|
-
`
|
|
604
|
-
|
|
605
|
-
wrapper.
|
|
601
|
+
`registerOnChange` including patched accessors such as `accessor.writeValue = (...) => {}`, callback-form wrappers used
|
|
602
|
+
inside deferred scheduler / event-handler callbacks, and narrow lazy DI factory wrappers like
|
|
603
|
+
`InjectionToken({factory})` / `useFactory` when they guard creation of a reactive owner such as `effect()` against an
|
|
604
|
+
accidental ambient reactive context. For the narrow case `untracked(() => effect(...))` and similar outer wrappers
|
|
605
|
+
around a reactive call in ordinary code, autofix removes only the useless outer `untracked()` wrapper.
|
|
606
606
|
|
|
607
607
|
```ts
|
|
608
608
|
// ❌ error
|
package/index.esm.js
CHANGED
|
@@ -3347,6 +3347,15 @@ function getObjectPropertyName(node) {
|
|
|
3347
3347
|
}
|
|
3348
3348
|
return typeof node.key.value === 'string' ? node.key.value : null;
|
|
3349
3349
|
}
|
|
3350
|
+
function getMemberExpressionPropertyName(node) {
|
|
3351
|
+
if (!node.computed && node.property.type === AST_NODE_TYPES.Identifier) {
|
|
3352
|
+
return node.property.name;
|
|
3353
|
+
}
|
|
3354
|
+
return node.property.type === AST_NODE_TYPES.Literal &&
|
|
3355
|
+
typeof node.property.value === 'string'
|
|
3356
|
+
? node.property.value
|
|
3357
|
+
: null;
|
|
3358
|
+
}
|
|
3350
3359
|
function getEnclosingClassMember(node) {
|
|
3351
3360
|
for (let current = node.parent; current; current = current.parent) {
|
|
3352
3361
|
if (current.type === AST_NODE_TYPES.MethodDefinition ||
|
|
@@ -3391,13 +3400,31 @@ function isPipeTransformMember(member) {
|
|
|
3391
3400
|
}
|
|
3392
3401
|
return hasNamedDecorator(member.parent.parent, 'Pipe');
|
|
3393
3402
|
}
|
|
3403
|
+
function hasAllowedImperativeAssignment(node) {
|
|
3404
|
+
for (let current = node.parent; current; current = current.parent) {
|
|
3405
|
+
if (!isFunctionLike(current)) {
|
|
3406
|
+
continue;
|
|
3407
|
+
}
|
|
3408
|
+
const parent = current.parent;
|
|
3409
|
+
if (parent.type === AST_NODE_TYPES.AssignmentExpression &&
|
|
3410
|
+
parent.right === current &&
|
|
3411
|
+
parent.left.type === AST_NODE_TYPES.MemberExpression) {
|
|
3412
|
+
const memberName = getMemberExpressionPropertyName(parent.left);
|
|
3413
|
+
if (memberName && IMPERATIVE_UNTRACKED_METHODS.has(memberName)) {
|
|
3414
|
+
return true;
|
|
3415
|
+
}
|
|
3416
|
+
}
|
|
3417
|
+
}
|
|
3418
|
+
return false;
|
|
3419
|
+
}
|
|
3394
3420
|
function isAllowedImperativeAngularContext(node) {
|
|
3395
3421
|
const member = getEnclosingClassMember(node);
|
|
3396
3422
|
const memberName = member ? getClassMemberName(member) : null;
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
3423
|
+
return ((!!member &&
|
|
3424
|
+
!!memberName &&
|
|
3425
|
+
(IMPERATIVE_UNTRACKED_METHODS.has(memberName) ||
|
|
3426
|
+
isPipeTransformMember(member))) ||
|
|
3427
|
+
hasAllowedImperativeAssignment(node));
|
|
3401
3428
|
}
|
|
3402
3429
|
function isDirectCallbackArgument(fn) {
|
|
3403
3430
|
const parent = fn.parent;
|