diff --git a/.changeset/wise-waves-matter.md b/.changeset/wise-waves-matter.md new file mode 100644 index 0000000..81613fb --- /dev/null +++ b/.changeset/wise-waves-matter.md @@ -0,0 +1,5 @@ +--- +"effector-swc-plugin": patch +--- + +Fix providing `forceScope` for nested `reflect` usage diff --git a/src/visitors/force_scope/reflect.rs b/src/visitors/force_scope/reflect.rs index bdf12be..b8e9123 100644 --- a/src/visitors/force_scope/reflect.rs +++ b/src/visitors/force_scope/reflect.rs @@ -1,6 +1,9 @@ use std::ops::DerefMut; -use swc_core::ecma::{ast::*, visit::VisitMut}; +use swc_core::ecma::{ + ast::*, + visit::{VisitMut, VisitMutWith}, +}; use crate::{ constants::EffectorMethod, @@ -39,6 +42,8 @@ impl ForceReflectScope { impl VisitMut for ForceReflectScope { fn visit_mut_call_expr(&mut self, node: &mut CallExpr) { + node.visit_mut_children_with(self); + let state = self.state.borrow(); let method = node diff --git a/tests/fixtures/view/force_scope/reflect_nested/config.json b/tests/fixtures/view/force_scope/reflect_nested/config.json new file mode 100644 index 0000000..c02dc48 --- /dev/null +++ b/tests/fixtures/view/force_scope/reflect_nested/config.json @@ -0,0 +1 @@ +{ "forceScope": true } \ No newline at end of file diff --git a/tests/fixtures/view/force_scope/reflect_nested/input.js b/tests/fixtures/view/force_scope/reflect_nested/input.js new file mode 100644 index 0000000..51b0dc7 --- /dev/null +++ b/tests/fixtures/view/force_scope/reflect_nested/input.js @@ -0,0 +1,10 @@ +import { reflect } from "@effector/reflect"; + +const Reflected = reflect({ + view: reflect({ + view: Input, + bind: { inner: $name } + }), + bind: { outer: $name }, + useUnitConfig: { forceScope: false } +}); diff --git a/tests/fixtures/view/force_scope/reflect_nested/output.js b/tests/fixtures/view/force_scope/reflect_nested/output.js new file mode 100644 index 0000000..57547dc --- /dev/null +++ b/tests/fixtures/view/force_scope/reflect_nested/output.js @@ -0,0 +1,29 @@ +import { withFactory as _effector$factory } from 'effector'; +import { reflect } from "@effector/reflect"; +const Reflected = _effector$factory({ + sid: "dm21p9d0", + name: "Reflected", + method: "reflect", + fn: ()=>reflect({ + view: _effector$factory({ + sid: "atcsv5is", + name: "view", + method: "reflect", + fn: ()=>reflect({ + view: Input, + bind: { + inner: $name + }, + useUnitConfig: { + forceScope: true + } + }) + }), + bind: { + outer: $name + }, + useUnitConfig: { + forceScope: false + } + }) +});