From e7c77b37909aaca3259b4993b5141f3cada96bc2 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Fri, 8 Jul 2022 15:19:27 -0700 Subject: [PATCH] feat: allow missing default attribute for let tag --- .changeset/metal-boxes-wash.md | 5 +++++ .../node.compile.error.expected.txt | 5 ----- .../web.compile.error.expected.txt | 5 ----- .../node.render.expected.html | 3 +++ .../web.render.expected.html | 3 +++ src/__tests__/fixtures/let/index.test.ts | 7 ++----- .../let/templates/error-no-default-attr.marko | 2 -- .../let/templates/no-default-attr.marko | 2 ++ src/components/let/translate.ts | 19 ++++++++----------- src/util/deep-freeze/transform.ts | 7 ++++++- 10 files changed, 29 insertions(+), 29 deletions(-) create mode 100644 .changeset/metal-boxes-wash.md delete mode 100644 src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/node.compile.error.expected.txt delete mode 100644 src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/web.compile.error.expected.txt create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/node.render.expected.html create mode 100644 src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/web.render.expected.html delete mode 100644 src/__tests__/fixtures/let/templates/error-no-default-attr.marko create mode 100644 src/__tests__/fixtures/let/templates/no-default-attr.marko diff --git a/.changeset/metal-boxes-wash.md b/.changeset/metal-boxes-wash.md new file mode 100644 index 0000000..a682172 --- /dev/null +++ b/.changeset/metal-boxes-wash.md @@ -0,0 +1,5 @@ +--- +"@marko/tags-api-preview": patch +--- + +Allow missing default attribute for let tag. diff --git a/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/node.compile.error.expected.txt b/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/node.compile.error.expected.txt deleted file mode 100644 index 7f5f8dc..0000000 --- a/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/node.compile.error.expected.txt +++ /dev/null @@ -1,5 +0,0 @@ -src/__tests__/fixtures/let/templates/error-no-default-attr.marko(1,2): The tag must be initialized with a value. -> 1 | - | ^^^ - 2 |
${count}
- 3 | \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/web.compile.error.expected.txt b/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/web.compile.error.expected.txt deleted file mode 100644 index 7f5f8dc..0000000 --- a/src/__tests__/fixtures/let/__snapshots__/let-error-no-default-attr/web.compile.error.expected.txt +++ /dev/null @@ -1,5 +0,0 @@ -src/__tests__/fixtures/let/templates/error-no-default-attr.marko(1,2): The tag must be initialized with a value. -> 1 | - | ^^^ - 2 |
${count}
- 3 | \ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/node.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/node.render.expected.html new file mode 100644 index 0000000..9da8511 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/node.render.expected.html @@ -0,0 +1,3 @@ +
+ undefined +
\ No newline at end of file diff --git a/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/web.render.expected.html b/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/web.render.expected.html new file mode 100644 index 0000000..9da8511 --- /dev/null +++ b/src/__tests__/fixtures/let/__snapshots__/let-no-default-attr/web.render.expected.html @@ -0,0 +1,3 @@ +
+ undefined +
\ 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 261c77e..c111fb9 100644 --- a/src/__tests__/fixtures/let/index.test.ts +++ b/src/__tests__/fixtures/let/index.test.ts @@ -125,6 +125,8 @@ describe( ]) ); +describe(" no default attr", fixture("./templates/no-default-attr.marko")); + describe(" error args", fixture("./templates/error-args.marko")); describe( @@ -147,11 +149,6 @@ describe( fixture("./templates/error-extra-attr.marko") ); -describe( - " error no default attr", - fixture("./templates/error-no-default-attr.marko") -); - describe( " error no tag var", fixture("./templates/error-no-tag-var.marko") diff --git a/src/__tests__/fixtures/let/templates/error-no-default-attr.marko b/src/__tests__/fixtures/let/templates/error-no-default-attr.marko deleted file mode 100644 index 3780e76..0000000 --- a/src/__tests__/fixtures/let/templates/error-no-default-attr.marko +++ /dev/null @@ -1,2 +0,0 @@ - -
${count}
diff --git a/src/__tests__/fixtures/let/templates/no-default-attr.marko b/src/__tests__/fixtures/let/templates/no-default-attr.marko new file mode 100644 index 0000000..fefd908 --- /dev/null +++ b/src/__tests__/fixtures/let/templates/no-default-attr.marko @@ -0,0 +1,2 @@ + +
${typeof value}
diff --git a/src/components/let/translate.ts b/src/components/let/translate.ts index d6a3cb3..7ede042 100644 --- a/src/components/let/translate.ts +++ b/src/components/let/translate.ts @@ -7,7 +7,7 @@ export = function translate(tag: t.NodePath) { const { file } = tag.hub; const server = file.markoOpts.output === "html"; const tagVar = tag.node.var as t.Identifier; - let defaultAttr!: t.NodePath; + let defaultAttr: t.NodePath | undefined; let changeAttr: t.NodePath | undefined; let errorMessage: string | undefined; @@ -33,8 +33,6 @@ export = function translate(tag: t.NodePath) { ? "requires a tag variable" : !t.isIdentifier(tagVar) ? "tag variable cannot be destructured" - : !defaultAttr - ? "must be initialized with a value" : tag.node.body.body.length ? "does not support body content" : tag.node.body.params.length @@ -48,13 +46,16 @@ export = function translate(tag: t.NodePath) { } file.path.scope.crawl(); + const defaultValue = defaultAttr + ? defaultAttr.node.value + : t.unaryExpression("void", t.numericLiteral(0)); const binding = tag.scope.getBinding(tagVar.name)!; if (server) { file.path.scope.crawl(); tag.replaceWith( t.variableDeclaration("const", [ - t.variableDeclarator(tagVar, deepFreeze(file, defaultAttr.node.value)), + t.variableDeclarator(tagVar, deepFreeze(file, defaultValue)), ]) ); } else { @@ -67,7 +68,7 @@ export = function translate(tag: t.NodePath) { t.assignmentExpression( "=", t.memberExpression(meta.state, keyString, true), - deepFreeze(file, defaultAttr.node.value) + deepFreeze(file, defaultValue) ) ); @@ -82,7 +83,7 @@ export = function translate(tag: t.NodePath) { if (t.isFunction(changeAttr.node.value)) { setFnId = changeFnId; - decls.push(t.variableDeclarator(tagVar, defaultAttr.node.value)); + decls.push(t.variableDeclarator(tagVar, defaultValue)); } else { setFnId = tag.scope.generateUidIdentifier(`${tagVar.name}Set`); decls.push( @@ -102,11 +103,7 @@ export = function translate(tag: t.NodePath) { ), t.variableDeclarator( tagVar, - t.conditionalExpression( - changeFnId, - defaultAttr.node.value, - getStateExpr - ) + t.conditionalExpression(changeFnId, defaultValue, getStateExpr) ) ); } diff --git a/src/util/deep-freeze/transform.ts b/src/util/deep-freeze/transform.ts index e51b9d0..7f4dbc2 100644 --- a/src/util/deep-freeze/transform.ts +++ b/src/util/deep-freeze/transform.ts @@ -2,7 +2,12 @@ import { types as t } from "@marko/compiler"; import { importDefault } from "@marko/babel-utils"; export default (file: t.BabelFile, value: t.Expression) => { - if (file.markoOpts.optimize || t.isLiteral(value)) { + if ( + file.markoOpts.optimize || + t.isLiteral(value) || + t.isBinaryExpression(value) || + t.isUnaryExpression(value) + ) { return value; }