@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 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`, callback-form wrappers used inside deferred scheduler / event-handler callbacks, and narrow lazy DI
602
- factory wrappers like `InjectionToken({factory})` / `useFactory` when they guard creation of a reactive owner such as
603
- `effect()` against an accidental ambient reactive context. For the narrow case `untracked(() => effect(...))` and
604
- similar outer wrappers around a reactive call in ordinary code, autofix removes only the useless outer `untracked()`
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
- if (!member || !memberName) {
3398
- return false;
3399
- }
3400
- return IMPERATIVE_UNTRACKED_METHODS.has(memberName) || isPipeTransformMember(member);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taiga-ui/eslint-plugin-experience-next",
3
- "version": "0.467.0",
3
+ "version": "0.468.0",
4
4
  "description": "An ESLint plugin to enforce a consistent code styles across taiga-ui projects",
5
5
  "repository": {
6
6
  "type": "git",