From aaff1d80f603e4916d2e594c77cb2099f781ee94 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Mon, 1 Nov 2021 10:44:31 -0700 Subject: [PATCH] fix: issue with bound let always operating as controlled --- .../node.render.expected.html | 6 +++++ .../web.render.expected.html | 6 +++++ .../web.step-0.expected.html | 6 +++++ .../web.step-1.expected.html | 6 +++++ .../web.step-2.expected.html | 6 +++++ .../node.render.expected.html | 6 +++++ .../web.render.expected.html | 6 +++++ .../web.step-0.expected.html | 6 +++++ .../web.step-1.expected.html | 6 +++++ .../web.step-2.expected.html | 6 +++++ src/__tests__/fixtures/let/index.test.ts | 12 +++++++++- src/transform/attribute-bindings.ts | 18 ++++++++------- src/util/replace-assignments/transform.ts | 23 ++++++++++++++----- 13 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/node.render.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.render.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-0.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-1.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-2.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/node.render.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.render.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-0.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-1.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-2.expected.html diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/node.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/node.render.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/node.render.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.render.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.render.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-0.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-0.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-0.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-1.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-1.expected.html new file mode 100644 index 0000000..1be4bb4 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-1.expected.html @@ -0,0 +1,6 @@ +
+ 2 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-2.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-2.expected.html new file mode 100644 index 0000000..1be4bb4 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-controlled/web.step-2.expected.html @@ -0,0 +1,6 @@ +
+ 2 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/node.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/node.render.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/node.render.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.render.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.render.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-0.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-0.expected.html new file mode 100644 index 0000000..c2bb3d7 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-0.expected.html @@ -0,0 +1,6 @@ +
+ 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-1.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-1.expected.html new file mode 100644 index 0000000..1be4bb4 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-1.expected.html @@ -0,0 +1,6 @@ +
+ 2 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-2.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-2.expected.html new file mode 100644 index 0000000..2d6e7f9 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-bound-uncontrolled/web.step-2.expected.html @@ -0,0 +1,6 @@ +
+ 3 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/let/index.test.ts b/src/__tests__/fixtures/let/index.test.ts index 6fbf3a4..331fdd1 100644 --- a/src/__tests__/fixtures/let/index.test.ts +++ b/src/__tests__/fixtures/let/index.test.ts @@ -12,7 +12,7 @@ describe( ); describe( - " bound", + " bound controlled", fixture("./templates/bound.marko", [ { value: 1, valueChange() {} }, increment, @@ -21,6 +21,16 @@ describe( ]) ); +describe( + " bound uncontrolled", + fixture("./templates/bound.marko", [ + { value: 1 }, + { value: 2 }, + increment, + increment, + ]) +); + describe( " read assignment", fixture("./templates/read-assignment.marko", [ diff --git a/src/transform/attribute-bindings.ts b/src/transform/attribute-bindings.ts index 7b15b07..f94f415 100644 --- a/src/transform/attribute-bindings.ts +++ b/src/transform/attribute-bindings.ts @@ -13,16 +13,18 @@ const AttributeVisitor = { } const tempId = t.identifier("_"); - attr.node.bound = false; - attr.insertAfter( - t.markoAttribute( - `${attr.node.name}Change`, - t.arrowFunctionExpression( - [tempId], - t.assignmentExpression("=", value.node, tempId) - ) + + const changeAttr = t.markoAttribute( + `${attr.node.name}Change`, + t.arrowFunctionExpression( + [tempId], + t.assignmentExpression("=", value.node, tempId) ) ); + + attr.node.bound = false; + changeAttr.extra = { ___wasBound: true }; + attr.insertAfter(changeAttr); }, } as t.Visitor; diff --git a/src/util/replace-assignments/transform.ts b/src/util/replace-assignments/transform.ts index febe578..d7ebbc2 100644 --- a/src/util/replace-assignments/transform.ts +++ b/src/util/replace-assignments/transform.ts @@ -30,12 +30,23 @@ export default function replaceAssignments( } if (value) { - assignment.replaceWith( - t.callExpression(importDefault(file, __dirname, "assign"), [ - fnExpression, - value, - ]) - ); + const parent = assignment.parentPath!; + if ( + // If the assignment was from a bound attribute + // we just replace the attr value with the change function. + parent.isFunction() && + parent.parentPath!.isMarkoAttribute() && + parent.parentPath!.node.extra?.___wasBound + ) { + parent.replaceWith(fnExpression); + } else { + assignment.replaceWith( + t.callExpression(importDefault(file, __dirname, "assign"), [ + fnExpression, + value, + ]) + ); + } } } }