Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: cached values inside attribute tags #60

Merged
merged 2 commits into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/nine-pumas-raise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@marko/tags-api-preview": patch
---

Fix issue with cached values inside attribute tags.
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
TypeError: Cannot add property fullName, object is not extensible
at /src/__tests__/fixture.ts
TypeError: Cannot add property fullName, object is not extensible
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
Error: Assignment to constant variable.
at /src/__tests__/fire-event.ts
at /src/__tests__/fixtures/get-and-set/index.test.ts
at /src/__tests__/fixture.ts
Error: Assignment to constant variable.
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
Error: Assignment to constant variable.
at /src/__tests__/fire-event.ts
at /src/__tests__/fixtures/get-and-set/index.test.ts
at /src/__tests__/fixture.ts
Error: Assignment to constant variable.
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
Error: Assignment to constant variable.
at /src/__tests__/fire-event.ts
at /src/__tests__/fixtures/get-and-set/index.test.ts
at /src/__tests__/fixture.ts
Error: Assignment to constant variable.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div
data-key="hello"
name="Frank"
>
Hello Frank!
</div>
<div
data-key="hello"
name="Frank"
>
Hello Frank!
</div>
<div
data-key="hello"
name="John"
>
Hello John!
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div
data-key="hello"
name="Frank"
>
Hello Frank!
</div>
<div
data-key="hello"
name="Frank"
>
Hello Frank!
</div>
<div
data-key="hello"
name="John"
>
Hello John!
</div>
17 changes: 17 additions & 0 deletions src/__tests__/fixtures/misc/attribute-tags/components/test.marko
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!-- use tags -->
<for|key, value| in=input>
<if=value>
<if=Array.isArray(value)>
<for|item| of=value>
<div data-key=key ...item>
<${item}/>
</div>
</for>
</if>
<else>
<div data-key=key ...value>
<${value}/>
</div>
</else>
</if>
</for>
5 changes: 5 additions & 0 deletions src/__tests__/fixtures/misc/attribute-tags/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import fixture from "../../../fixture";

describe("misc attribute tags", () => {
describe("single", fixture("./templates/single.marko"));
});
17 changes: 17 additions & 0 deletions src/__tests__/fixtures/misc/attribute-tags/templates/single.marko
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!-- use tags -->
<test>
<@hello name="Frank" onClick() {
console.log('Hello Frank!');
}>
Hello Frank!
</@hello>
</test>
<test>
<for|name| of=["Frank", "John"]>
<@hello name=name onClick() {
console.log('Hello ' + name + '!');
}>
Hello ${name}!
</@hello>
</for>
</test>
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
ReferenceError: Cannot access 'x' before initialization
at /src/transform/hoist-tag-vars/index.ts
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before-with-custom-tag.marko
at /src/__tests__/fixture.ts
ReferenceError: Cannot access 'x' before initialization
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
ReferenceError: Cannot access 'x' before initialization
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before-with-custom-tag.marko
ReferenceError: Cannot access 'x' before initialization
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
ReferenceError: Cannot access 'x' before initialization
at /src/transform/hoist-tag-vars/index.ts
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before.marko
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before.marko
at /src/__tests__/fixture.ts
ReferenceError: Cannot access 'x' before initialization
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
ReferenceError: Cannot access 'x' before initialization
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before.marko
at /src/__tests__/fixtures/misc/hoisting/templates/error-hoisting-maybe-sync-read-before.marko
ReferenceError: Cannot access 'x' before initialization
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
Error: Cannot read an element reference while rendering.
at /src/__tests__/fixture.ts
Error: Cannot read an element reference while rendering.
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
Error: Cannot read an element reference while rendering.
at /src/__tests__/fixture.ts
Error: Cannot read an element reference while rendering.
3 changes: 1 addition & 2 deletions src/__tests__/snapshot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ function format(data: any): string {
// eslint-disable-next-line no-control-regex
.replace(/\x1B[[(?);]{0,2}(;?\d)*./g, "")
.replaceAll(process.cwd(), "")
.replace(/\r?\n +at (?![/\\]src[/\\])[^\n]+$/gm, "")
.replace(/(\r?\n +at [/\\]src[/\\].*[^\n]):\d+:\d+$/gm, "$1")
.replace(/\r?\n +at [^\n]+$/gm, "")
);
}
}
Expand Down
32 changes: 31 additions & 1 deletion src/transform/wrapper-component.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { types as t } from "@marko/compiler";
import { isNativeTag, getTagDef } from "@marko/babel-utils";
import {
isNativeTag,
isTransparentTag,
isAttributeTag,
findParentTag,
getTagDef,
} from "@marko/babel-utils";
import { taglibId } from "../util/taglib-id";
import isApi from "../util/is-api";

Expand Down Expand Up @@ -96,6 +102,14 @@ export function ensureLifecycle(tag: t.NodePath<t.MarkoTag>, client = true) {
isNativeTag(root as t.NodePath<t.MarkoTag>)
);

if (isAttributeTagLike(tag)) {
if (isTransparentTag(root as t.NodePath<t.MarkoTag>)) {
root = findParentTag(root as t.NodePath<t.MarkoTag>) || program;
}

root = findParentTag(root as t.NodePath<t.MarkoTag>) || program;
}

if (root.node) {
const roots = lifecycleRootsForProgram.get(program)!;
let extra = root.node.extra;
Expand Down Expand Up @@ -182,3 +196,19 @@ function buildNestedLifecycle(tag: t.NodePath<t.MarkoTag>): t.Statement[] {

return result;
}

function isAttributeTagLike(tag: t.NodePath<t.MarkoTag>) {
if (isAttributeTag(tag)) {
return true;
}

if (isTransparentTag(tag)) {
for (const child of tag.get("body").get("body")) {
if (child.isMarkoTag() && isAttributeTagLike(child)) {
return true;
}
}
}

return false;
}
Loading