diff --git a/packages/translator/src/placeholder/dom.ts b/packages/translator/src/placeholder/dom.ts index 108dca3b3..05612e39e 100644 --- a/packages/translator/src/placeholder/dom.ts +++ b/packages/translator/src/placeholder/dom.ts @@ -12,29 +12,26 @@ import { export default function (placeholder: NodePath) { if (needsPlaceholderMarker(placeholder)) { - console.log("REPLACE"); writeWalks(placeholder, Walks.REPLACE); writeTemplate(placeholder, ""); + if (checkNextMarker(placeholder)) writeWalks(placeholder, Walks.NEXT); } else if (isOnlyChild(placeholder)) { - console.log("GET"); writeWalks(placeholder, Walks.GET); writeTemplate(placeholder, " "); } else if (!checkNextMarker(placeholder)) { - console.log("AFTER"); writeWalks(placeholder, Walks.AFTER); } else { - console.log("BEFORE"); writeWalks(placeholder, Walks.BEFORE); } - // writeHydrate( - // placeholder, - // t.expressionStatement(callRuntime(placeholder, "walk")) - // ); writeHydrate( placeholder, t.expressionStatement( - callRuntime(placeholder, "text", placeholder.get("value").node) + callRuntime( + placeholder, + placeholder.node.escape ? "text" : "html", + placeholder.get("value").node + ) ) ); placeholder.remove(); diff --git a/packages/translator/src/text.ts b/packages/translator/src/text.ts index c2d4b1408..45c7e3d22 100644 --- a/packages/translator/src/text.ts +++ b/packages/translator/src/text.ts @@ -4,8 +4,7 @@ import { Walks, writeTemplate, writeWalks, - markTextSiblings, - checkLastStatic + markTextSiblings } from "./util/dom-writer"; import { isOutputHTML } from "./util/marko-config"; @@ -14,9 +13,7 @@ export default function (text: NodePath) { writeHTML(text)`${text.node.value}`; } else { writeTemplate(text, text.node.value); - if (checkLastStatic(text)) { - writeWalks(text, Walks.NEXT); - } + writeWalks(text, Walks.NEXT); markTextSiblings(text); } diff --git a/packages/translator/src/util/dom-export.ts b/packages/translator/src/util/dom-export.ts index de12c3303..24eb02ba8 100644 --- a/packages/translator/src/util/dom-export.ts +++ b/packages/translator/src/util/dom-export.ts @@ -1,4 +1,9 @@ -import { NodePath, Program, types as t } from "@marko/babel-types"; +import { + NodePath, + Program, + StringLiteral, + types as t +} from "@marko/babel-types"; import { callRuntime } from "./runtime"; import { encodeWalks } from "./walks"; @@ -6,6 +11,19 @@ export function writeExports(path: NodePath) { const template = t.identifier("template"); const walks = t.identifier("walks"); const hydrate = t.identifier("hydrate"); + + let inputs: StringLiteral[] = []; + if (path.node.extra.references && path.node.extra.references.input) { + inputs = Object.keys(path.node.extra.references.input).reduce( + (list: StringLiteral[], key: string) => { + if (path.node.extra.references!.input![key]) { + list.push(t.stringLiteral(key.replace("input.", ""))); + } + return list; + }, + [] + ); + } // template path.node.body.push( t.exportNamedDeclaration( @@ -46,7 +64,7 @@ export function writeExports(path: NodePath) { "createRenderFn", template, walks, - t.arrayExpression(), + t.arrayExpression(inputs), hydrate ) ) diff --git a/packages/translator/src/util/dom-writer.ts b/packages/translator/src/util/dom-writer.ts index 2f7c3b718..91c523233 100644 --- a/packages/translator/src/util/dom-writer.ts +++ b/packages/translator/src/util/dom-writer.ts @@ -22,15 +22,6 @@ export function writeWalks(path: NodePath, code: Walks) { path.state.walks.push(code); } -export function checkLastStatic(path: NodePath) { - let i = +path.key; - let temp: NodePath; - while ((temp = path.getSibling(++i)).node) { - if (t.isMarkoPlaceholder(temp)) return false; - } - return true; -} - export function checkNextMarker(path: NodePath) { let i = +path.key; let temp: NodePath; @@ -49,7 +40,13 @@ export function markTextSiblings(path: NodePath) { export function needsPlaceholderMarker(path: NodePath) { if (!path.state.precedingText) return false; const sibling = path.getSibling(+path.key + 1); - if (sibling && t.isMarkoText(sibling.node)) return true; + if (sibling) { + if (t.isMarkoPlaceholder(sibling.node)) { + path.state.precedingText = false; + return true; + } + if (t.isMarkoText(sibling.node)) return true; + } path.state.precedingText = false; return false; } diff --git a/packages/translator/src/util/walks.ts b/packages/translator/src/util/walks.ts index 1b1818a6e..6fb09cabc 100644 --- a/packages/translator/src/util/walks.ts +++ b/packages/translator/src/util/walks.ts @@ -135,6 +135,5 @@ export function encodeWalks(walks: Walks[]): string { } } results += resolveSequence(current[0].sequence); - console.log(results, next(1) + after + out(1)); return results; } diff --git a/packages/translator/test/fixtures/attr-boolean/config.ts b/packages/translator/test/fixtures/attr-boolean/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/attr-boolean/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/attr-boolean/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/attr-boolean/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..b7f3b25da --- /dev/null +++ b/packages/translator/test/fixtures/attr-boolean/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = ""; +export const walks = "]"; +export const hydrate = _register("packages/translator/test/fixtures/attr-boolean/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/attr-boolean/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/attr-boolean/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..32b8557f3 --- /dev/null +++ b/packages/translator/test/fixtures/attr-boolean/snapshots/dom-rendered.expected.md @@ -0,0 +1,11 @@ +# Render undefined +```html + +``` + +# Mutations +``` +inserted input0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/attr-escape/config.ts b/packages/translator/test/fixtures/attr-escape/config.ts index 1c5770891..4fcc3c859 100644 --- a/packages/translator/test/fixtures/attr-escape/config.ts +++ b/packages/translator/test/fixtures/attr-escape/config.ts @@ -1 +1,4 @@ +export const inputDOM = [{ className: "class", foo: "foo" }]; +export const inputHTML = { className: "class", foo: "foo" }; + export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/attr-escape/snapshots/html-rendered-expected.html b/packages/translator/test/fixtures/attr-escape/snapshots/html-rendered-expected.html index a9724f915..46853abf7 100644 --- a/packages/translator/test/fixtures/attr-escape/snapshots/html-rendered-expected.html +++ b/packages/translator/test/fixtures/attr-escape/snapshots/html-rendered-expected.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/packages/translator/test/fixtures/attr-falsey/config.ts b/packages/translator/test/fixtures/attr-falsey/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/attr-falsey/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/attr-falsey/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/attr-falsey/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..6e6efea8d --- /dev/null +++ b/packages/translator/test/fixtures/attr-falsey/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "
"; +export const walks = "]"; +export const hydrate = _register("packages/translator/test/fixtures/attr-falsey/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/attr-falsey/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/attr-falsey/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..84a7114b9 --- /dev/null +++ b/packages/translator/test/fixtures/attr-falsey/snapshots/dom-rendered.expected.md @@ -0,0 +1,12 @@ +# Render undefined +```html +
+``` + +# Mutations +``` +inserted div0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/comments/config.ts b/packages/translator/test/fixtures/comments/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/comments/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/comments/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/comments/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..d5eee90d0 --- /dev/null +++ b/packages/translator/test/fixtures/comments/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "
"; +export const walks = ":"; +export const hydrate = _register("packages/translator/test/fixtures/comments/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/comments/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/comments/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..cfb902a7d --- /dev/null +++ b/packages/translator/test/fixtures/comments/snapshots/dom-rendered.expected.md @@ -0,0 +1,12 @@ +# Render undefined +```html +
+ + +
+``` + +# Mutations +``` +inserted div0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/entities/config.ts b/packages/translator/test/fixtures/entities/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/entities/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/entities/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/entities/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..30c42984d --- /dev/null +++ b/packages/translator/test/fixtures/entities/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "Hello John & Suzy Invalid Entity: &b ; Valid Numeric Entity: " Valid Hexadecimal Entity: ¢"; +export const walks = "]"; +export const hydrate = _register("packages/translator/test/fixtures/entities/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/entities/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/entities/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..c33c6f638 --- /dev/null +++ b/packages/translator/test/fixtures/entities/snapshots/dom-rendered.expected.md @@ -0,0 +1,9 @@ +# Render undefined +```html +Hello John & Suzy Invalid Entity: &b ; Valid Numeric Entity: " Valid Hexadecimal Entity: ยข +``` + +# Mutations +``` +inserted #text0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/hello-dynamic/config.ts b/packages/translator/test/fixtures/hello-dynamic/config.ts index 1c5770891..c8de49087 100644 --- a/packages/translator/test/fixtures/hello-dynamic/config.ts +++ b/packages/translator/test/fixtures/hello-dynamic/config.ts @@ -1 +1,2 @@ -export const skip = ["dom-compiled", "dom-rendered"]; +export const inputDOM = [{ name: "Marko" }]; +export const inputHTML = { name: "Marko" }; diff --git a/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..2e3832352 --- /dev/null +++ b/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-compiled-expected.js @@ -0,0 +1,11 @@ +import { text as _text, html as _html, register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "Hello ! Hello ! Hello !"; +export const walks = "]&^&^&^"; +export const hydrate = _register("packages/translator/test/fixtures/hello-dynamic/template.marko", input => { + _text(input.name); + + _html(input.name); + + _html(input.missing); +}); +export default _createRenderFn(template, walks, ["name", "missing"], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..8e98b9fb4 --- /dev/null +++ b/packages/translator/test/fixtures/hello-dynamic/snapshots/dom-rendered.expected.md @@ -0,0 +1,9 @@ +# Render {"name":"Marko"} +```html +Hello Marko! Hello Marko! Hello undefined! +``` + +# Mutations +``` +inserted #text0, #text1, #text2, #text3, #text4, #text5, #text6 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/hello-dynamic/snapshots/html-rendered-expected.html b/packages/translator/test/fixtures/hello-dynamic/snapshots/html-rendered-expected.html index 642a5f92d..9749eb623 100644 --- a/packages/translator/test/fixtures/hello-dynamic/snapshots/html-rendered-expected.html +++ b/packages/translator/test/fixtures/hello-dynamic/snapshots/html-rendered-expected.html @@ -1 +1 @@ -Hello ! Hello ! Hello ! \ No newline at end of file +Hello Marko! Hello Marko! Hello ! \ No newline at end of file diff --git a/packages/translator/test/fixtures/html-entity/config.ts b/packages/translator/test/fixtures/html-entity/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/html-entity/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/html-entity/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/html-entity/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..b326e6ce4 --- /dev/null +++ b/packages/translator/test/fixtures/html-entity/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "
<div>
"; +export const walks = ":"; +export const hydrate = _register("packages/translator/test/fixtures/html-entity/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/html-entity/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/html-entity/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..6c3795895 --- /dev/null +++ b/packages/translator/test/fixtures/html-entity/snapshots/dom-rendered.expected.md @@ -0,0 +1,11 @@ +# Render undefined +```html +
+ <div> +
+``` + +# Mutations +``` +inserted div0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/placeholders/config.ts b/packages/translator/test/fixtures/placeholders/config.ts index 1c5770891..45f666269 100644 --- a/packages/translator/test/fixtures/placeholders/config.ts +++ b/packages/translator/test/fixtures/placeholders/config.ts @@ -1 +1,2 @@ -export const skip = ["dom-compiled", "dom-rendered"]; +export const inputHTML = { x: "replaced" }; +export const inputDOM = [{ x: "replaced" }]; diff --git a/packages/translator/test/fixtures/placeholders/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/placeholders/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..db5edb119 --- /dev/null +++ b/packages/translator/test/fixtures/placeholders/snapshots/dom-compiled-expected.js @@ -0,0 +1,17 @@ +import { text as _text, html as _html, register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "
"; +export const walks = "]#####^&("; +export const hydrate = _register("packages/translator/test/fixtures/placeholders/template.marko", input => { + _text(input.x); + + _text("Hello world "); + + _html(input.x); + + _html(null); + + _html("Hello world "); + + _text("Hello "); +}); +export default _createRenderFn(template, walks, ["x"], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/placeholders/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/placeholders/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..a16be1253 --- /dev/null +++ b/packages/translator/test/fixtures/placeholders/snapshots/dom-rendered.expected.md @@ -0,0 +1,15 @@ +# Render {"x":"replaced"} +```html + +``` + +# Mutations +``` +inserted div0 +``` \ No newline at end of file diff --git a/packages/translator/test/fixtures/placeholders/snapshots/html-rendered-expected.html b/packages/translator/test/fixtures/placeholders/snapshots/html-rendered-expected.html index bcab0c203..2a1d2b320 100644 --- a/packages/translator/test/fixtures/placeholders/snapshots/html-rendered-expected.html +++ b/packages/translator/test/fixtures/placeholders/snapshots/html-rendered-expected.html @@ -1,3 +1,3 @@ - \ No newline at end of file +
\ No newline at end of file diff --git a/packages/translator/test/fixtures/style-tag/config.ts b/packages/translator/test/fixtures/style-tag/config.ts deleted file mode 100644 index 1c5770891..000000000 --- a/packages/translator/test/fixtures/style-tag/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const skip = ["dom-compiled", "dom-rendered"]; diff --git a/packages/translator/test/fixtures/style-tag/snapshots/dom-compiled-expected.js b/packages/translator/test/fixtures/style-tag/snapshots/dom-compiled-expected.js new file mode 100644 index 000000000..36ee1d628 --- /dev/null +++ b/packages/translator/test/fixtures/style-tag/snapshots/dom-compiled-expected.js @@ -0,0 +1,5 @@ +import { register as _register, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom"; +export const template = "
Hello
"; +export const walks = ":"; +export const hydrate = _register("packages/translator/test/fixtures/style-tag/template.marko", input => {}); +export default _createRenderFn(template, walks, [], hydrate); \ No newline at end of file diff --git a/packages/translator/test/fixtures/style-tag/snapshots/dom-rendered.expected.md b/packages/translator/test/fixtures/style-tag/snapshots/dom-rendered.expected.md new file mode 100644 index 000000000..22e0743c5 --- /dev/null +++ b/packages/translator/test/fixtures/style-tag/snapshots/dom-rendered.expected.md @@ -0,0 +1,13 @@ +# Render undefined +```html +
+ Hello +
+``` + +# Mutations +``` +inserted div0 +``` \ No newline at end of file