diff --git a/.changeset/new-avocados-walk.md b/.changeset/new-avocados-walk.md new file mode 100644 index 0000000..88cf689 --- /dev/null +++ b/.changeset/new-avocados-walk.md @@ -0,0 +1,5 @@ +--- +"@marko/tags-api-preview": patch +--- + +improve member expression caching diff --git a/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/node.render.expected.html b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/node.render.expected.html new file mode 100644 index 0000000..c1c800b --- /dev/null +++ b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/node.render.expected.html @@ -0,0 +1,6 @@ +
+ 9 string length = 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.render.expected.html b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.render.expected.html new file mode 100644 index 0000000..c1c800b --- /dev/null +++ b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.render.expected.html @@ -0,0 +1,6 @@ ++ 9 string length = 1 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.step-0.expected.html b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.step-0.expected.html new file mode 100644 index 0000000..3b6463b --- /dev/null +++ b/src/__tests__/fixtures/const/__snapshots__/const-state-derived-from-prototype-function/web.step-0.expected.html @@ -0,0 +1,6 @@ ++ 10 string length = 2 +
+ \ No newline at end of file diff --git a/src/__tests__/fixtures/const/index.test.ts b/src/__tests__/fixtures/const/index.test.ts index e5dc94d..5675adc 100644 --- a/src/__tests__/fixtures/const/index.test.ts +++ b/src/__tests__/fixtures/const/index.test.ts @@ -21,6 +21,16 @@ describe( ]) ); +describe( + "${value} string length = ${length}
+ diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/index.test.ts b/src/__tests__/fixtures/misc/cached-conditional-value/index.test.ts deleted file mode 100644 index 6f2cc9e..0000000 --- a/src/__tests__/fixtures/misc/cached-conditional-value/index.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import fixture, { FixtureHelpers } from "../../../fixture"; -const increment = click("Increment"); -const toggle = click("Toggle"); - -describe( - "cached conditional value", - fixture("./templates/basic.marko", [ - {}, - increment, - toggle, - toggle, - increment, - toggle, - ]) -); - -function click(text: string) { - return async ({ fireEvent, screen }: FixtureHelpers) => - await fireEvent.click(screen.getByText(text)); -} diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/node.render.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/node.render.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/node.render.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/node.render.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.render.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.render.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.render.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.render.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-0.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-0.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-0.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-0.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-1.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-1.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-1.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-1.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-2.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-2.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-2.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-2.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-3.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-3.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-3.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-3.expected.html diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-4.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-4.expected.html similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/__snapshots__/cached-conditional-value/web.step-4.expected.html rename to src/__tests__/fixtures/misc/caching/__snapshots__/cached/conditional-value/web.step-4.expected.html diff --git a/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/node.render.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/node.render.expected.html new file mode 100644 index 0000000..98bb062 --- /dev/null +++ b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/node.render.expected.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.render.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.render.expected.html new file mode 100644 index 0000000..98bb062 --- /dev/null +++ b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.render.expected.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.step-0.expected.html b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.step-0.expected.html new file mode 100644 index 0000000..98bb062 --- /dev/null +++ b/src/__tests__/fixtures/misc/caching/__snapshots__/cached/function-call/web.step-0.expected.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/__tests__/fixtures/misc/caching/index.test.ts b/src/__tests__/fixtures/misc/caching/index.test.ts new file mode 100644 index 0000000..9216077 --- /dev/null +++ b/src/__tests__/fixtures/misc/caching/index.test.ts @@ -0,0 +1,51 @@ +import { resetHistory, spy } from "sinon"; +import fixture, { FixtureHelpers } from "../../../fixture"; +const increment = click("Increment"); +const toggle = click("Toggle"); + +const onRender = spy(); + +describe("cached", () => { + beforeEach(() => resetHistory()); + + describe( + "conditional value", + fixture("./templates/conditional-value.marko", [ + {}, + increment, + toggle, + toggle, + increment, + toggle, + ]) + ); + + describe( + "function call", + fixture("./templates/function-call.marko", [ + { fn: onRender }, + async ({ expect, screen, fireEvent, rerender }) => { + expect(onRender).calledOnce; + resetHistory(); + expect(onRender).not.called; + + await fireEvent.click(screen.getByText("increment")); + expect(onRender).not.called; + resetHistory(); + + await rerender(); + expect(onRender).not.called; + resetHistory(); + + await rerender({ fn: () => onRender() }); + expect(onRender).calledOnce; + resetHistory(); + }, + ]) + ); +}); + +function click(text: string) { + return async ({ fireEvent, screen }: FixtureHelpers) => + await fireEvent.click(screen.getByText(text)); +} diff --git a/src/__tests__/fixtures/misc/cached-conditional-value/templates/basic.marko b/src/__tests__/fixtures/misc/caching/templates/conditional-value.marko similarity index 100% rename from src/__tests__/fixtures/misc/cached-conditional-value/templates/basic.marko rename to src/__tests__/fixtures/misc/caching/templates/conditional-value.marko diff --git a/src/__tests__/fixtures/misc/caching/templates/function-call.marko b/src/__tests__/fixtures/misc/caching/templates/function-call.marko new file mode 100644 index 0000000..056b4b9 --- /dev/null +++ b/src/__tests__/fixtures/misc/caching/templates/function-call.marko @@ -0,0 +1,3 @@ +