Repository: marko-js/marko Branch: main Commit: f284f5886997 Files: 11461 Total size: 8.1 MB Directory structure: gitextract_k0_h5jq0/ ├── .browserslistrc ├── .c8rc.json ├── .changeset/ │ ├── README.md │ └── config.json ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE/ │ │ ├── Bug_report.md │ │ ├── Feature_request.md │ │ └── Support_question.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .husky/ │ ├── .gitignore │ └── pre-commit ├── .lintstagedrc.json ├── .mocharc.json ├── .prettierignore ├── .prettierrc.json ├── .sizes/ │ ├── comments.csr/ │ │ └── entry.js │ ├── comments.ssr/ │ │ └── entry.js │ ├── counter.csr/ │ │ └── entry.js │ ├── counter.ssr/ │ │ └── entry.js │ ├── dom.js │ └── name-cache.json ├── .sizes.json ├── LICENSE ├── SECURITY.md ├── babel.config.js ├── cspell.json ├── eslint.config.mjs ├── package.json ├── packages/ │ ├── compiler/ │ │ ├── CHANGELOG.md │ │ ├── babel-types.d.ts │ │ ├── babel-utils.d.ts │ │ ├── babel-utils.js │ │ ├── config.d.ts │ │ ├── config.js │ │ ├── index.d.ts │ │ ├── internal/ │ │ │ └── babel/ │ │ │ ├── index.ts │ │ │ ├── modules.d.ts │ │ │ └── package.json │ │ ├── modules.d.ts │ │ ├── modules.js │ │ ├── package.json │ │ ├── register.d.ts │ │ ├── register.js │ │ ├── scripts/ │ │ │ ├── bundle-babel.mts │ │ │ ├── types/ │ │ │ │ ├── babel-traverse.js │ │ │ │ └── babel-types.js │ │ │ └── types.js │ │ └── src/ │ │ ├── babel-plugin/ │ │ │ ├── file.js │ │ │ ├── index.js │ │ │ ├── parser.js │ │ │ ├── plugins/ │ │ │ │ ├── migrate.js │ │ │ │ └── transform.js │ │ │ └── util/ │ │ │ └── plugin-hooks.js │ │ ├── babel-utils/ │ │ │ ├── assert.js │ │ │ ├── compute.js │ │ │ ├── diagnostics.js │ │ │ ├── get-file.js │ │ │ ├── imports.js │ │ │ ├── index.js │ │ │ ├── loc.js │ │ │ ├── parse.js │ │ │ ├── taglib.js │ │ │ ├── tags.js │ │ │ └── template-string.js │ │ ├── config.js │ │ ├── index.js │ │ ├── register.js │ │ ├── taglib/ │ │ │ ├── config.js │ │ │ ├── finder/ │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── loader/ │ │ │ │ ├── Attribute.js │ │ │ │ ├── DependencyChain.js │ │ │ │ ├── Property.js │ │ │ │ ├── Tag.js │ │ │ │ ├── Taglib.js │ │ │ │ ├── Transformer.js │ │ │ │ ├── cache.js │ │ │ │ ├── index.js │ │ │ │ ├── json-file-reader.js │ │ │ │ ├── loadAttributeFromProps.js │ │ │ │ ├── loadAttributes.js │ │ │ │ ├── loadTagFromFile.js │ │ │ │ ├── loadTagFromProps.js │ │ │ │ ├── loadTaglibFromDir.js │ │ │ │ ├── loadTaglibFromFile.js │ │ │ │ ├── loadTaglibFromProps.js │ │ │ │ ├── loaders.js │ │ │ │ ├── property-handlers.js │ │ │ │ ├── scanTagsDir.js │ │ │ │ └── types.js │ │ │ ├── lookup/ │ │ │ │ └── index.js │ │ │ ├── marko-html.json │ │ │ ├── marko-math.json │ │ │ └── marko-svg.json │ │ └── util/ │ │ ├── build-code-frame.js │ │ ├── merge-errors.js │ │ ├── quick-hash.js │ │ ├── should-optimize.js │ │ ├── strip-ansi.js │ │ └── try-load-translator.js │ ├── runtime-class/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── bin/ │ │ │ ├── markoc │ │ │ └── markoc.js │ │ ├── browser-refresh.js │ │ ├── compiler-browser.marko │ │ ├── compiler.js │ │ ├── components-browser.marko │ │ ├── components.js │ │ ├── docs/ │ │ │ ├── 10-awesome-marko-features.md │ │ │ ├── body-content.md │ │ │ ├── class-components.md │ │ │ ├── cloudflare-workers.md │ │ │ ├── compiler.md │ │ │ ├── component-diagram.afdesign │ │ │ ├── concise.md │ │ │ ├── conditionals-and-lists.md │ │ │ ├── core-tags.md │ │ │ ├── custom-tags.md │ │ │ ├── editor-plugins.md │ │ │ ├── events.md │ │ │ ├── express.md │ │ │ ├── fastify.md │ │ │ ├── getting-started.md │ │ │ ├── http.md │ │ │ ├── installing.md │ │ │ ├── koa.md │ │ │ ├── lasso.md │ │ │ ├── marko-5-upgrade.md │ │ │ ├── marko-json.md │ │ │ ├── marko-vs-react.md │ │ │ ├── redux.md │ │ │ ├── rendering.md │ │ │ ├── rollup.md │ │ │ ├── state.md │ │ │ ├── structure.json │ │ │ ├── styles.md │ │ │ ├── syntax.md │ │ │ ├── troubleshooting-streaming.md │ │ │ ├── typescript.md │ │ │ ├── vite.md │ │ │ ├── webpack.md │ │ │ └── why-is-marko-fast.md │ │ ├── env.js │ │ ├── helpers/ │ │ │ ├── README.md │ │ │ ├── empty.js │ │ │ └── notEmpty.js │ │ ├── index-browser.marko │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── legacy-components-browser.marko │ │ ├── legacy-components.js │ │ ├── node-require.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── build.json │ │ │ ├── compiler/ │ │ │ │ ├── config.js │ │ │ │ ├── index.js │ │ │ │ └── modules.js │ │ │ ├── core-tags/ │ │ │ │ ├── .eslintrc │ │ │ │ ├── components/ │ │ │ │ │ ├── init-components-tag.js │ │ │ │ │ ├── preferred-script-location-tag.js │ │ │ │ │ └── preserve-tag.js │ │ │ │ └── core/ │ │ │ │ ├── __flush_here_and_after__.js │ │ │ │ ├── await/ │ │ │ │ │ ├── AsyncValue.js │ │ │ │ │ ├── client-reorder-runtime.js │ │ │ │ │ ├── index.d.marko │ │ │ │ │ ├── renderer.js │ │ │ │ │ └── reorderer-renderer.js │ │ │ │ └── script.d.marko │ │ │ ├── index.js │ │ │ ├── node-require/ │ │ │ │ ├── browser-refresh.js │ │ │ │ ├── hot-reload.js │ │ │ │ └── index.js │ │ │ ├── node_modules/ │ │ │ │ └── @internal/ │ │ │ │ ├── components-beginComponent/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-define-widget-legacy/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-endComponent/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-entry/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-entry-legacy/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-registry/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components-util/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── create-readable/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── loader/ │ │ │ │ │ ├── fallback-node.js │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── preserve-tag/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── require/ │ │ │ │ │ ├── index-browser.js │ │ │ │ │ ├── index-legacy-browser.js │ │ │ │ │ ├── index-webpack.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ └── set-immediate/ │ │ │ │ ├── index-browser.js │ │ │ │ ├── index-worker.js │ │ │ │ ├── index.js │ │ │ │ ├── package.json │ │ │ │ └── queueMicrotask.js │ │ │ ├── runtime/ │ │ │ │ ├── .eslintrc │ │ │ │ ├── RenderResult.js │ │ │ │ ├── components/ │ │ │ │ │ ├── Component.js │ │ │ │ │ ├── ComponentDef.js │ │ │ │ │ ├── ComponentsContext.js │ │ │ │ │ ├── GlobalComponentsContext.js │ │ │ │ │ ├── KeySequence.js │ │ │ │ │ ├── ServerComponent.js │ │ │ │ │ ├── State.js │ │ │ │ │ ├── attach-detach.js │ │ │ │ │ ├── defineComponent.js │ │ │ │ │ ├── dom-data.js │ │ │ │ │ ├── event-delegation.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── legacy/ │ │ │ │ │ │ ├── browser.json │ │ │ │ │ │ ├── defineComponent-legacy.js │ │ │ │ │ │ ├── defineRenderer-legacy.js │ │ │ │ │ │ ├── defineWidget-legacy.js │ │ │ │ │ │ ├── dependencies/ │ │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── vdom.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── jquery.js │ │ │ │ │ │ ├── ready.js │ │ │ │ │ │ └── renderer-legacy.js │ │ │ │ │ ├── registry.js │ │ │ │ │ ├── renderer.js │ │ │ │ │ └── update-manager.js │ │ │ │ ├── createOut.js │ │ │ │ ├── dom-insert.js │ │ │ │ ├── events.js │ │ │ │ ├── helpers/ │ │ │ │ │ ├── _change-case.js │ │ │ │ │ ├── assign.js │ │ │ │ │ ├── attr-tag.js │ │ │ │ │ ├── class-value.js │ │ │ │ │ ├── dynamic-tag.js │ │ │ │ │ ├── empty-component.js │ │ │ │ │ ├── merge.js │ │ │ │ │ ├── of-fallback.js │ │ │ │ │ ├── render-tag.js │ │ │ │ │ ├── serialize-noop.js │ │ │ │ │ ├── skip-serialize.js │ │ │ │ │ ├── style-value.js │ │ │ │ │ ├── tags-compat/ │ │ │ │ │ │ ├── dom-debug.js │ │ │ │ │ │ ├── dom-debug.mjs │ │ │ │ │ │ ├── dom.js │ │ │ │ │ │ ├── dom.mjs │ │ │ │ │ │ ├── html-debug.js │ │ │ │ │ │ ├── html-debug.mjs │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ ├── html.mjs │ │ │ │ │ │ ├── runtime-dom.js │ │ │ │ │ │ └── runtime-html.js │ │ │ │ │ └── to-string.js │ │ │ │ ├── html/ │ │ │ │ │ ├── AsyncStream.js │ │ │ │ │ ├── BufferedWriter.js │ │ │ │ │ ├── StringWriter.js │ │ │ │ │ ├── get-render-id.js │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── _dynamic-attr.js │ │ │ │ │ │ ├── attr.js │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ ├── class-attr.js │ │ │ │ │ │ ├── data-marko.js │ │ │ │ │ │ ├── escape-script-placeholder.js │ │ │ │ │ │ ├── escape-style-placeholder.js │ │ │ │ │ │ ├── escape-xml.js │ │ │ │ │ │ ├── merge-attrs.js │ │ │ │ │ │ ├── props-script.js │ │ │ │ │ │ └── style-attr.js │ │ │ │ │ ├── hot-reload.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── marko-namespace.js │ │ │ │ ├── renderable.js │ │ │ │ └── vdom/ │ │ │ │ ├── AsyncVDOMBuilder.js │ │ │ │ ├── VComment.js │ │ │ │ ├── VComponent.js │ │ │ │ ├── VDocumentFragment.js │ │ │ │ ├── VElement.js │ │ │ │ ├── VFragment.js │ │ │ │ ├── VNode.js │ │ │ │ ├── VText.js │ │ │ │ ├── helpers/ │ │ │ │ │ ├── attrs.js │ │ │ │ │ ├── const-element.js │ │ │ │ │ └── merge-attrs.js │ │ │ │ ├── hot-reload.js │ │ │ │ ├── index.js │ │ │ │ ├── is-text-only.js │ │ │ │ ├── marko-namespace.js │ │ │ │ ├── morphdom/ │ │ │ │ │ ├── fragment.js │ │ │ │ │ ├── helpers.js │ │ │ │ │ └── index.js │ │ │ │ ├── parse-html.js │ │ │ │ └── vdom.js │ │ │ ├── taglib/ │ │ │ │ └── index.js │ │ │ ├── translator/ │ │ │ │ ├── cdata/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ ├── class.js │ │ │ │ ├── comment/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ ├── declaration/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ ├── document-type/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ ├── index.js │ │ │ │ ├── placeholder/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ ├── scriptlet.js │ │ │ │ ├── tag/ │ │ │ │ │ ├── attribute/ │ │ │ │ │ │ ├── directives/ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── no-update-body-if.js │ │ │ │ │ │ │ ├── no-update-body.js │ │ │ │ │ │ │ ├── no-update-if.js │ │ │ │ │ │ │ ├── no-update.js │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── modifiers/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── no-update.js │ │ │ │ │ │ └── scoped.js │ │ │ │ │ ├── attribute-tag.js │ │ │ │ │ ├── custom-tag.js │ │ │ │ │ ├── dynamic-tag.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── macro-tag.js │ │ │ │ │ ├── native-tag.js │ │ │ │ │ ├── native-tag[html]/ │ │ │ │ │ │ ├── attributes.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── native-tag[vdom]/ │ │ │ │ │ │ ├── attributes.js │ │ │ │ │ │ └── index.js │ │ │ │ │ └── util.js │ │ │ │ ├── taglib/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── conditional/ │ │ │ │ │ │ │ ├── translate-else-if.js │ │ │ │ │ │ │ ├── translate-else.js │ │ │ │ │ │ │ ├── translate-if.js │ │ │ │ │ │ │ └── util.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── macro/ │ │ │ │ │ │ │ ├── parse.js │ │ │ │ │ │ │ └── translate.js │ │ │ │ │ │ ├── migrate.js │ │ │ │ │ │ ├── parse-class.js │ │ │ │ │ │ ├── parse-client.js │ │ │ │ │ │ ├── parse-export.js │ │ │ │ │ │ ├── parse-import.js │ │ │ │ │ │ ├── parse-module-code.js │ │ │ │ │ │ ├── parse-server.js │ │ │ │ │ │ ├── parse-static.js │ │ │ │ │ │ ├── transform-body.js │ │ │ │ │ │ ├── transform-style.js │ │ │ │ │ │ ├── translate-await.js │ │ │ │ │ │ ├── translate-for.js │ │ │ │ │ │ ├── translate-html-comment.js │ │ │ │ │ │ ├── translate-include-content.js │ │ │ │ │ │ ├── translate-server-only.js │ │ │ │ │ │ └── translate-while.js │ │ │ │ │ └── index.js │ │ │ │ ├── text/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index[html].js │ │ │ │ │ └── index[vdom].js │ │ │ │ └── util/ │ │ │ │ ├── add-dependencies.js │ │ │ │ ├── escape-regexp.js │ │ │ │ ├── get-component-files.js │ │ │ │ ├── html-out-write.js │ │ │ │ ├── key-manager.js │ │ │ │ ├── optimize-html-writes.js │ │ │ │ ├── optimize-vdom-create.js │ │ │ │ ├── plugin-hooks.js │ │ │ │ ├── runtime-flags.js │ │ │ │ ├── vdom-out-write.js │ │ │ │ └── with-previous-location.js │ │ │ └── translator.js │ │ ├── tags-html.d.ts │ │ ├── test/ │ │ │ ├── .gitignore │ │ │ ├── __util__/ │ │ │ │ ├── BrowserHelpers.js │ │ │ │ ├── async-helpers.js │ │ │ │ ├── async-test-suite.js │ │ │ │ ├── components-from-meta.js │ │ │ │ ├── create-marko-jsdom-module.js │ │ │ │ ├── domToHTML.js │ │ │ │ ├── domToString.js │ │ │ │ ├── package.json │ │ │ │ ├── patch-module.js │ │ │ │ ├── pubsub.js │ │ │ │ ├── test-init-browser.js │ │ │ │ ├── test-init.js │ │ │ │ └── toHTML.js │ │ │ ├── api/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── error-renderSync/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── error-renderSync-beginAsync/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── load-render-callback/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── load-render-promise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── load-source/ │ │ │ │ │ │ ├── custom-options-expected.html │ │ │ │ │ │ ├── empty-options-expected.html │ │ │ │ │ │ ├── invalid-template.marko │ │ │ │ │ │ ├── no-options-expected.html │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── no-write-to-disk-load/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── no-write-to-disk-require/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-await-client-reorder-unhandled-rejected-promise/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-await-promise-toString/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-callback-args/ │ │ │ │ │ │ ├── expected.2.html │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-callback-global-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-readable-stream-global-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-to-out-error/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── render-writable-stream-global-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderSync/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderSync-global-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderSync-no-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderToString/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderToString-callback-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-async/ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderToString-callback-sync/ │ │ │ │ │ │ ├── expected.2.html │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── renderToString-no-callback-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-async/ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-compiled-template/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-hook-compiler-options/ │ │ │ │ │ │ ├── invalid.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-render-callback/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ └── require-render-to-stream/ │ │ │ │ │ ├── expected.html │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── api-compiler/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── compileFileForBrowser-callback.js/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compileFileForBrowser.js/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compileForBrowser-callback.js/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compileForBrowser-write-version-comment.js/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compileForBrowser.js/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── configure/ │ │ │ │ │ │ └── test.js │ │ │ │ │ └── configure-singleton/ │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── async-stream/ │ │ │ │ ├── fixtures/ │ │ │ │ │ └── hello.txt │ │ │ │ └── index.test.js │ │ │ ├── async-vdom-builder/ │ │ │ │ └── index.test.js │ │ │ ├── components-browser/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── adjacent-nested-fragments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── text-display/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── append-prepend/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-api/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-api-move-root/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-conditional-events/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-button.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-destroy-ref/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-legacy-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-destroy-unsubscribe-custom-events/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-custom-events/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-destroy-unsubscribe-dom-events/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-dom-event-listeners-repeated-non-bubbling/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-dom-events/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-legacy-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-dynamic-tag-name/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-event-handler-method-conditional-bubbles/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-event-handler-method-conditional-direct/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-event-handler-method-dynamic/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-extends-EventEmitter/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-file-exports-class/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-getComponent/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-getComponents-multiple/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-getComponents-single/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-getEl/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-getEls/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-include-ref/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-bar/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-include-ref-dynamic/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-bar/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-no-update-attrs/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-no-update-attrs-dynamic/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-all-state-when-rendered-in-loop/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-all-state-when-rerendered/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-all-state-when-rerendered-setTimeout/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-dom-attrs/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-dom-attrs-dynamic/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-dom-if/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-stateful-rerender/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-dom-repeated/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-dom-root/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-preserve-multiple-split/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-split/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-render-to-iframe/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-iframe-content/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-iframe-more-content/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-renderToString/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-renderToString-callback-sync/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── test-async/ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-renderToString-text-node/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── my-text-node.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-replaceState/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-rerender-init-order/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-rerender-init-order-child/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-rerender-reuse-stateful/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-rerender-stateless-new-props/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-setStateDirty/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-copy-state-on-write/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-no-copy-state-on-write-if-same-value/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-no-rerender-if-destroyed/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-preserve-body/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-stateful-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-update/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-update-handler/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-stateful-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-update-handler-no-match/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-stateful-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stateful-update-on-mount/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-stopPropagation/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-subscribeTo-destroy-subscriber/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-subscribeTo-destroy-target/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-toggle-spread-attributes/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-transclusion/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-transclusion-alert/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-unescaped-html/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-unique-id/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-update-batch-not-empty/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-var/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-custom-events/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-declarative/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-custom-events/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-declarative-function/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ └── app-custom-events/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-declarative-multiple/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-bar/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-declarative-multiple-once/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-bar/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-declaritive-once/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-bar/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-repeated-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── item/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── lookup.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-events-repeated-component-once/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── item/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── lookup.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── destroy-cleanup/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── destroy-component/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-simple/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── destroy-detach/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── destroy-legacy/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-custom-events/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── destroy-multiple-root-els/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-boundary-inner-component-only/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── inner/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-component-mismatch/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-component-mismatch-append/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-component-toplevel-surrounded/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-destroy-child/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-dynamic-attributes/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-dynamic-nested-roots/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── message/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── welcome/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-existing-key-component-to-element/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-existing-key-component-to-fragment/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-insert-el-before-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-insert-unkeyed-el-before-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-insert-unkeyed-el-before-preserved-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-mismatch-remove-fragment/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-rearrange-keyed-components/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-rearrange-keyed-els/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-remove-all-els/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-remove-end-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-remove-start-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-simple/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-swap-components-dynamic/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── world/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-swap-components-keyed/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── world/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-swap-components-keyed-dynamic/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── world/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-swap-keyed-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── diffpatch-swap-unkeyed-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-custom-event/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-event-handlers-alternate/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-events-repeated-el-bubbling/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-events-repeated-el-bubbling-one-arg/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-events-repeated-el-bubbling-two-args/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-events-repeated-el-non-bubbling/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dom-events-repeated-el-non-bubbling-multiple/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-custom-event-handler/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-default-namespace/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-html-event-handler/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-no-update-html-attributes/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-preserve-old/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-root/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── modal.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-shorthand/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-switch-components/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── goodbye.marko │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-user-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── emit-event-during-mount/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-attach-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-attach-el-function/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-attach-el-once/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-attach-if-else-nested-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── color-include/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-component-destroy/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-el-once/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-el-preventDefault/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-remove-nested-component-last/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── color-li/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-detach-remove-nested-component-middle/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── color-li/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-bubbling-once/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-bubbling-once-split/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-custom-args/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-fancy-button/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-bubbling/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-bubbling-function/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-bubbling-multiple-top-level-elements/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-bubbling-once/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-non-bubbling/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-dom-args-non-bubbling-once/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-function/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-non-bubbling-multiple-listeners/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-non-bubbling-once/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-non-bubbling-rerender-el-mismatch/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── event-handler-non-bubbling-root-el/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── extend-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-button/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ │ └── app-checkbox/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── for-first-el-key-cache-value/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── forceUpdate/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── form-controls-default-value/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── get-component-for-el-nested-fragments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── get-component-for-el-split-component/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── get-el-nested-fragments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── nested-child/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── global-rerender/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── global-rerender-nested/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── implicit-component/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── implicit-component-keys/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── include-event-handler/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── include-preserve-old/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── include-root/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── modal.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-checkbox/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-global/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-no-change/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-no-change-nested/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-no-value/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-persisted/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-persisted-nested-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── input-value-zero/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── insert-before-after/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── key-transcluded-content/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── some-nested-component/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── keyed-matching-transcluded/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── card/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── label-for/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── label-for-scoped-repeated/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-constructor/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-destroy/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── hooks.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-nested-no-id/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── hooks.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-nested-with-id/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── hooks.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-parent-child-ordering/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── hooks.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-render-arg/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── lifecyle-hooks-root/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── morphdom-node-added-nested-keyed/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── multiple-roots-rerender-root-child/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── nested-fragment-namespace/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── nested-fragments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container.marko │ │ │ │ │ │ │ └── fragment.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── onCreate/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── onInput/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── onInput-instance-data/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── onInput-return/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── prefer-closest-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ │ └── test.marko │ │ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ │ │ └── test.marko │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── test.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-component-transcluded-autokey/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container.marko │ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-component-transcluded-userkey/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container.marko │ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-body/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-body-no-id/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-body-shared-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child-preserved.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-conditional-before/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-loop/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-no-id/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-server-mismatch/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-transcluded-autokey/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── container.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-dom-transcluded-userkey/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── container.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-nested/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── preserve-nodes-update-scoped-elements/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── prevent-input-mutation-repeated-at-tags/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── menu/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── redefine-component-var/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── ref-nested-component-multiple-root-els/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── multiple-root-els/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── ref-nested-component-multiple-root-els-with-refs/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── multiple-root-els/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── remove-last-multi-root-component/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── replace/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── replace-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── replaceChildrenOf/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── rerender-destroy-incompatible/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── rerender-multiple-roots/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── rerender-same-root/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── rerender-style-root/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-custom-event/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-implicit-bind-component/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-inline/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-multiple-root-els/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-single-file-component/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-template-entry/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── sanity-check-template-entry-split/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── scoped-link/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── server-client-mismatch/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── set-null-state/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── simple-attrs-optimize-toggle/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── split-browser/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── split-browser-export-class/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── split-browser-inline/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-freeze/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-null-undefined/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-var/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-watch-null/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-watch-null-async/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── state-watch-undefined/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── style-attr/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── tag-empty/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── tag-params/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── name/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── tag-params-nested-tags/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── name/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── textarea/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── textarea-value-attribute/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── top-level-transcluded-content/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── inner.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transcluded-component-from-non-rerender-root/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-button/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-body-slot-attr/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-body-slot-default-to-renderBody/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-body-slot-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-include-not-in-state/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-include-split/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-non-bubbling-event/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── container/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-repeated-nested/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── counter/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-rerender-stateful/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── transclusion-rerender-stateful-shared-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── update-next-tick/ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ └── update-queued/ │ │ │ │ │ ├── component.js │ │ │ │ │ ├── index.marko │ │ │ │ │ └── test.js │ │ │ │ ├── index.test.js │ │ │ │ ├── template.component-browser.js │ │ │ │ └── template.marko │ │ │ ├── components-pages/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── async-boundaries/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-hello/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── app-hello-async/ │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ └── app-init-async/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── await-surround-html/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-$globals/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-config/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-fixed-id/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-fixed-id/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-globals/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-globals-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-implicit-event-handlers/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-button-component/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-button-split/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.component-browser.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-init-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-input/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-input-ref/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-mount-root-hasRenderBody/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-mount-root-renderBody/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── component-state/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-foo/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-state-watch/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── custom-events/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-fancy-button/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-body/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-body-root/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-head/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-head-root/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-html/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-html-include-layout/ │ │ │ │ │ │ ├── layout.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── diff-title/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── dom-events/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── dom-events-bubbling/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── no-args/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── one-arg/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── one-arg-array/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── two-args/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── empty-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── b/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── empty-tag-with-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── dynamic-tag-key/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── split-tag-key/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── getEl-no-rerender/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── getEl-split/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── split-component/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── getRenderedComponents/ │ │ │ │ │ │ ├── browser.json │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-simple/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── components.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── if-empty-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── a/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── implicit-component-macro-params/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello-implicit-component/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── implicit-component-root/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello-explicit-component/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ └── implicit-nested/ │ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── hello-implicit-component/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── implicit-component-root-tag-params/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello-implicit-component/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── name/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── include-input-preserve-focus/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── include-preserve/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-before-widgets-loaded/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-before-widgets-loaded-multiple-async/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-immediate/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── app-baz/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-immediate-await-client-reorder/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── app-baz/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-components-tag-none/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── app-baz/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── init-included/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-bar/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── app-baz/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── lifecycle-events/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── lifecycle-events/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── lifecycle-events-component-class/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── lifecycle-events-component-class-ctor/ │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── lifecycle-events-component-object/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── nesting/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── c/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── d/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── no-update/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── no-update-attr/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── no-update-body-el/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── no-update-body-textarea/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── no-update-el/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── no-update-el-nested/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── no-update-input-value/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── no-update-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── no-update-nested-component-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── nested-child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── no-update-with-an-event/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── onInput/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── onInput-assign-null/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── onInput-assign-null-and-return/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── onInput-assign-object/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── onInput-assign-object-and-return/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── onInput-return/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── preserve-looped-attribute-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── preserve-no-update-for-loop/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── preserve-server-rendered-content-on-mount/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── preserve-transcluded-content-on-state-change/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── toggle-button/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── preserve-transcluded-key-on-state-change/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── container/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── remove-last-multi-root-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── root/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── render-and-mount-order/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-hello/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ └── inner/ │ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-wrapper/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── repeated-list-items-unkeyed/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── list-items/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── runtime-id/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── server-browser-unique-ids/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── server-render-dom-event-handlers/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── counter/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── server-render-function-references/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── split-async-keys/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-child/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-hello/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── split-component-dynamic-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-button/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── app-root/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── split-component-renderer/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── app-button-split/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ │ ├── app-button-split-export-class/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ │ └── component-only/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ ├── split-emit-multi-args/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── split-component/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── tests.js │ │ │ │ │ └── xss/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── app-foo/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── marko.json │ │ │ │ │ ├── template.marko │ │ │ │ │ └── tests.js │ │ │ │ └── index.test.js │ │ │ ├── components-server/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── cspNonce/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-simple/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── getRenderedWidgets/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── app-simple/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ └── scriptConcat/ │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── hot-reload/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── load/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ │ ├── modified-expected.html │ │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ │ ├── modified-expected.html │ │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-custom-extension/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ │ ├── modified-expected.html │ │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ │ ├── template.html │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-custom-multiple-extensions/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ │ ├── modified-expected.html │ │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ │ ├── template.html │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── require-custom-without-period/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ │ ├── modified-expected.html │ │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ │ ├── template.html │ │ │ │ │ │ └── test.js │ │ │ │ │ └── template-export-component/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── a/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── b/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── initial-expected.html │ │ │ │ │ ├── reloaded-expected.html │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── marko-debug-babel-plugin/ │ │ │ │ ├── fixtures/ │ │ │ │ │ └── compiles/ │ │ │ │ │ ├── expected.js │ │ │ │ │ ├── input.js │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── markoc/ │ │ │ │ ├── babel-register.js │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── clean-dir/ │ │ │ │ │ │ ├── template1.marko │ │ │ │ │ │ ├── template2.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compile-dir/ │ │ │ │ │ │ ├── template1.marko │ │ │ │ │ │ ├── template2.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── compile-dir-no-template/ │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── multiple-dirs/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── excluded/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── single-template/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── single-template-write-version-comment/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ └── usage/ │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── morphdom/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── add-rearrange/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── add-rearrange-incompatible-keys/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── attr-value-empty-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── button-element-disabled/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── button-element-enabled/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── change-tagname/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── change-tagname-ids/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── data-table/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── data-table2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── equal/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── id-change-tag-name/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-3/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-4/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-5/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-6/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-nested-7/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── ids-prepend/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── incompatible-root-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── incompatible-root-tag-with-keyed-child/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── input-element/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── input-element-disabled/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── input-element-enabled/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── keyed-incompatible/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── large/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── lengthen/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── one/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── reverse/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── reverse-ids/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── select-element/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── select-element-optgroup/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── shorten/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── simple/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── simple-div-one-to-one/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── simple-ids/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── simple-text-el/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── single-el-removal-first-keyed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── single-el-removal-last-keyed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── single-el-removal-middle-keyed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── svg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── svg-append/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── svg-append-new/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── svg-no-default-namespace/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── svg-xlink/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── swap-keyed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── tag-to-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── tag-with-children-to-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── text-to-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── text-to-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── textarea/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── todomvc/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ ├── todomvc2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── from.html │ │ │ │ │ │ └── to.html │ │ │ │ │ └── two/ │ │ │ │ │ ├── expected.html │ │ │ │ │ ├── from.html │ │ │ │ │ └── to.html │ │ │ │ └── index.test.js │ │ │ ├── node-require/ │ │ │ │ └── index.test.js │ │ │ ├── package.json │ │ │ ├── render/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── attr-boolean-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-boolean-placeholder/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-boolean-static/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-empty/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-empty-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-escape-xml/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-newline-escaped/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-number/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-placeholder-escaped-undefined/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-placeholder-unescaped-undefined/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-unquoted/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-value-number/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-value-obj/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-value-obj-custom-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── tag.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attr-value-partial-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attributes-dynamic-custom-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attributes-dynamic-custom-tag-mixed/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attributes-dynamic-xss/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── attrs/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attrs-normalize-for-native-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── attrs-with-render-body/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── autocomplete/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-client-reorder/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-cspnonce/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-invoked-once/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-mixed/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-nested/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-sync/ │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-client-reorder-with-runtimeId/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-error/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-error-empty-catch/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-error-no-catch/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-error-rethrow-catch/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-macros/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-no-update-content/ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-order-random/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-ordering/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-placeholder/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-promise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-render-error/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-render-error-bluebird/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-sync/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── await-timeout/ │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── beginAsync/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── body-placeholder-literal/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── body-placeholder-literal-escaped/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── body-placeholder-literal-unescaped/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── body-placeholder-literal-unescaped-escaped/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── body-placeholder-literal2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── circular-renderer/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ ├── test-circular-renderer-a/ │ │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ └── test-circular-renderer-b/ │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── circular-tags-no-write-to-disk/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── navigation-item/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── circular-template/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ ├── test-circular-template-a/ │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ └── test-circular-template-b/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── class-attr-array/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── class-attr-object/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── class-attr-shorthand-plus-expression/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── class-attr-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── comments-preserve-ie-conditional/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── comments-remove/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── component-aria-key/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-file-export-class/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-inline-style-important/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── component-label-for/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── component-safe-json/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── foo/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ └── bar/ │ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── split/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── split-child/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── components-await/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── components-await-beginAsync/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── beginAsync/ │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── components-await-title/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── layout.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── concise-verbose/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── conditional-attributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-as-template/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-template-as-tag/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-autodiscover/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── pages/ │ │ │ │ │ │ │ └── home/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── test-home/ │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test-home-renderer.js │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-autodiscover-repeated-names/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ └── test-hello.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── pages/ │ │ │ │ │ │ │ └── home/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── test-home/ │ │ │ │ │ │ │ │ └── test-home.marko │ │ │ │ │ │ │ └── home.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test-home-renderer.js │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-components-file/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── bye.marko │ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-data-placeholders/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-hyphen-attrs/ │ │ │ │ │ │ ├── custom-tag.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-open-tag-only/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── open-tag-only-tag.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-target-property/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-target-property/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-template-index/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── custom-tag-with-directives/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── declaration/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── default-attributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-default-attributes/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── div-self-closed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── doctype/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dtd/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-attributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-dynamic-attributes/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-attributes3/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-dynamic-attributes3/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-split-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── dynamic-non-split/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── dynamic-non-split-no-body/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ ├── dynamic-split/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── dynamic-split-no-body/ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── dynamic-tag-arguments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── layout.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-dashed-attributes/ │ │ │ │ │ │ ├── dynamic.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-layout/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── layout.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-lazy-attributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-name/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-name-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-object-class-style/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── dynamic-tag-template/ │ │ │ │ │ │ ├── dynamic-target.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── empty-close-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── entities/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── escape-at-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── escape-script/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── escape-style/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── escaped-dollar/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── flush-here-and-after-async-after/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── flush-here-and-after-async-before/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── flush-here-and-after-async-reverse/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── flush-here-and-after-sync/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── flush-here-and-after-with-body/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── child.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-array-index/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-attr-separator/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-attr-separator-html/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-attr-separator-status-var/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-attr-status-var-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-if-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-iterator/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-iterator-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-native/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-props/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-props-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-props-status-var/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range-descending-step/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range-from-to-expr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range-step-2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range-step-neg2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-range-to-expr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag-array-expression/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag-block-scoped-key/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── for-tag-native/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag-separator/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag-separator-status-var/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── for-tag-status-var/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── global-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── global-runtime-id/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── hello-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── hello-dynamic.marko.expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── hello-static/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── html/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── html-comment-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── html-comment-tag-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── html-entities-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-if/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-if-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-if-else/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── if-else-if-else-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── ignore-unrecognized-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── img/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── import/ │ │ │ │ │ │ ├── bar.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-body-empty/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-component/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── my-component/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-html-target.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-data-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-html/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-html-target.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-hyphen-attrs/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-hyphen-attrs-multiple/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-layout/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── layout-default.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-layout-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── layout-default.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-layout-data-attrs/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── layout-default.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-layout-v3-compat/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── layout-default.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-renderBody/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-renderBody-data-and-attrs/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-renderBody-no-data/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-html-target.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-renderBody-string-arg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-html-target.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-resource-target.txt │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── include-whitespace/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── include-target.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── inline-script/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── invoke/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── label-for/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── macro/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── macro-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── macro-boolean/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── macro-no-args/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-complex-logic/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-complex-logic-repeated/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-hyphens/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-hyphens-repeated/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-simple/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-simple-conditional/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-simple-declared/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-simple-repeated/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-shorthand-simple-repeated-conditional/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-message/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-with-existing-input/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-with-render-body-params/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tag-with-scriptlet/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-overlay/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-deep/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-deep/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-empty-body/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-repeatable/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── fancy-table.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-repeated/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-repeated-parent/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-overlay/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-repeated-with-default-render-body/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-nested-tags-tabs/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── nested-tags-self-closing/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-nested-tags-tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── open-tag-only/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── open-tag-only-renderer/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── paren-grouping/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── pattern-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── pattern-attr-runtime/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── placeholders-body-expressions/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── preserveWhitespace-global/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── preserveWhitespace-load-option/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── regexp-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── renderer-dir-main.js/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── renderer-index.js/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── renderer/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── require/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test-helpers.js │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── reserved-words/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── my-custom-tag.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── scanned-tags/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ ├── scanned-a/ │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ ├── scanned-b/ │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ ├── scanned-c/ │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ ├── scanned-d/ │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ ├── scanned-e/ │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ ├── scanned-f/ │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ │ ├── scanned-g/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── scanned-h/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── script/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── script-escaped-placeholder/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── script-json-stringify/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── script-string-literal-placeholder/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── script-tag-entities/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── self-closing-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-class-merge/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-class-merge2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-class-plus-class-obj/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-classes-many-classes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-div-id/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-div-id-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-div.foo/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-id-and-classes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── shorthand-verbose/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── simple/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── simple-conditionals/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── space-around-equal-sign-for-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── space-in-complex-attr-value/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-class-style-html-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-custom-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-function-object/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-html-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-literal/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-no-mutate/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-order-custom-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-order-html-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── spread-attribute-undefined/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── static-trees/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── static-var-complex/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── string-expressions/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-attr-array-mixed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-attr-object/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-attr-object-units/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-attr-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-attr-string-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── style-tag-dynamic-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── svg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-mixed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-simple-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-simple-mixed/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-simple-verbose/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── syntax-verbose/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tabs/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── tag-empty/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── taglib-imports-nested/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── nested-import/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── list/ │ │ │ │ │ │ │ │ │ ├── icon-list/ │ │ │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── taglib-imports-package-json/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── tags-dir-null/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── template-tag-dynamic-attributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-template-tag-dynamic-attributes/ │ │ │ │ │ │ │ └── template.marko │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── text-replacement/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── toHTML/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── toString-object/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── unary-expression/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── unless-else/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── var/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── var-assign/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── var-new-Date/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── var-tag-commas/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── variable-id-root-node/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── while-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── while-tag/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-contentplaceholder-literal-string/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-div/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-inline-elements/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-marko-preserve-whitespace-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-normalize-inner-whitespace/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-normalize-inner-whitespace-concise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-normalize-inner-whitespace2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-pre/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-pre-code/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-script/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ ├── whitespace-textarea/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ ├── test.js │ │ │ │ │ │ └── vdom-expected.html │ │ │ │ │ └── xml-escaping/ │ │ │ │ │ ├── expected.html │ │ │ │ │ ├── template.marko │ │ │ │ │ ├── test.js │ │ │ │ │ └── vdom-expected.html │ │ │ │ ├── fixtures-async-callback/ │ │ │ │ │ ├── await-arg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-args/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-args-merge/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-cspnonce/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-invoked-once/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-mixed/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-nested/ │ │ │ │ │ │ ├── expected-events-vdom.json │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-client-reorder-sync/ │ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-data-provider-method/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-data-providers/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-error/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-error-message-attr/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-function-data-provider-callback/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-function-data-provider-return-promise/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-function-data-provider-sync/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-out-of-order-with-in-order/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-out-of-order-with-in-order-after/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-placeholder/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── await-placeholder-message-attr/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.js │ │ │ │ │ └── await-timeout/ │ │ │ │ │ ├── expected-events.json │ │ │ │ │ ├── expected.html │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── taglib-finder/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── deeply-nested/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ │ ├── c/ │ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── deeply-nested-gaps/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ │ └── c/ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── deeply-nested-plus-installed/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ │ ├── c/ │ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── excluded-dir/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── b-excluded/ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── excluded-dir-autodiscover/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ └── b/ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── excluded-package/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ │ ├── c/ │ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── exports/ │ │ │ │ │ │ ├── _dist/ │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ └── dist-tag.marko │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── dev-tag.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test.js │ │ │ │ │ └── reset/ │ │ │ │ │ ├── a/ │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ ├── c/ │ │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ └── marko.json │ │ │ │ │ ├── expected.json │ │ │ │ │ ├── package.json │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── taglib-loader/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── custom-extensions/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-declared-attributes/ │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── invalid-marko-tag-file/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── invalid-taglib-tag/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── invalid-tags-dir/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── paths/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello-scanned/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── repeated-nested-tag/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ └── shorthand-attrs-and-tags/ │ │ │ │ │ ├── marko.json │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── taglib-lookup/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── attribute-groups/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── attribute-ref/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── cache-lookup/ │ │ │ │ │ │ ├── baz/ │ │ │ │ │ │ │ ├── baz-tag.js │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ ├── foo/ │ │ │ │ │ │ │ ├── foo-tag.js │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── core-attributes/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── core-tag/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── custom-tag/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── taglib/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── de-dupe/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── foo-renderer.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── taglib-duplicate/ │ │ │ │ │ │ │ ├── bar-renderer.js │ │ │ │ │ │ │ └── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── declared-and-dynamic-attrs/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── renderer.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── forEachAttribute/ │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── forEachAttribute-html-tag/ │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── getTagsSorted/ │ │ │ │ │ │ ├── expected.json │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── global-attrs/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── html-any-attr/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── html-tag/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── nested-tags/ │ │ │ │ │ │ ├── expected.js │ │ │ │ │ │ ├── foo-renderer.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ └── test.js │ │ │ │ │ └── nested-tags-attrs/ │ │ │ │ │ ├── expected.js │ │ │ │ │ ├── foo-renderer.js │ │ │ │ │ ├── marko.json │ │ │ │ │ └── test.js │ │ │ │ └── index.test.js │ │ │ ├── translator/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── at-tag-inside-if-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tag-spread-undefined/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-dynamic/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-dynamic-and-static/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-dynamic-tag-parent/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-dynamic-with-params/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-repeated-longhand/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── at-tags-with-key/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-boolean/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-class/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-escape/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-falsey/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-method-shorthand/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-method-with-return/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── test.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-no-update-scoped/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-scoped/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-style/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── attr-template-literal-escape/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── await-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── camel-case-attr-name-override/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── cdata/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── class-external-component/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── template.component.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── class-external-component-index/ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── test.js │ │ │ │ │ ├── class-inline/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── class-inline-class-props-without-on-create/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── client-import-hydrate-include/ │ │ │ │ │ │ ├── bar.js │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── comments/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-element-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ ├── init.js │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-hello/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-child-analyze/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ │ └── transformer.js │ │ │ │ │ │ │ └── message.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-data/ │ │ │ │ │ │ ├── custom-tag-data-tag.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-migration/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── new.marko │ │ │ │ │ │ ├── old.migrator.js │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-parameters/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-render-body/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── test-body-function/ │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── renderer.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-separate-assets/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── template.browser.json │ │ │ │ │ │ ├── template.component.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── template.style.css │ │ │ │ │ ├── custom-tag-template/ │ │ │ │ │ │ ├── hello.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── custom-tag-transform/ │ │ │ │ │ │ ├── div.transformer.js │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── data-marko-implicit-component/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── data-migration/ │ │ │ │ │ │ ├── foo.marko │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.diagnostics.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── data-reassigned/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── data-structure/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.diagnostics.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── declaration/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── declared-class-member/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── doctype/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── dynamic-tag-name/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── tag-a/ │ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ │ └── tag-b/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── dynamic-tag-string-literal/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── else-tag-with-whitespace-and-comments/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── entities/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-arguments-on-non-event-attribute/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-at-tags-control-flow-mixed/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-at-tags-native-tag-parent/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-at-tags-repeated-not-allowed/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── some-tag/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-at-tags-top-level/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-await-tag-missing-provider/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-await-tag-multiple-arguments/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-bad-expression/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-body-only-if-no-condition/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-constructor/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-file-and-inline/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ ├── template.component.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-not-root/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-private-properties/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-static-properties/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-syntax/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-tag-nested-content/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-with-name/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.diagnostics.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-class-with-super-class/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-custom-tag-arguments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-duplicate-event-handlers/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-dynamic-tag-no-value/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-else-if-tag-missing-if/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-else-tag-missing-if/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-eof/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-event-handler-missing-args/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-event-handler-value/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-export-tag-nested-content/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-export-tag-root-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-for-in-missing-params/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-for-invalid-attribute/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-for-missing-attr/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-for-of-missing-params/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-html-element-arguments/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-id-shorthand-and-attribute/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-if-missing-condition/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-import-tag-component-missing/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-import-tag-nested-content/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-import-tag-root-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-invalid-js/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-macro-invalid-attributes/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-macro-invalid-name-attribute/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-macro-missing-name/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-mismatched-closing-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-missing-attribute-from-tag-def/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-missing-component-missing-file/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-missing-entry-marko-json/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-missing-entry-marko-tag-json/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── some-tag/ │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-missing-required-attr/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-multiple-inline-class/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-multiple-syntax-errors/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-native-tag-params/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-nested-tag-arguments/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-open-tag-only-concise/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-repeated-closing-dynamic-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-scriptlets-not-supported/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-static-tag-nested-content/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-static-tag-root-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-style-block-multiple/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-style-block-root-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-style-file-and-inline/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── template.style.marko │ │ │ │ │ ├── error-unclosed-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-unknown-modifier/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-unknown-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── error-wrong-closing-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-error-expected.txt │ │ │ │ │ │ │ ├── generated-error-expected.txt │ │ │ │ │ │ │ ├── html-error-expected.txt │ │ │ │ │ │ │ ├── htmlProduction-error-expected.txt │ │ │ │ │ │ │ ├── hydrate-error-expected.txt │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-error-expected.txt │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── event-handlers/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── exports/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── for-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── hello-dynamic/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── html-comment/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── html-entity/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── if-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── import-hydrate-include/ │ │ │ │ │ │ ├── bar.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── baz.marko │ │ │ │ │ │ ├── foo.css │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── import-tag/ │ │ │ │ │ │ ├── bar.js │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── baz.marko │ │ │ │ │ │ ├── foo.js │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── import-tag-conflict/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── macro-non-root/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── macros/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── module-code/ │ │ │ │ │ │ ├── env.js │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── native-tag-spread-attrs/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── no-update-directives/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── no-update-modifier/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── no-update-modifier-multiple/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── placeholders/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── prevent-override-component-def/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── root-migration/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── migrator.js │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── root-transform/ │ │ │ │ │ │ ├── marko.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── transformer.js │ │ │ │ │ ├── sanity-check/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── other/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ └── marko-tag.json │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── scriptlet-comments/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── scriptlet-line-block/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── scriptlet-var-collision/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-error-expected.txt │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ ├── vdomProduction-error-expected.txt │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── server-import-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── shorthand-classname/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── shorthand-id/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── simple/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── simple-attrs-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── split-component/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── template.component-browser.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── split-component-with-component/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ ├── template.component-browser.js │ │ │ │ │ │ ├── template.component.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── statement-comment-only/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── static-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── style-block-empty/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── style-block-with-styles/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── svg-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── tag-block-scoping/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── tag-with-default-attr/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── textarea-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── top-level-text/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── typescript-basic/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── typescript-generic-tag/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── type-arg-and-param.marko │ │ │ │ │ │ │ ├── type-arg.marko │ │ │ │ │ │ │ └── type-param.marko │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── warn-macro-duplicate/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.diagnostics.txt │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ ├── while-tag/ │ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ │ └── template.marko │ │ │ │ │ └── white-space-test/ │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ ├── cjs-expected.js │ │ │ │ │ │ ├── generated-expected.marko │ │ │ │ │ │ ├── html-expected.js │ │ │ │ │ │ ├── htmlProduction-expected.js │ │ │ │ │ │ ├── hydrate-expected.js │ │ │ │ │ │ ├── vdom-expected.js │ │ │ │ │ │ └── vdomProduction-expected.js │ │ │ │ │ └── template.marko │ │ │ │ └── index.test.js │ │ │ ├── vdom-create/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── appendDocumentFragment-children/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── appendDocumentFragment-no-children/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── assignAttributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── attributes-attr-collection/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── attributes-attr-collection-child/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── attributes-null-false/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── attributes-object/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── attributes-true/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── cloneNode/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── cloneNode-documentFragment/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── cloneNode-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── createAttributes/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── deeply-nested-element/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── deeply-nested-element-2/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── doc-fragment-child/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── doc-fragment-child-with-sibling/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── doc-fragment-deeply-nested/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── doc-fragment-deeply-nested-empty/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── doc-fragment-deeply-nested-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── id/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── input-checked/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── input-disabled/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── input-value/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── isSameNode-createElement/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── no-children/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── one-child-element/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── one-child-text/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── option-selected/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── static-tree/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── static-tree-svg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── svg/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── svg-dynamic/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── textarea/ │ │ │ │ │ │ ├── expected.html │ │ │ │ │ │ └── index.js │ │ │ │ │ └── textarea-invalid-child/ │ │ │ │ │ ├── expected.html │ │ │ │ │ └── index.js │ │ │ │ └── index.test.js │ │ │ └── vdom-virtualize/ │ │ │ ├── fixtures/ │ │ │ │ ├── attr-value-empty-string/ │ │ │ │ │ ├── input.html │ │ │ │ │ └── virtualized-expected.html │ │ │ │ ├── math/ │ │ │ │ │ ├── input.html │ │ │ │ │ └── virtualized-expected.html │ │ │ │ ├── one-empty-element/ │ │ │ │ │ ├── input.html │ │ │ │ │ └── virtualized-expected.html │ │ │ │ ├── svg/ │ │ │ │ │ ├── input.html │ │ │ │ │ └── virtualized-expected.html │ │ │ │ ├── svg-xlink/ │ │ │ │ │ ├── input.html │ │ │ │ │ └── virtualized-expected.html │ │ │ │ └── textarea/ │ │ │ │ ├── input.html │ │ │ │ └── virtualized-expected.html │ │ │ └── index.test.js │ │ └── translator/ │ │ ├── index.d.ts │ │ └── package.json │ └── runtime-tags/ │ ├── CHANGELOG.md │ ├── README.md │ ├── index.d.ts │ ├── package.json │ ├── scripts/ │ │ ├── bundle.mts │ │ └── bundle.ts │ ├── src/ │ │ ├── __tests__/ │ │ │ ├── common-helpers.test.ts │ │ │ ├── fixtures/ │ │ │ │ ├── abort-signal-render-phase-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-destructured/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-destructured-increment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-destructured-reduced/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-in-wrapped-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-live-read/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-to-owner-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-to-pruned-let/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assign-to-pruned-let-with-change-handler/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── assignment-before-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-deep-recursive/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── recurse.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── recurse.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── recurse.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-multi-resolve-in-order-and-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-nested-resolve-in-order/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-reject-then-resolve-before-and-after-isolated-boundaries/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-reject-then-resolve-isolated-boundaries/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-reorder-nested-batched-resolve/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-resolve-in-order/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-resolve-out-of-order/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── async-state/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── at-tag-inside-if-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── at-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── at-tags-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── at-tags-dynamic-and-static/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── at-tags-dynamic-tag-parent/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── at-tags-dynamic-with-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── at-tags-for-loop-param-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── at-tags-for-loop-param-intersection-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── at-tags-static-repeated/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── attr-boolean/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── attr-boolean-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── attr-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── attr-escape/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── attr-falsey/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── attr-style/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── attr-tag-params-spread-reference/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── attr-template-literal-escape/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-cleanup/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-closure-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-closure-in-order/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-closure-inert/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-closure-within/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-remove-parent/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-update-after-resume/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── await-update-before-resume/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-chain/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── basic-component/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-input-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-input-same-source-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-input-same-source-alias-within-pattern/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-component-renderBody/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-conditional-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-conditional-counter-multiple-nodes/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-converge-in-if/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── basic-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-counter-const-event-handler/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-counter-multiplier/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-dynamic-native-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-effect-no-deps/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── basic-execution-order/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-export/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-flush-here/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-fn-with-block/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-handler-multi-ref-nested/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-handler-refless/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-inert-collapsible-tree/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── comments.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── comments.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── comments.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-layout/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-member-expression-computed/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-member-expression-optional/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-merge-member-expression/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-for/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-scope-custom-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-scope-dynamic-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-scope-for/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-nested-scope-if/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-push-pop-list/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-shared-node-ref/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-static/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── basic-toggle-show/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── basic-unused-ref/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── batched-updates/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── batched-updates-cleanup/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── bind-to-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── FancyButton.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── FancyButton.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── FancyButton.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── branch-closure-if-only-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── catch-single-reject-async/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── catch-single-success-async/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── catch-single-success-sync/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── catch-single-throw-sync/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── cdata/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── change-handler-alias-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── circular-tag-var-function-serialize/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-n-child-for-shallow/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-n-child-if-deep/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-n-child-if-same-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-n-child-if-shallow/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-single-child-for-deep/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-single-child-for-shallow/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-single-child-if-deep/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-single-child-if-same-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cleanup-single-child-if-shallow/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── closure-owner-scope-serialize-in-serialized-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── closure-serialize-reason/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── comments/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── component-attrs-import-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── helpers.ts │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── component-attrs-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── display-intersection.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── display-intersection.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── display-intersection.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── component-attrs-static-code/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── helpers.ts │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── component-attrs-static-non-registered-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── price.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── price.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── helpers.ts │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── price.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── conditional-table-row/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── const-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── const-tag-destructure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── const-tag-hoist-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-many/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── checkbox.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── checkbox.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── checkbox.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-value-multiple-number/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-value-number/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-value-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── radio.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── radio.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── radio.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-values/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-checked-values-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── checkbox.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── checkbox.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── checkbox.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-details-open/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-dialog-open/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-dynamic-checkbox-checked-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-input-number-member-modifier-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-input.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-input.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-input.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-input-number-modifier-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-input-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-input-value-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-input.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-input.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-input.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select-dynamic-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select-multiple-value-number/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select-mutated-option/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-select.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-select.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-select.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-select-value-number/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-textarea-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── controllable-textarea-value-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-textarea.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-textarea.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-textarea.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── counter-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── create-and-clear-rows-loop-from/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── create-and-clear-rows-loop-in/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── cross-tag-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── my-let.js │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── my-let.js │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── my-let.marko │ │ │ │ │ │ └── my-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-args-and-attributes-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-args-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-child-analyze/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── message.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── message.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── hello/ │ │ │ │ │ │ │ ├── index.marko │ │ │ │ │ │ │ ├── marko-tag.json │ │ │ │ │ │ │ └── transformer.ts │ │ │ │ │ │ └── message.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-parameters-from-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-parameters-from-attributes/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-parameters-from-single-arg/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-render-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-separate-assets/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ ├── template.style.css │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-template/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── hello.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── hello.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── hello.marko │ │ │ │ │ ├── marko.json │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-var-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-var-expression/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-var-in-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-var-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── custom-tag-var-multiple/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── debug-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── declaration/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── marko.json │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── declared-alias-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── define-tag-circular/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── define-tag-for-attribute-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-no-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── define-tag-object/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-recursive-known/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── define-tag-recursive-unknown/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── define-tag-render/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-render-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-render-attr-signal/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-render-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-render-conditional/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── define-tag-render-stateful/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── destructure-and-member-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── destructure-and-reference-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── destructure-and-reference-unprovided-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── destructure-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── destructure-input-with-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── destructure-stateful-upstream-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── store.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── store.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── store.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── doctype/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dollar-global-client/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-closure-multiple/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-closure-with-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-closures/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-content-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-event-handlers/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-native-dynamic-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-native-tag-events/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-args-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-attr-signal/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-content-default/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── dynamic-tag-custom-native/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-custom-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child1.js │ │ │ │ │ │ │ │ └── child2.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child1.js │ │ │ │ │ │ │ │ └── child2.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child1.marko │ │ │ │ │ │ └── child2.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-input-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-multiple/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── wrapper.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── wrapper.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── wrapper.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── dynamic-tag-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── tag-a/ │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── tag-b/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── tag-a/ │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── tag-b/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── tag-a/ │ │ │ │ │ │ │ └── index.marko │ │ │ │ │ │ └── tag-b/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── dynamic-tag-native/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── dynamic-tag-single-arg/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-sometimes-null/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── wrapper.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── wrapper.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── wrapper.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── dynamic-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-var-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-var-in-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── dynamic-tag-with-updating-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── embed-control-flow-boundary/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── embed-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── embed-removal/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── empty-child-template/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── entities/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── error-assign-to-tag-param-in-render/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-assign-to-tag-var-in-render/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-async/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-basic-scriptlet/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-base-var-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-mutation/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-no-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-no-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-const-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-custom-tag-local-case/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-custom-tag-not-found/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-custom-tag-own-body-read-before-return/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-debug-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-debug-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-debug-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-debug-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-debug-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-define-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-define-no-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-define-tag-hoist/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-duplicate-declaration/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-dynamic-tag-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-effect-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-effect-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-effect-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-effect-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-effect-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-else-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-else-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-else-no-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-else-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-else-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-no-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-no-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-elseif-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-html-comment-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-html-comment-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-html-comment-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-destructure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-no-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-id-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-else-else-if/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-else-wrong-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-no-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-no-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-if-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-input-shadow/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-invalid-html-attr-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-invalid-modifier-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-invalid-user-attr-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-invalid-binding/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-no-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-let-spread-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-no-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-spread-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-lifecycle-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-no-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-log-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-mututally-exclusive-partial-spread-native-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-mututally-exclusive-spread-native-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-mututally-exclusive-static-native-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-body-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-extra-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-if-else/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-multiple/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-no-default-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-params/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-spread-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-return-write/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ └── resume.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-script-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── error-script-placeholder/ │ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ ├── error-script-placeholder/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── error-script-placeholder/ │ │ │ │ │ │ ├── template.marko │ │ │ │ │ │ └── test.ts │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-script-placeholder/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-style-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-style-placeholder/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-sync/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-tag-var-uninitialized/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── escape-html-strings/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── expression-statement-tag-var-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-by/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-by-use-index/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-destructure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-event-handler/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-loop-closure-remove-all-items/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-grow-shrink/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-insert-middle/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-mixed/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-replace/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-reverse/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-rotate/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-reorder-swap/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-serialize-key/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── for-tag-siblings/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── for-tag-single-node-only-child-in-parent/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-tag-single-text-node-with-text-before/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-tag-static-value-with-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── for-tag-with-state/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── function-references-normalize/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── function-references-optional-member-normalize/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── function-registration/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── function-tag-var-default-registration/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── function-tag-var-registration/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── getter-on-single-node-only-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hello-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var-attr-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var-from-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var-many/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var-minimum-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-custom-tag-var-same-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-custom-tag-var-same-scope-calls-only/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── source.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── source.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── source.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-dynamic-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-dynamic-tag-var-from-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── thing.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── thing.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-dynamic-tag-var-many/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-in-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-native-tag-script-read/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-native-tag-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-native-tag-var-from-dynamic/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── hoist-native-tag-var-many/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-native-tag-var-minimum-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-native-tag-var-same-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-native-tag-var-same-scope-calls-only/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-only/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-return-ref/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── source.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── source.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── source.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── hoist-throws-in-render/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-comment-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-comment-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── parent-el.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── parent-el.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── parent-el.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-entity/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── html-script/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-script-nonce/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-style/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── html-style-nonce/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── id-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── id-tag-default/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── id-tag-hoist-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── if-default-false/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── if-member-expression-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── if-no-content-script/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── if-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── import-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── baz.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── baz.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── bar.ts │ │ │ │ │ ├── foo.ts │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── baz.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── import-tag-conflict/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── asset1.ts │ │ │ │ │ ├── asset2.ts │ │ │ │ │ └── template.marko │ │ │ │ ├── import-tag-shorthand/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── baz.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── baz.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── bar.ts │ │ │ │ │ ├── foo.ts │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── baz.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── import-tag-ternary/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── baz.js │ │ │ │ │ │ │ │ └── foo.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── baz.js │ │ │ │ │ │ │ │ └── foo.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── baz.marko │ │ │ │ │ │ └── foo.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── import-types/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ ├── types-specifier.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── inert-control-flow-only-child-event/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── inert-control-flow-only-child-select-event/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── inert-if-closure-update-active/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── inert-if-closure-update-inactive/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── inert-params-no-serialize/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── input-destructure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── input-integer-reference/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── input-missing-property/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── input-property-alias-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── isolated-known-tag-param-serialize-groups/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── known-define-tag-empty-section-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── test.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── known-define-tag-empty-section-fn-closure-element-reference/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── known-rest-attr-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── known-tag-param-serialize-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── known-tag-spread-unused/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── let-basic-member-expression-never-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-bind-stateful-upstream-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── store.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── store.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── store.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-intersection-child-var-custom-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── let-global.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── let-global.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── let-global.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-intersection-child-var-define/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-controllable-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-controllable-compile-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-controllable-dynamic-change-handler/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-controllable-id/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-controllable-static/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-derived/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-set-in-effect/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-tag-with-intersection/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-undefined-until-dom/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── let-without-assignments/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── lifecycle-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── lifecycle-tag-assignment/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── lifecycle-tag-conditional/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── lifecycle-tag-this/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── lifecycle-tag-this-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── local-closure-script/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── list/ │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── log-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── merged-define-tag-templates/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── migrate-effect-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── migrate-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── migrate-out-global/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── move-and-clear-children/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── move-and-clear-top-level/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── multi-class-toggle/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── multiple-binds/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── multiple-bound-values/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── 2counters.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── 2counters.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── 2counters.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── my-for-to/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-for.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-for.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-for.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── namespaced-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── native-tag-duplicate-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-local-closures/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── native-tag-name/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-ref-and-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-ref-downstream-effect/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-ref-effect/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-ref-effect-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello-setter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello-setter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello-setter.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-ref-throws-in-render/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── native-tag-spread-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-div.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-div.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-div.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── native-tag-var-in-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── nested-assignment-expression/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── nested-for-if-stateful/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── no-render-content-conditional/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── my-const.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── my-const.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── my-const.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── no-render-content-subtree/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── my-const.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── my-const.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── my-const.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── param-closure-alias-const/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── param-closure-alias-let/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── param-destructure-default/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── param-destructure-dynamic-default/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── placeholder-single/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── placeholder-skipped/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── placeholder-static-multiple/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── placeholders/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── placeholders-nested/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── pure-signal/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── pure-signal-resume-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── read-proposed-tag-variable-after-write/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── reassignment-expression-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── reference-in-own-body/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── remove-and-add-rows/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── render-effect/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── render-effect.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── render-effect.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── render-effect.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── rest-alias-nested-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── rest-tag-var/ │ │ │ │ │ ├── index.marko │ │ │ │ │ └── test.js │ │ │ │ ├── resume-single-node/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── return-serialize-circular/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── setter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── setter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── setter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── return-tag-bind-type-casting/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── my-let.js │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── my-let.js │ │ │ │ │ │ │ │ └── my-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── my-let.marko │ │ │ │ │ │ └── my-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── return-tag-no-state/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── return-tag-no-var/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── return-value-registered/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── getter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── getter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── getter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── returns-within-define-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── same-source-alias-pattern-and-identifier/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── same-source-non-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── script-no-references/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── script-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── script-tag-empty/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── script-tag-value-no-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── self-reference-custom-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── self-reference-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── self-reference-function-error/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.error.txt │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── self-reference-function-named/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── self-reference-native-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── serialize-promise/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── server-client/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── shadow-same-scope/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── spread-attr-tag-effect/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-native-event-handler-multi-alias/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── spread-to-known/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-attr-tag-custom-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-attr-tag-define-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-content-rest/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-defaults/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-multiple-children/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-multiple-spread-exprs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-rest/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-rest-deep/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ ├── wrap-outer.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ ├── wrap-outer.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ ├── wrap-outer.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── spread-to-known-rest-input/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── spread-to-known-rest-input-deopt/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── spread-to-known-rest-input-with-attr-tags-deopt/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── child.js │ │ │ │ │ │ │ │ └── wrap.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── child.marko │ │ │ │ │ │ └── wrap.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── spread-trailing-native-tag-default-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── static-function-invoked-render-reference/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── static-text-followed-by-placeholder/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── style-attr-toggle-with-static-content/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── style-tag/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── style-tag-concise/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── style-tag-modules-default/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── style-tag-modules-destructured/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── style-tag-type/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── tag-param-if-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── tag-resolution-priority/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── Bar.js │ │ │ │ │ │ │ │ └── foo.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── Bar.js │ │ │ │ │ │ │ │ └── foo.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── Bar.marko │ │ │ │ │ │ └── foo.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── tag-var-destructure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── tag-var-destructure-rest-chain/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── tag-var-rest/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── tag-var-with-serialize-reason/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── child.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── text-content-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── textarea-dynamic-text/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── textarea-spread/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── title-counter/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-first-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-nested/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-nested-2/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-nested-3/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-only-child/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-only-child-with-marker/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── toggle-stateful-component/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── trailing-tag-dynamic-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── try-effects-async/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── try-effects-catch/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── try-effects-catch-state/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── try-single-throw-sync/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── try-tag-closure/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── typescript-with-tag-variable/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── uncontrolled-details-open-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-dialog-open-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-input-checkbox-checkedValue-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-input-checked-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-input-radio-checkedValue-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-input-value-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-select-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-select-value-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-select-value-multiple-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-textarea-value/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── uncontrolled-textarea-value-default-update/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── unserializable-warning/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── unused-dynamic-tag-body-serialize-reason/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── unused-pattern-mutation-registered-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── unused-var-mutation-registered-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── update-attr/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── update-dynamic-attrs/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── update-html/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── update-text/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── used-var-mutation-registered-function/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── user-effect-abort-signal/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ └── walk-over-child/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── .name-cache.json │ │ │ │ │ ├── csr-sanitized.expected.md │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── child.js │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── resume-sanitized.expected.md │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ ├── ssr-sanitized.expected.md │ │ │ │ │ └── ssr.expected.md │ │ │ │ ├── tags/ │ │ │ │ │ └── child.marko │ │ │ │ └── template.marko │ │ │ ├── fixtures-interop/ │ │ │ │ ├── ambiguous/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── ambiguous-tags-and-components-dir/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── hello-components.js │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello-tags.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── hello-components.js │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello-tags.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── hello-components.marko │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello-tags.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── ambiguous-tags-dir/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── custom-tag-parameters-from-args/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── custom-tag.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── custom-tag.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── error-class-tags-dir/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ └── hello.error.txt │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ └── html.expected/ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ └── hello.error.txt │ │ │ │ │ │ └── template.js │ │ │ │ │ ├── tags/ │ │ │ │ │ │ └── hello.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── explicit/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ └── template.marko │ │ │ │ ├── interop-basic-class-to-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── tags-counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-basic-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── class-counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-class-in-components-in-tags-dir/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ └── hello-internal.js │ │ │ │ │ │ │ │ └── hello.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── tags/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ └── hello-internal.js │ │ │ │ │ │ │ │ └── hello.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── hello-internal.marko │ │ │ │ │ │ └── hello.marko │ │ │ │ │ └── template.marko │ │ │ │ ├── interop-class-to-tags-import/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── tags-counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-event-handler-render-body-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── my-button.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── my-button.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-events-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-counter.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-counter.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── class-counter.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-nested-attr-tags-class-to-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── tags-layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-nested-class-to-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── tags-layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-nested-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── class-layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-stateless-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── my-button/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── my-button/ │ │ │ │ │ │ │ │ ├── component-browser.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── my-button/ │ │ │ │ │ │ ├── component-browser.marko │ │ │ │ │ │ └── index.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-tag-params-class-to-tags/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── tags-layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── tags-layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ ├── interop-tag-params-tags-to-class/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-layout.js │ │ │ │ │ │ │ ├── template.hydrate.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── html.expected/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── class-layout.js │ │ │ │ │ │ │ └── template.js │ │ │ │ │ │ ├── resume.expected.md │ │ │ │ │ │ └── ssr.expected.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── class-layout.marko │ │ │ │ │ ├── template.marko │ │ │ │ │ └── test.ts │ │ │ │ └── let/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── csr.expected.md │ │ │ │ │ ├── dom.expected/ │ │ │ │ │ │ └── template.js │ │ │ │ │ └── html.expected/ │ │ │ │ │ └── template.js │ │ │ │ ├── template.marko │ │ │ │ └── test.ts │ │ │ ├── html-attrs.test.ts │ │ │ ├── html-content.test.ts │ │ │ ├── interop.test.ts │ │ │ ├── main.test.ts │ │ │ ├── marko.json │ │ │ ├── package.json │ │ │ ├── resolve-cursor-position.test.ts │ │ │ ├── serializer.test.ts │ │ │ └── utils/ │ │ │ ├── bundle.ts │ │ │ ├── capture-console.ts │ │ │ ├── create-browser.ts │ │ │ ├── embed-test-transform.ts │ │ │ ├── get-node-info.ts │ │ │ ├── resolve.ts │ │ │ ├── strip-inline-runtime.ts │ │ │ └── track-mutations.ts │ │ ├── common/ │ │ │ ├── accessor.debug.ts │ │ │ ├── accessor.ts │ │ │ ├── attr-tag.ts │ │ │ ├── compat-meta.ts │ │ │ ├── errors.ts │ │ │ ├── for.ts │ │ │ ├── helpers.ts │ │ │ ├── meta.ts │ │ │ ├── opt.ts │ │ │ └── types.ts │ │ ├── dom/ │ │ │ ├── abort-signal.ts │ │ │ ├── compat.ts │ │ │ ├── control-flow.ts │ │ │ ├── controllable.ts │ │ │ ├── dom.ts │ │ │ ├── event.ts │ │ │ ├── parse-html.ts │ │ │ ├── queue.ts │ │ │ ├── renderer.ts │ │ │ ├── resolve-cursor-position.ts │ │ │ ├── resume.ts │ │ │ ├── schedule.ts │ │ │ ├── scope.ts │ │ │ ├── signals.ts │ │ │ ├── template.ts │ │ │ └── walker.ts │ │ ├── dom.ts │ │ ├── html/ │ │ │ ├── attrs.ts │ │ │ ├── compat.ts │ │ │ ├── content.ts │ │ │ ├── dynamic-tag.ts │ │ │ ├── for.ts │ │ │ ├── inlined-runtimes.ts │ │ │ ├── serializer.ts │ │ │ ├── template.ts │ │ │ └── writer.ts │ │ ├── html.ts │ │ ├── translator/ │ │ │ ├── core/ │ │ │ │ ├── attrs.ts │ │ │ │ ├── await.ts │ │ │ │ ├── client.ts │ │ │ │ ├── const.ts │ │ │ │ ├── debug.ts │ │ │ │ ├── define.ts │ │ │ │ ├── effect.ts │ │ │ │ ├── export.ts │ │ │ │ ├── for.ts │ │ │ │ ├── html-comment.ts │ │ │ │ ├── html-script.ts │ │ │ │ ├── html-style.ts │ │ │ │ ├── id.ts │ │ │ │ ├── if.ts │ │ │ │ ├── import.ts │ │ │ │ ├── index.ts │ │ │ │ ├── let.ts │ │ │ │ ├── lifecycle.ts │ │ │ │ ├── log.ts │ │ │ │ ├── return.ts │ │ │ │ ├── script.ts │ │ │ │ ├── server.ts │ │ │ │ ├── static.ts │ │ │ │ ├── style.ts │ │ │ │ ├── textarea.ts │ │ │ │ └── try.ts │ │ │ ├── index.ts │ │ │ ├── interop/ │ │ │ │ ├── build-aggregate-error.ts │ │ │ │ ├── feature-detection.ts │ │ │ │ └── index.ts │ │ │ ├── util/ │ │ │ │ ├── assert.ts │ │ │ │ ├── binding-has-prop.ts │ │ │ │ ├── binding-prop-tree.ts │ │ │ │ ├── body-to-text-literal.ts │ │ │ │ ├── entry-builder.ts │ │ │ │ ├── evaluate.ts │ │ │ │ ├── for-each-identifier.ts │ │ │ │ ├── generate-uid.ts │ │ │ │ ├── get-accessor-char.ts │ │ │ │ ├── get-compile-stage.ts │ │ │ │ ├── get-defined-binding-expression.ts │ │ │ │ ├── get-known-attr-values.ts │ │ │ │ ├── get-parent-tag.ts │ │ │ │ ├── get-root.ts │ │ │ │ ├── get-style-file.ts │ │ │ │ ├── get-tag-name.ts │ │ │ │ ├── is-core-tag.ts │ │ │ │ ├── is-event-or-change-handler.ts │ │ │ │ ├── is-invoked-function.ts │ │ │ │ ├── is-non-html-text.ts │ │ │ │ ├── is-only-child-in-parent.ts │ │ │ │ ├── is-static.ts │ │ │ │ ├── known-tag.ts │ │ │ │ ├── marko-config.ts │ │ │ │ ├── nested-attribute-tags.ts │ │ │ │ ├── normalize-string-expression.ts │ │ │ │ ├── optional.ts │ │ │ │ ├── plugin-hooks.ts │ │ │ │ ├── references.ts │ │ │ │ ├── runtime-info.ts │ │ │ │ ├── runtime.ts │ │ │ │ ├── scope-read.ts │ │ │ │ ├── sections.ts │ │ │ │ ├── serialize-guard.ts │ │ │ │ ├── serialize-reasons.ts │ │ │ │ ├── set-tag-sections-downstream.ts │ │ │ │ ├── signals.ts │ │ │ │ ├── simplify-fn.ts │ │ │ │ ├── state.ts │ │ │ │ ├── tag-name-type.ts │ │ │ │ ├── to-first-expression-or-block.ts │ │ │ │ ├── to-first-statement-or-block.ts │ │ │ │ ├── to-property-name.ts │ │ │ │ ├── translate-attrs.ts │ │ │ │ ├── translate-var.ts │ │ │ │ ├── traverse.ts │ │ │ │ ├── visitors.ts │ │ │ │ ├── walks.ts │ │ │ │ ├── with-comment.ts │ │ │ │ ├── with-previous-location.ts │ │ │ │ └── writer.ts │ │ │ └── visitors/ │ │ │ ├── cdata.ts │ │ │ ├── comment.ts │ │ │ ├── declaration.ts │ │ │ ├── document-type.ts │ │ │ ├── function.ts │ │ │ ├── import-declaration.ts │ │ │ ├── placeholder.ts │ │ │ ├── program/ │ │ │ │ ├── dom.ts │ │ │ │ ├── html.ts │ │ │ │ ├── index.ts │ │ │ │ └── pre-analyze.ts │ │ │ ├── referenced-identifier.ts │ │ │ ├── scriptlet.ts │ │ │ ├── tag/ │ │ │ │ ├── attribute-tag.ts │ │ │ │ ├── custom-tag.ts │ │ │ │ ├── dynamic-tag.ts │ │ │ │ ├── index.ts │ │ │ │ └── native-tag.ts │ │ │ └── text.ts │ │ └── types.d.ts │ ├── tags/ │ │ ├── await.d.marko │ │ ├── const.d.marko │ │ ├── debug.d.marko │ │ ├── define.d.marko │ │ ├── effect.d.marko │ │ ├── html-comment.d.marko │ │ ├── html-script.d.marko │ │ ├── html-style.d.marko │ │ ├── id.d.marko │ │ ├── let.d.marko │ │ ├── lifecycle.d.marko │ │ ├── log.d.marko │ │ ├── script.d.marko │ │ └── try.d.marko │ ├── tags-html.d.ts │ ├── translator.js │ └── tsconfig.json ├── patches/ │ ├── @babel+generator+7.29.1.patch │ ├── @babel+helper-compilation-targets+7.28.6.patch │ ├── @babel+traverse+7.29.0.patch │ └── @babel+types+7.29.0.patch ├── scripts/ │ ├── babel-plugin-marko-debug.js │ ├── babel-register.js │ ├── inspect-compiled-output.ts │ ├── pkg-override.js │ ├── publish-alias.ts │ └── sizes.ts ├── skills/ │ └── marko-best-practices/ │ └── SKILL.md ├── tsconfig.build.json └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .browserslistrc ================================================ extends @ebay/browserslist-config ================================================ FILE: .c8rc.json ================================================ { "all": true, "excludeAfterRemap": true, "parserPlugins": ["objectRestSpread", "typescript"], "reporter": ["text-summary", "lcov"], "include": [ "packages/*/src/**/*.js", "packages/*/src/**/*.ts", "packages/*/src/**/*.marko" ], "exclude": [ "**/__tests__", "packages/runtime-tags/src/html/reorder-runtime.ts", "**/*.d.ts" ] } ================================================ FILE: .changeset/README.md ================================================ # Changesets Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) ================================================ FILE: .changeset/config.json ================================================ { "$schema": "https://unpkg.com/@changesets/config@1.7.0/schema.json", "changelog": ["@changesets/changelog-github", { "repo": "marko-js/marko" }], "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { "onlyUpdatePeerDependentsWhenOutOfRange": true }, "updateInternalDependencies": "patch", "baseBranch": "main", "access": "public", "commit": false, "linked": [], "ignore": [], "fixed": [] } ================================================ FILE: .gitattributes ================================================ package-lock.json -diff packages/runtime-class/src/node_modules/** linguist-generated=false ================================================ FILE: .github/CODE_OF_CONDUCT.md ================================================ # Code of Conduct This project adheres to the [eBay Code of Conduct](https://github.com/eBay/.github/blob/main/CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. - Be friendly and patient. - Be welcoming: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, color, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. - Be considerate: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we’re a world-wide community, so you might not be communicating in someone else’s primary language. - Be respectful: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. - Be careful in the words that we choose: we are a community of professionals, and we conduct ourselves professionally. - Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren’t acceptable. - Try to understand why we disagree: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. - Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. Please visit https://github.com/eBay/.github/blob/main/CODE_OF_CONDUCT.md for the full code of conduct. ================================================ FILE: .github/CONTRIBUTING.md ================================================ # Contribution tips and guidelines :+1::tada: We're excited you want to contribute! Read on! :tada::+1: [Questions](#i-just-have-a-question) • [Pull requests](#pull-requests-are-always-welcome) • [Tackling issues](#tackling-an-existing-issue) • [Reporting bugs](#reporting-bugs-and-other-issues) • [Labels](#labels) ## I just have a question Before you ask, check our [existing questions](https://github.com/marko-js/marko/issues?page=2&q=is%3Aissue+label%3Atype%3Aquestion&utf8=%E2%9C%93) to see if your question has already been answered. If not, go ahead an open an issue or join us in [Discord](https://discord.gg/RFGxYGs) to ask a question. Please be sure to use [markdown code blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks/) when posting code on GitHub or Discord: ```` ```marko
some marko ${code}
``` ```js const some = js.code; ``` ```` ## Pull requests are always welcome Not sure if that typo is worth a pull request? Found a bug and know how to fix it? Do it! We will appreciate it. Any significant improvement should be documented as [a GitHub issue](https://github.com/marko-js/marko/issues) before anybody starts working on it. We are always thrilled to receive pull requests. We do our best to process them quickly. If your pull request is not accepted on the first try, don't get discouraged! We'll work with you to come to an acceptable solution. Prior to merging your PR, you will need to sign the [Open JS Foundation CLA](https://easycla.lfx.linuxfoundation.org/). It's pretty straight-forward and only takes a minute. You'll also be prompted to sign the CLA automatically when opening a PR. > **TIP:** If you're new to GitHub or open source you can check out this [free course](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github) on how to contribute to an open source project. ### Running tests Before submitting your PR, make sure that all new and previous tests pass and that [coverage](https://codecov.io/gh/marko-js/marko) has not decreased: ``` npm run @ci:test # to view the coverage report npm run report ``` While developing you can run a single test group and use [grep](https://mochajs.org/#-g---grep-pattern) to filter the tests: ``` npm test -- --grep=lifecycle ``` ### Adding tests Marko makes use of directory based test suites. Take a look at the `render` test suite:
test/render/fixtures/
      ⤷ attrs/
      ⤷ for-tag/expected.htmltemplate.markotest.js
      ⤷ nested-tags/
      ⤷ while-tag/
    ⤷ html.test.js
The `html.test.js` file will run and read all the directories under `render/fixtures` and for each directory (`attrs`, `for-tag`, etc.) it will run `test.js`, render `template.marko` and assert that it is equivalent to the content of `expected.html`. To add a new test, you'll find the appropriate test suite, copy a fixture, and modify it to add the new test. #### Skipping a test A few of the tests suites use the same fixtures for multiple test scenarios. For example, the `component-browser` tests run once rendering the component in a browser environment and a second time rendering in a server environment, then hydrating in the browser. For some tests, it might be necessary to skip the test in one of these scenarios. This is done by exporting a [`skip_hydrate`](https://github.com/marko-js/marko/blob/e3df4936c83a5ef419e8186df14ffc6012fcbdcc/test/components-browser/fixtures/implicit-component/test.js#L10) (or similiarly named) property from the fixture. The value of the property should be a string explaining why the test is skipped. #### Adding a failing test case If you've discovered an issue and are able to reproduce it, but don't have a fix, consider submitting a PR with a failing test case. You can mark a fixture as expected to fail by appending exporting a [`fails`](https://github.com/marko-js/marko/blob/0833ada47eeb5c833a11ef01fcd53ae39b0b7491/test/render/fixtures/spread-attribute-function-object/test.js#L1) property from the fixture. The value of the `fails` property should be a string with the issue number. Upon merging a failing test case, a maintainer will update the corresponding issue to add the [`has failing test`](https://github.com/marko-js/marko/labels/has%20failing%20test) label. In the case that a fixture is used in multiple test scenarios, you can mark the test as failing in a specific scenario by exporting a [`fails_hydrate`](https://github.com/marko-js/marko/blob/e3df4936c83a5ef419e8186df14ffc6012fcbdcc/test/components-browser/fixtures-deprecated/widget-conditional/test.js#L19) (or similarly named) property from the fixture. Expected failures won't cause [Travis CI](https://travis-ci.org/marko-js/marko) to report a error, but document that there is an issue and give others a starting point for fixing the problem. ### Debugging tests If you need to dig a bit deeper into a failing test, use the `--inspect-brk` flag, open Chrome DevTools, and click on the green nodejs icon () to start debugging. Learn more about [debugging node](https://www.youtube.com/watch?v=Xb_0awoShR8&t=103s) from this video. ``` npm test -- --grep=test-name --inspect-brk ``` In addition to [setting breakpoints](https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints), you can also add [`debugger;`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger) statements in both your JavaScript files and Marko templates: ```marko $ debugger;
Hello ${input.name}!
``` ### Updating snapshots A number of the test suites make use snapshot comparisons. For example, the `render` tests compare the rendered html against a stored snapshot. Similarly, the `compiler` tests compare the generated JavaScript module againt a stored snapshot. Any changes compared to the snapshot should be looked at closely, but there are some cases where it is fine that the output has changed and the snapshot needs to be updated. To update a snapshot, you can copy the contents from the `actual` file to the `expected` file in the fixture directory. You can also use the `UPDATE_EXPECTATIONS` env variable to cause the test runner to update the `expected` file for all currently failing tests in a suite: ``` UPDATE_EXPECTATIONS=1 npm test ``` ## Tackling an existing issue Comment on the issue and let us know you'd like to tackle it. If for some reason you aren't going to be able to complete the work, let us know as soon as you can so we can open it up for another developer to work on. Here's some to get started with: - [good first issue](https://github.com/marko-js/marko/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22): great for new contributors - [help wanted](https://github.com/marko-js/marko/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) issues: won't be tackled in the near future by the maintainers... we need your help! - [unassigned](https://github.com/marko-js/marko/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20no%3Aassignee%20) issues: open issues that no one has claimed... yet - [has failing test](https://github.com/marko-js/marko/labels/has%20failing%20test) issues: open issues that already have a failing test case in the repo. make it pass! ## Reporting bugs and other issues A great way to contribute to the project is to send a detailed report when you encounter an issue. Even better: submit a PR with a failing test case ([see how](#adding-a-failing-test-case)). Check that [our issue database](https://github.com/marko-js/marko/issues) doesn't already include that problem or suggestion before submitting an issue. If you find a match, you can use the "subscribe" button to get notified on updates. Rather than leaving a "+1" or "I have this too" comment, you can add a [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) to let us know that this is also affecting you without cluttering the conversation. However, if you have ways to reproduce the issue or have additional information that may help resolving the issue, please leave a comment. We have an [ISSUE_TEMPLATE](ISSUE_TEMPLATE.md) that will populate your textarea when you go to open an issue. Use the relevant section and remove the rest. Please provide as much detail as possible. ### Reporting security issues If you discover a security issue, please **DO NOT** file a public issue, instead **privately** send your report to one of the members with the `core team` role in the [Discord](https://discord.gg/RFGxYGs). Security reports are greatly appreciated and we will publicly thank you for it. We currently do not offer a paid security bounty program. # Labels Once you post an issue, a maintainer will add one or more labels to it. Below is a guideline for the maintainers and anyone else who is interested in what the various labels mean. ### Type ![](https://img.shields.io/badge/type-bug-dd0000.svg) ![](https://img.shields.io/badge/type-unverified%20bug-aa3300.svg) ![](https://img.shields.io/badge/type-feature-0099dd.svg) ![](https://img.shields.io/badge/type-question-99cc00.svg) ![](https://img.shields.io/badge/type-community-ff8800.svg) ![](https://img.shields.io/badge/type-tech%20debt-bfdadc.svg) ![](https://img.shields.io/badge/type-docs-bbbbbb.svg) Every issue should be assigned one of these. - **bug**: A bug report - **unverified-bug**: A bug report that has not been verified - **feature**: A feature request - **question**: A question about how to do something in Marko - **community**: Related to community building, improving the contribution process, etc. - **tech debt**: Related to refactoring code, test structure, etc. - **docs**: Related to documentation/website ### Scope ![](https://img.shields.io/badge/scope-parser-5500cc.svg) ![](https://img.shields.io/badge/scope-compiler-cc0077.svg) ![](https://img.shields.io/badge/scope-runtime-eebb00.svg) ![](https://img.shields.io/badge/scope-core%20taglib-00cccc.svg) ![](https://img.shields.io/badge/scope-components-9900aa.svg) ![](https://img.shields.io/badge/scope-tools-fef2c0.svg) What part of the Marko stack does this issue apply to? In most cases there should only be one of these. - **parser**: Relates to [`htmljs-parser`](https://github.com/marko-js/htmljs-parser) - **compiler**: Relates to the [compiler](../src/compiler) (server only) - **runtime**: Relates to the [runtime](../src/runtime) (isomorphic/universal) - **core-taglib**: Relates to [custom tags](../src/taglib) that ship with Marko - **components**: Relates to [components](../src/components) - **tools**: Relates to editor plugins, commandline tools, etc. ### Status ![](https://img.shields.io/badge/status-backlog-223344.svg) ![](https://img.shields.io/badge/status-in%20progress-006b75.svg) ![](https://img.shields.io/badge/status-needs%20review-0e8a16.svg) In many cases, additional _actions_ should be taken when applying one of these. - **backlog**: Tasks planned to be worked on - **in progress**: This is currently being worked on. - **needs review**: This issue needs to be followed up on. ### Reason closed ![](https://img.shields.io/badge/reason%20closed-resolved-99cc99.svg) ![](https://img.shields.io/badge/reason%20closed-duplicate-cc99cc.svg) ![](https://img.shields.io/badge/reason%20closed-declined-bb6666.svg) ![](https://img.shields.io/badge/reason%20closed-not%20a%20bug-997744.svg) ![](https://img.shields.io/badge/reason%20closed-inactivity-bfd4f2.svg) ![](https://img.shields.io/badge/reason%20closed-no%20issue-c5def5.svg) - **resolved**: The question was answered, the bug was fixed, or the feature was implemented. - **duplicate**: Someone has already posted the same or a very similar issue. A comment should be added that references the original issue. - **declined**: This feature will not be implemented. - **not a bug**: This is not a bug, but either user error or intended behavior. - **inactivity**: There was not enough info to reproduce the bug or not enough interest in the feature to hash out an implementation plan and the conversation has stalled. - **no issue**: This wasn't so much an issue as a comment ### Other ![](https://img.shields.io/badge/-good%20first%20issue-00cccc.svg) ![](https://img.shields.io/badge/-help%20wanted-33cc88.svg) ![](https://img.shields.io/badge/-blocked-6b0c0c.svg) ![](https://img.shields.io/badge/-needs%20more%20info-dd9944.svg) ![](https://img.shields.io/badge/-user%20land-e8c9c9.svg) - **good first issue**: Small tasks that would be good for first time contributors. - **help wanted**: Not on the roadmap, but we'd love for someone in the community to tackle it. - **blocked**: Cannot be completed until something else happens first. This should be described in a comment with a link to the blocking issue. - **needs more info**: The original poster needs to provide more information before action can be taken. - **user land**: Something that probably won't be added to core, but could be implemented/proved out as a separate module. ================================================ FILE: .github/ISSUE_TEMPLATE/Bug_report.md ================================================ --- name: "\U0001F41BBug report" about: Something isn't working right title: "" labels: "type:unverified bug" --- ### Marko Version: x.x.x ### Details ### Expected Behavior ### Actual Behavior ### Possible Fix
Additional Info ### Your Environment - Environment name and version (e.g. Chrome 39, node.js 5.4): - Operating System and version (desktop or mobile): - Link to your project: ### Steps to Reproduce 1. first... 2. 3. 4. ### Stack Trace
================================================ FILE: .github/ISSUE_TEMPLATE/Feature_request.md ================================================ --- name: "\U0001F680Feature request" about: Suggest an idea for this project title: "" labels: "type:feature" --- ### Description ### Why ### Possible Implementation & Open Questions ### Is this something you're interested in working on? ================================================ FILE: .github/ISSUE_TEMPLATE/Support_question.md ================================================ --- name: "\U00002753Support Question" about: If you have a question, please check out our Discord or StackOverflow! title: "" labels: "type:question" --- ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Description ## Checklist: - [ ] I have read the **CONTRIBUTING** document and have signed (or will sign) the CLA. - [ ] I have updated/added documentation affected by my changes. - [ ] I have added tests to cover my changes. ================================================ FILE: .github/workflows/ci.yml ================================================ name: CI on: pull_request: types: [opened, synchronize] push: branches: [main, v3, v4] concurrency: group: "${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}" cancel-in-progress: true jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v6 - name: Use node uses: actions/setup-node@v6 with: node-version: 24 cache: npm - name: Install dependencies run: npm ci - name: Build run: npm run @ci:build - name: Lint Code run: npm run @ci:lint test: runs-on: ubuntu-latest name: "test: node@${{ matrix.node }}" strategy: fail-fast: false matrix: node: [20, 22, 24] steps: - name: Checkout code uses: actions/checkout@v6 - name: Use node@${{ matrix.node }} uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: npm - name: Install dependencies run: npm ci - name: Run tests run: npm run @ci:test - name: Report code coverage uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} release: runs-on: ubuntu-latest needs: [build, test] if: ${{ github.repository_owner == 'marko-js' && github.event_name == 'push' }} permissions: id-token: write contents: write pull-requests: write steps: - name: Checkout code uses: actions/checkout@v6 - name: Setup node uses: actions/setup-node@v6 with: node-version: 24 cache: npm - name: Install dependencies run: npm ci - name: Release id: changesets uses: changesets/action@v1 with: version: npm run @ci:version publish: npm run @ci:release commit: "[ci] release" title: "[ci] release" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Release Alias if: ${{ contains(steps.changesets.outputs.publishedPackages, '"@marko/runtime-tags"') }} run: npm run @ci:release-alias ================================================ FILE: .gitignore ================================================ # Build dist *.marko.js *actual* *.tsbuildinfo ### Node ### # Logs logs *.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids *.pid *.seed *.pid.lock # Coverage directory used by tools like istanbul coverage *.lcov # nyc test coverage .nyc_output # Dependency directories node_modules !packages/runtime-class/src/node_modules # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn .yarn-integrity yarn.lock # dotenv environment variables file .env .env.test ### Git ### # Created by git for backups. To disable backups in Git: # $ git config --global mergetool.keepBackup false *.orig # Created by git when using merge tools for conflicts *.BACKUP.* *.BASE.* *.LOCAL.* *.REMOTE.* *_BACKUP_*.txt *_BASE_*.txt *_LOCAL_*.txt *_REMOTE_*.txt ### OS ### # Linux *~ .fuse_hidden* .directory .Trash-* .nfs* # Mac .DS_Store .AppleDouble .LSOverride ._* Icon # Windows *[Tt]humbs*.db* [Dd]esktop.ini *.stackdump *.lnk ### EDITOR ### # VisualStudioCode .vscode .history *.sublime* # JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm *.iml *.ipr *.iws modules.xml .idea # SublimeText *.cache *.sublime-* Package Control.* oscrypto-ca-bundle.crt # TextMate *.tmproj *.tmproject tmtags # Vim *.swp *.vim .netrwhist ================================================ FILE: .husky/.gitignore ================================================ _ ================================================ FILE: .husky/pre-commit ================================================ npm exec -- lint-staged && npm run build && npm run build:sizes && git add .sizes.json && git add .sizes ================================================ FILE: .lintstagedrc.json ================================================ { "$schema": "https://json.schemastore.org/lintstagedrc.schema.json", "*.{ts,js}": ["eslint --fix", "prettier --write --with-node-modules"], "*.{json,md,css}": ["prettier --write --with-node-modules"] } ================================================ FILE: .mocharc.json ================================================ { "timeout": 5000, "enable-source-maps": true, "require": ["~ts", "mocha-snap"], "spec": ["packages/*/@(src|test)/**/*.test.@(js|ts)"], "watchFiles": ["src/**/*.@(js|ts|marko)", "!**/__snapshots__/**"] } ================================================ FILE: .prettierignore ================================================ __snapshots__ !packages/runtime-class/src/node_modules .cache .nvm .sizes .sizes.json .vscode *actual* *expected* ~* CHANGELOG.md coverage dist **/fixtures/*/* !**/fixtures/*/*.ts input.* node_modules package-lock.json snapshots ================================================ FILE: .prettierrc.json ================================================ { "$schema": "https://json.schemastore.org/prettierrc", "plugins": ["prettier-plugin-packagejson"] } ================================================ FILE: .sizes/comments.csr/entry.js ================================================ // size: 694 (min) 380 (brotli) const $if_content__comment_comments = _if_closure(4, 0, ($scope) => $input_comments$1($scope.a, $scope._.i), ), $if_content__setup = ($scope) => { ($if_content__comment_comments._($scope), $if_content__id._($scope), $scope.a); }, $if_content__id = _if_closure(4, 0, ($scope) => $input_path$1($scope.a, $scope._.l), ), $for_content__id = _const(11, ($scope) => { (_attr($scope.a, "id", $scope.l), $if_content__id($scope)); }), $for_content__input_path = _for_closure(0, ($scope) => $for_content__id($scope, `${$scope._.e || "c"}-${$scope.M}`), ), $for_content__open__script = _script("a0", ($scope) => _on($scope.c, "click", function () { $for_content__open($scope, !$scope.m); }), ), $for_content__open = _let(12, ($scope) => { (_attr($scope.a, "hidden", !$scope.m), _text($scope.d, $scope.m ? "[-]" : "[+]"), $for_content__open__script($scope)); }), $for_content__setup = ($scope) => { ($for_content__input_path._($scope), $for_content__open($scope, !0)); }, $for_content__if = _if(4, "", "/ b&", $if_content__setup), $for_content__comment_comments = _const(8, ($scope) => { ($for_content__if($scope, $scope.i ? 0 : 1), $if_content__comment_comments($scope)); }), $for_content__$params = ($scope, $params2) => $for_content__comment($scope, $params2[0]), $for_content__comment = ($scope, comment) => { ((($scope, comment_text) => { _text($scope.b, comment_text); })($scope, comment?.text), $for_content__comment_comments($scope, comment?.comments)); }, $for = _for_of( 0, "
  • ", " E l D l%l", $for_content__setup, $for_content__$params, ), $input_comments$1 = ($scope, input_comments) => $for($scope, [input_comments]), $input_path$1 = _const(4, $for_content__input_path); function $setup($scope) { $scope.a; } _template("b", "", "/ b&", $setup, ($scope, input) => { ((($scope, input_comments) => { $input_comments$1($scope.a, input_comments); })($scope, input.comments), (($scope, input_path) => { $input_path$1($scope.a, input_path); })($scope, input.path)); }).mount(); ================================================ FILE: .sizes/comments.ssr/entry.js ================================================ // size: 130 (min) 110 (brotli) const $for_content__open__script = _script("a0", ($scope) => _on($scope.c, "click", function () { $for_content__open($scope, !$scope.m); }), ), $for_content__open = _let(12, ($scope) => { (_attr($scope.a, "hidden", !$scope.m), _text($scope.d, $scope.m ? "[-]" : "[+]"), $for_content__open__script($scope)); }); init(); ================================================ FILE: .sizes/counter.csr/entry.js ================================================ // size: 173 (min) 148 (brotli) const $clickCount__script = _script("a0", ($scope) => _on($scope.a, "click", function () { $clickCount($scope, $scope.c + 1); }), ), $clickCount = _let(2, ($scope) => { (_text($scope.b, $scope.c), $clickCount__script($scope)); }); function $setup($scope) { $clickCount($scope, 0); } _template("a", "
    ", "D D m", $setup).mount(); ================================================ FILE: .sizes/counter.ssr/entry.js ================================================ // size: 96 (min) 100 (brotli) const $clickCount__script = _script("a0", ($scope) => _on($scope.a, "click", function () { $clickCount($scope, $scope.c + 1); }), ), $clickCount = _let(2, ($scope) => { (_text($scope.b, $scope.c), $clickCount__script($scope)); }); init(); ================================================ FILE: .sizes/dom.js ================================================ // size: 21238 (min) 7981 (brotli) var empty = [], rest = Symbol(); function attrTag(attrs) { return ( (attrs[Symbol.iterator] = attrTagIterator), (attrs[rest] = empty), attrs ); } function attrTags(first, attrs) { return first ? (first[rest] === empty ? (first[rest] = [attrs]) : first[rest].push(attrs), first) : attrTag(attrs); } function* attrTagIterator() { (yield this, yield* this[rest]); } function _assert_hoist(value) {} function _assert_init(scope, accessor) { return scope[accessor]; } function forIn(obj, cb) { for (let key in obj) cb(key, obj[key]); } function forOf(list, cb) { if (list) { let i = 0; for (let item of list) cb(item, i++); } } function forTo(to, from, step, cb) { let start = from || 0, delta = step || 1; for (let steps = (to - start) / delta, i = 0; i <= steps; i++) cb(start + i * delta); } function forUntil(until, from, step, cb) { let start = from || 0, delta = step || 1; for (let steps = (until - start) / delta, i = 0; i < steps; i++) cb(start + i * delta); } function _call(fn, v) { return (fn(v), v); } function stringifyClassObject(name, value) { return value ? name : ""; } function stringifyStyleObject(name, value) { return value || 0 === value ? name + ":" + value : ""; } function toDelimitedString(val, delimiter, stringify) { let part, str = "", sep = ""; if (val) if ("object" != typeof val) str += val; else if (Array.isArray(val)) for (let v of val) ((part = toDelimitedString(v, delimiter, stringify)), part && ((str += sep + part), (sep = delimiter))); else for (let name in val) ((part = stringify(name, val[name])), part && ((str += sep + part), (sep = delimiter))); return str; } function isEventHandler(name) { return /^on[A-Z-]/.test(name); } function getEventHandlerName(name) { return "-" === name[2] ? name.slice(3) : name.slice(2).toLowerCase(); } function normalizeDynamicRenderer(value) { if (value) { if ("string" == typeof value) return value; let normalized = value.content || value.default || value; if ("g" in normalized) return normalized; } } var decodeAccessor = (num) => (num + (num < 26 ? 10 : num < 962 ? 334 : 11998)).toString(36); function toArray(opt) { return opt ? (Array.isArray(opt) ? opt : [opt]) : []; } function push(opt, item) { return opt ? Array.isArray(opt) ? (opt.push(item), opt) : [opt, item] : item; } var defaultDelegator = createDelegator(); function _on(element, type, handler) { (void 0 === element["$" + type] && defaultDelegator(element, type, handleDelegated), (element["$" + type] = handler || null)); } function createDelegator() { let kEvents = Symbol(); return function (node, type, handler) { ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, !0), 1); }; } function handleDelegated(ev) { let target = !rendering && ev.target; for (; target; ) (target["$" + ev.type]?.(ev, target), (target = ev.bubbles && !ev.cancelBubble && target.parentNode)); } function stripSpacesAndPunctuation(str) { return str.replace(/[^\p{L}\p{N}]/gu, ""); } var parsers = {}; function parseHTML(html, ns) { let parser = (parsers[ns] ||= document.createElementNS(ns, "template")); return ((parser.innerHTML = html), parser.content || parser); } var isScheduled, channel, nextScopeId = 1e6; function createScope($global, closestBranch) { let scope = { L: nextScopeId++, H: 1, F: closestBranch, $: $global }; return (pendingScopes.push(scope), scope); } function skipScope() { return nextScopeId++; } function findBranchWithKey(scope, key) { let branch = scope.F; for (; branch && !branch[key]; ) branch = branch.N; return branch; } function destroyBranch(branch) { (branch.N?.D?.delete(branch), destroyNestedScopes(branch)); } function destroyScope(scope) { scope.I || (destroyNestedScopes(scope), resetControllers(scope)); } function destroyNestedScopes(scope) { ((scope.I = 1), scope.D?.forEach(destroyNestedScopes), scope.B?.forEach(resetControllers)); } function resetControllers(scope) { for (let id in scope.A) $signalReset(scope, id); } function removeAndDestroyBranch(branch) { (destroyBranch(branch), removeChildNodes(branch.S, branch.K)); } function insertBranchBefore(branch, parentNode, nextSibling) { insertChildNodes(parentNode, nextSibling, branch.S, branch.K); } function tempDetachBranch(branch) { let fragment = new DocumentFragment(); ((fragment.namespaceURI = branch.S.parentNode.namespaceURI), insertChildNodes(fragment, null, branch.S, branch.K)); } function schedule() { isScheduled || ((isScheduled = 1), queueMicrotask(flushAndWaitFrame)); } function flushAndWaitFrame() { (run(), requestAnimationFrame(triggerMacroTask)); } function triggerMacroTask() { (channel || ((channel = new MessageChannel()).port1.onmessage = () => { ((isScheduled = 0), run()); }), channel.port2.postMessage(0)); } function _let(id, fn) { let valueAccessor = decodeAccessor(id), valueChangeAccessor = "M" + valueAccessor; return (scope, value, valueChange) => ( rendering ? (((scope[valueChangeAccessor] = valueChange) && scope[valueAccessor] !== value) || scope.H) && ((scope[valueAccessor] = value), fn?.(scope)) : scope[valueChangeAccessor] ? scope[valueChangeAccessor](value) : scope[valueAccessor] !== (scope[valueAccessor] = value) && fn && (schedule(), queueRender(scope, fn, id)), value ); } function _const(valueAccessor, fn) { return ( (valueAccessor = decodeAccessor(valueAccessor)), (scope, value) => { (!(valueAccessor in scope) || scope[valueAccessor] !== value) && ((scope[valueAccessor] = value), fn?.(scope)); } ); } function _or(id, fn, defaultPending = 1, scopeIdAccessor = "L") { return ( "L" !== scopeIdAccessor && (scopeIdAccessor = decodeAccessor(scopeIdAccessor)), (scope) => { scope.H ? id in scope ? --scope[id] || fn(scope) : (scope[id] = defaultPending) : queueRender(scope, fn, id, 0, scope[scopeIdAccessor]); } ); } function _for_closure(ownerLoopNodeAccessor, fn) { let scopeAccessor = "A" + (ownerLoopNodeAccessor = decodeAccessor(ownerLoopNodeAccessor)), ownerSignal = (ownerScope) => { let scopes = toArray(ownerScope[scopeAccessor]); scopes.length && queueRender( ownerScope, () => { for (let scope of scopes) !scope.H && !scope.I && fn(scope); }, -1, 0, scopes[0].L, ); }; return ((ownerSignal._ = fn), ownerSignal); } function _if_closure(ownerConditionalNodeAccessor, branch, fn) { let scopeAccessor = "A" + (ownerConditionalNodeAccessor = decodeAccessor( ownerConditionalNodeAccessor, )), branchAccessor = "D" + ownerConditionalNodeAccessor, ownerSignal = (scope) => { let ifScope = scope[scopeAccessor]; ifScope && !ifScope.H && (scope[branchAccessor] || 0) === branch && queueRender(ifScope, fn, -1); }; return ((ownerSignal._ = fn), ownerSignal); } function subscribeToScopeSet(ownerScope, accessor, scope) { let subscribers = (ownerScope[accessor] ||= new Set()); subscribers.has(scope) || (subscribers.add(scope), $signal(scope, -1).addEventListener("abort", () => ownerScope[accessor].delete(scope), )); } function _closure(...closureSignals) { let [{ o: ___scopeInstancesAccessor, q: ___signalIndexAccessor }] = closureSignals; for (let i = closureSignals.length; i--; ) closureSignals[i].x = i; return (scope) => { if (scope[___scopeInstancesAccessor]) for (let childScope of scope[___scopeInstancesAccessor]) childScope.H || queueRender( childScope, closureSignals[childScope[___signalIndexAccessor]], -1, ); }; } function _closure_get(valueAccessor, fn, getOwnerScope, resumeId) { valueAccessor = decodeAccessor(valueAccessor); let closureSignal = (scope) => { ((scope[closureSignal.q] = closureSignal.x), fn(scope), subscribeToScopeSet( getOwnerScope ? getOwnerScope(scope) : scope._, closureSignal.o, scope, )); }; return ( (closureSignal.o = "B" + valueAccessor), (closureSignal.q = "C" + valueAccessor), resumeId && _resume(resumeId, closureSignal), closureSignal ); } function _child_setup(setup) { return ( (setup._ = (scope, owner) => { ((scope._ = owner), queueRender(scope, setup, -1)); }), setup ); } function _var(scope, childAccessor, signal) { scope[decodeAccessor(childAccessor)].T = (value) => signal(scope, value); } var _return = (scope, value) => scope.T?.(value); function _return_change(scope, changeHandler) { changeHandler && (scope.U = changeHandler); } var _var_change = (scope, value) => scope.U?.(value), tagIdsByGlobal = new WeakMap(); function _id({ $: $global }) { let id = tagIdsByGlobal.get($global) || 0; return ( tagIdsByGlobal.set($global, id + 1), "c" + $global.runtimeId + $global.renderId + id.toString(36) ); } function _script(id, fn) { return ( _resume(id, fn), (scope) => { queueEffect(scope, fn); } ); } function _el_read(value) { return value; } function* traverse(scope, path, i = path.length - 1) { if (scope) if (Symbol.iterator in scope) for (let childScope of scope.values()) yield* traverse(childScope, path, i); else { let item = scope[path[i]]; i ? yield* traverse(item, path, i - 1) : yield "function" == typeof item ? item() : item; } } function _hoist(...path) { return ( (path = path.map((p) => ("string" == typeof p ? p : decodeAccessor(p)))), (scope) => { let fn = () => traverse(scope, path).next().value; return ((fn[Symbol.iterator] = () => traverse(scope, path)), fn); } ); } function _hoist_resume(id, ...path) { return _resume(id, _hoist(...path)); } var walker = document.createTreeWalker(document); function walk(startNode, walkCodes, branch) { ((walker.currentNode = startNode), walkInternal(0, walkCodes, branch)); } function walkInternal(currentWalkIndex, walkCodes, scope) { let value, currentMultiplier, storedMultiplier = 0, currentScopeIndex = 0; for (; currentWalkIndex < walkCodes.length; ) if ( ((value = walkCodes.charCodeAt(currentWalkIndex++)), (currentMultiplier = storedMultiplier), (storedMultiplier = 0), 32 === value) ) { let node = walker.currentNode; scope[decodeAccessor(currentScopeIndex++)] = node; } else if (37 === value || 49 === value) (walker.currentNode.replaceWith( (walker.currentNode = scope[decodeAccessor(currentScopeIndex++)] = new Text()), ), 49 === value && (scope[decodeAccessor(currentScopeIndex++)] = skipScope())); else { if (38 === value) return currentWalkIndex; if (47 === value || 48 === value) ((currentWalkIndex = walkInternal( currentWalkIndex, walkCodes, (scope[decodeAccessor(currentScopeIndex++)] = createScope( scope.$, scope.F, )), )), 48 === value && (scope[decodeAccessor(currentScopeIndex++)] = skipScope())); else if (value < 92) for (value = 20 * currentMultiplier + value - 67; value--; ) walker.nextNode(); else if (value < 107) for (value = 10 * currentMultiplier + value - 97; value--; ) walker.nextSibling(); else if (value < 117) { for (value = 10 * currentMultiplier + value - 107; value--; ) walker.parentNode(); walker.nextSibling(); } else storedMultiplier = 10 * currentMultiplier + value - 117; } } function createBranch($global, renderer, parentScope, parentNode) { let branch = createScope($global); return ( (branch._ = renderer.f || parentScope), setParentBranch(branch, parentScope?.F), renderer.k?.(branch, parentNode.namespaceURI), branch ); } function setParentBranch(branch, parentBranch) { (parentBranch && ((branch.N = parentBranch), (parentBranch.D ||= new Set()).add(branch)), (branch.F = branch)); } function createAndSetupBranch($global, renderer, parentScope, parentNode) { return setupBranch( renderer, createBranch($global, renderer, parentScope, parentNode), ); } function setupBranch(renderer, branch) { return (renderer.l && queueRender(branch, renderer.l, -1), branch); } function _content(id, template, walks, setup, params, dynamicScopesAccessor) { ((walks = walks ? walks.replace(/[^\0-1]+$/, "") : ""), (setup = setup ? setup._ || setup : void 0), (params ||= void 0)); let clone = template ? (branch, ns) => { ((cloneCache[ns] ||= {})[template] ||= (function (html, ns) { let { firstChild: firstChild, lastChild: lastChild } = parseHTML( html, ns, ), parent = document.createElementNS(ns, "t"); return ( insertChildNodes(parent, null, firstChild, lastChild), firstChild === lastChild && firstChild.nodeType < 8 ? (branch, walks) => { walk( (branch.S = branch.K = firstChild.cloneNode(!0)), walks, branch, ); } : (branch, walks) => { let clone = parent.cloneNode(!0); (walk(clone.firstChild, walks, branch), (branch.S = clone.firstChild), (branch.K = clone.lastChild)); } ); })(template, ns))(branch, walks); } : (branch) => { walk((branch.S = branch.K = new Text()), walks, branch); }; return (owner) => ({ g: id, k: clone, f: owner, l: setup, d: params, e: dynamicScopesAccessor, }); } function _content_resume( id, template, walks, setup, params, dynamicScopesAccessor, ) { return _resume( id, _content(id, template, walks, setup, params, dynamicScopesAccessor), ); } function _content_closures(renderer, closureFns) { let closureSignals = {}; for (let key in closureFns) closureSignals[key] = _const(+key, closureFns[key]); return (owner, closureValues) => { let instance = renderer(owner); return ( (instance.h = closureSignals), (instance.t = closureValues), instance ); }; } var cloneCache = {}; var curRuntimeId, readyLookup, branchesEnabled, embedEnabled, registeredValues = {}; function enableBranches() { branchesEnabled = 1; } var isResuming, ready = (() => (id) => { (readyLookup[id]?.(), (readyLookup[id] = 1)); })((readyLookup = {})); function initEmbedded(readyId, runtimeId) { ((embedEnabled = 1), ready(readyId), init(runtimeId), new MutationObserver(() => { let renders = self[curRuntimeId]; for (let renderId in renders) { let { s: s, n: n } = renders[renderId]; if (n && !n.isConnected) { delete renders[renderId]; for (let id in s) destroyScope(s[id]); } } }).observe(document.body, { childList: !0, subtree: !0 })); } function init(runtimeId = "M") { if (curRuntimeId) return; curRuntimeId = runtimeId; let resumeRender, renders = self[runtimeId], defineRuntime = (desc) => Object.defineProperty(self, runtimeId, desc), initRuntime = (renders2) => { defineRuntime({ value: (resumeRender = (renderId) => { let $global, lastEffect, visits, resumes, visit, visitText, visitType, visitScope, lastToken, lastTokenIndex, render = (resumeRender[renderId] = renders2[renderId] || renders2(renderId)), walk2 = render.w, scopeLookup = (render.s = {}), getScope = (id) => (scopeLookup[id] ||= { L: +id }), serializeContext = { _: registeredValues }, visitBranches = branchesEnabled && ( ( branchScopesStack = [], branchStarts = [], orphanBranches = [], curBranchScopes, ) => ( branchId, branch, endedBranches, accessor, singleNode, parent = visit.parentNode, startVisit = visit, i = orphanBranches.length, ) => { for ( "[" !== visitType && ((visitScope[nextToken()] = ")" === visitType || "}" === visitType ? parent : visit), (accessor = "A" + lastToken), (singleNode = "]" !== visitType && ")" !== visitType), nextToken()); (branchId = +lastToken); ) { if ( ((endedBranches ||= []).push( (branch = getScope(branchId)), ), setParentBranch(branch, branch.F), (branch.O = render.p?.[branchId]) && (branch.O.m = render.m), singleNode) ) { for ( ; startVisit.previousSibling && ~visits.indexOf( (startVisit = startVisit.previousSibling), ); ); ((branch.K = branch.S = startVisit), "'" === visitType && (branch.a = startVisit)); } else ((curBranchScopes = push(curBranchScopes, branch)), accessor && ((visitScope[accessor] = curBranchScopes), (curBranchScopes = branchScopesStack.pop())), parent !== (startVisit = branchStarts.pop()).parentNode && parent.prepend(startVisit), (branch.S = startVisit), (branch.K = visit.previousSibling === startVisit ? startVisit : parent.insertBefore(new Text(), visit))); for (; i && orphanBranches[--i].L > branchId; ) setParentBranch(orphanBranches.pop(), branch); nextToken(); } (endedBranches && (orphanBranches.push(...endedBranches), singleNode && (visitScope[accessor] = endedBranches.length > 1 ? endedBranches.reverse() : endedBranches[0])), "[" === visitType && (endedBranches || (branchScopesStack.push(curBranchScopes), (curBranchScopes = void 0)), branchStarts.push(visit))); } )(), nextToken = () => (lastToken = visitText.slice( lastTokenIndex, (lastTokenIndex = visitText.indexOf(" ", lastTokenIndex) + 1 || visitText.length + 1) - 1, )), lastScopeId = 0; return ( (render.m = (effects = []) => { if (readyLookup) { for (let readyId in render.b) if (1 !== readyLookup[readyId]) return ( (readyLookup[readyId] = ((prev) => () => { (render.m(), prev?.()); })(readyLookup[readyId])), effects ); render.b = 0; } for (let serialized of (resumes = render.r || [])) if ("string" == typeof serialized) for ( lastTokenIndex = 0, visitText = serialized; nextToken(); ) /\D/.test(lastToken) ? (lastEffect = registeredValues[lastToken]) : effects.push(lastEffect, getScope(lastToken)); else for (let scope of serialized(serializeContext)) $global ? "number" == typeof scope ? (lastScopeId += scope) : ((scopeLookup[(scope.L = ++lastScopeId)] = scope), (scope.$ = $global), branchesEnabled && (scope.F = getScope(scope.G))) : (($global = scope || {}), ($global.runtimeId = runtimeId), ($global.renderId = renderId)); for (visit of (visits = render.v)) ((lastTokenIndex = render.i.length), (visitText = visit.data), (visitType = visitText[lastTokenIndex++]), (visitScope = getScope(nextToken())), "*" === visitType ? (visitScope[nextToken()] = visit.previousSibling) : branchesEnabled && visitBranches()); return ( embedEnabled && (render.n ||= visit?.parentNode.insertBefore( new Text(), visit.nextSibling, )), (visits.length = resumes.length = 0), effects ); }), (render.w = () => { (walk2(), runResumeEffects(render)); }), render ); }), }); }; if (renders) { initRuntime(renders); for (let renderId in renders) runResumeEffects(resumeRender(renderId)); } else defineRuntime({ configurable: !0, set: initRuntime }); } function runResumeEffects(render) { try { ((isResuming = 1), runEffects(render.m(), 1)); } finally { isResuming = 0; } } function _resume(id, obj) { return (registeredValues[id] = obj); } function _var_resume(id, signal) { return (_resume(id, (scope) => (value) => signal(scope, value)), signal); } function _el(id, accessor) { return ( (accessor = decodeAccessor(accessor)), _resume(id, (scope) => () => scope[accessor]) ); } var inputType = "", controllableDelegate = createDelegator(); function _attr_input_checked_default(scope, nodeAccessor, checked) { let el = scope[nodeAccessor], normalizedChecked = normalizeBoolProp(checked); if (el.defaultChecked !== normalizedChecked) { let restoreValue = scope.H ? normalizedChecked : el.checked; ((el.defaultChecked = normalizedChecked), restoreValue !== normalizedChecked && (el.checked = restoreValue)); } } function _attr_input_checked(scope, nodeAccessor, checked, checkedChange) { let el = scope[nodeAccessor], normalizedChecked = normalizeBoolProp(checked); ((scope["E" + nodeAccessor] = checkedChange), (scope["F" + nodeAccessor] = checkedChange ? 0 : 5), checkedChange && !scope.H ? (el.checked = normalizedChecked) : _attr_input_checked_default(scope, nodeAccessor, normalizedChecked)); } function _attr_input_checked_script(scope, nodeAccessor) { let el = scope[nodeAccessor]; syncControllableFormInput(el, hasCheckboxChanged, () => { let checkedChange = scope["E" + nodeAccessor]; if (checkedChange) { let newValue = el.checked; ((el.checked = !newValue), checkedChange(newValue), run()); } }); } function _attr_input_checkedValue_default( scope, nodeAccessor, checkedValue, value, ) { let multiple = Array.isArray(checkedValue), normalizedValue = normalizeStrProp(value), normalizedCheckedValue = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue); (_attr(scope[nodeAccessor], "value", normalizedValue), _attr_input_checked_default( scope, nodeAccessor, multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue, )); } function _attr_input_checkedValue( scope, nodeAccessor, checkedValue, checkedValueChange, value, ) { let el = scope[nodeAccessor], multiple = Array.isArray(checkedValue), normalizedValue = normalizeStrProp(value), normalizedCheckedValue = (scope["G" + nodeAccessor] = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue)); (_attr(el, "value", normalizedValue), (scope["E" + nodeAccessor] = checkedValueChange), (scope["F" + nodeAccessor] = checkedValueChange ? 1 : 5), checkedValueChange && !scope.H ? (el.checked = multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue) : _attr_input_checkedValue_default( scope, nodeAccessor, normalizedCheckedValue, normalizedValue, )); } function _attr_input_checkedValue_script(scope, nodeAccessor) { let el = scope[nodeAccessor]; (isResuming && el.defaultChecked && (scope["G" + nodeAccessor] ? scope["G" + nodeAccessor].push(el.value) : (scope["G" + nodeAccessor] = el.value)), syncControllableFormInput(el, hasCheckboxChanged, () => { let checkedValueChange = scope["E" + nodeAccessor]; if (checkedValueChange) { let oldValue = scope["G" + nodeAccessor], newValue = Array.isArray(oldValue) ? (function (arr, val, push2) { let index = arr.indexOf(val); return ( (push2 ? !~index && [...arr, val] : ~index && arr.slice(0, index).concat(arr.slice(index + 1))) || arr ); })(oldValue, el.value, el.checked) : el.checked ? el.value : void 0; if (el.name && "r" === el.type[0]) for (let radio of el .getRootNode() .querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) radio.form === el.form && (radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value); else el.checked = !el.checked; (checkedValueChange(newValue), run()); } })); } function _attr_input_value_default(scope, nodeAccessor, value) { let el = scope[nodeAccessor], normalizedValue = normalizeStrProp(value); if (el.defaultValue !== normalizedValue) { let restoreValue = scope.H ? normalizedValue : el.value; ((el.defaultValue = normalizedValue), setInputValue(el, restoreValue)); } } function _attr_input_value(scope, nodeAccessor, value, valueChange) { let el = scope[nodeAccessor], normalizedValue = normalizeStrProp(value); ((scope["E" + nodeAccessor] = valueChange), (scope["G" + nodeAccessor] = normalizedValue), (scope["F" + nodeAccessor] = valueChange ? 2 : 5), valueChange && !scope.H ? setInputValue(el, normalizedValue) : _attr_input_value_default(scope, nodeAccessor, normalizedValue)); } function _attr_input_value_script(scope, nodeAccessor) { let el = scope[nodeAccessor]; (isResuming && (scope["G" + nodeAccessor] = el.defaultValue), syncControllableFormInput(el, hasValueChanged, (ev) => { let valueChange = scope["E" + nodeAccessor]; valueChange && ((inputType = ev?.inputType), valueChange(el.value), run(), setInputValue(el, scope["G" + nodeAccessor]), (inputType = "")); })); } function setInputValue(el, value) { if (el.value !== value) { let updatedPosition = (function ( inputType2, initialPosition, initialValue, updatedValue, ) { if ( (initialPosition || 0 === initialPosition) && (initialPosition !== initialValue.length || /kw/.test(inputType2)) ) { let before = initialValue.slice(0, initialPosition), after = initialValue.slice(initialPosition); if (updatedValue.startsWith(before)) return initialPosition; if (updatedValue.endsWith(after)) return updatedValue.length - after.length; { let relevantChars = stripSpacesAndPunctuation(before).length, pos = 0, relevantIndex = 0; for (; relevantIndex < relevantChars; ) (stripSpacesAndPunctuation(updatedValue[pos]) && relevantIndex++, pos++); return pos; } } return -1; })( inputType, el.getRootNode().activeElement === el && el.selectionStart, el.value, (el.value = value), ); ~updatedPosition && el.setSelectionRange(updatedPosition, updatedPosition); } } function _attr_select_value_default(scope, nodeAccessor, value) { let restoreValue, el = scope[nodeAccessor], existing = !scope.H, multiple = Array.isArray(value), normalizedValue = multiple ? value.map(normalizeStrProp) : normalizeStrProp(value); pendingEffects.unshift(() => { for (let opt of el.options) { let selected = multiple ? normalizedValue.includes(opt.value) : opt.value === normalizedValue; opt.defaultSelected !== selected && (existing && (restoreValue ??= getSelectValue(el, multiple)), (opt.defaultSelected = selected)); } void 0 !== restoreValue && setSelectValue(el, restoreValue, multiple); }, scope); } function _attr_select_value(scope, nodeAccessor, value, valueChange) { let el = scope[nodeAccessor], existing = !scope.H, multiple = Array.isArray(value), normalizedValue = (scope["G" + nodeAccessor] = multiple ? value.map(normalizeStrProp) : normalizeStrProp(value)); ((scope["E" + nodeAccessor] = valueChange), (scope["F" + nodeAccessor] = valueChange ? 3 : 5), valueChange && existing ? pendingEffects.unshift( () => setSelectValue(el, normalizedValue, multiple), scope, ) : _attr_select_value_default(scope, nodeAccessor, normalizedValue)); } function _attr_select_value_script(scope, nodeAccessor) { let el = scope[nodeAccessor], onChange = () => { let valueChange = scope["E" + nodeAccessor]; if (valueChange) { let oldValue = scope["G" + nodeAccessor], multiple = Array.isArray(oldValue), newValue = getSelectValue(el, multiple); (setSelectValue(el, oldValue, multiple), valueChange(newValue), run()); } }; if (isResuming) if (el.multiple) { scope["G" + nodeAccessor] = []; for (let opt of el.options) opt.defaultSelected && scope["G" + nodeAccessor].push(opt.value); } else { scope["G" + nodeAccessor] = ""; for (let opt of el.options) if (opt.defaultSelected) { scope["G" + nodeAccessor] = opt.value; break; } } (syncControllableFormInput(el, hasSelectChanged, onChange), new MutationObserver(() => { let value = scope["G" + nodeAccessor]; (Array.isArray(value) ? value.length !== el.selectedOptions.length || value.some((value2, i) => value2 != el.selectedOptions[i].value) : el.value !== value) && onChange(); }).observe(el, { childList: !0, subtree: !0 })); } function setSelectValue(el, value, multiple) { if (multiple) for (let opt of el.options) opt.selected = value.includes(opt.value); else el.value = value; } function getSelectValue(el, multiple) { return multiple ? Array.from(el.selectedOptions, (opt) => opt.value) : el.value; } function _attr_details_or_dialog_open_default(scope, nodeAccessor, open) { scope.H && (scope[nodeAccessor].open = normalizeBoolProp(open)); } function _attr_details_or_dialog_open(scope, nodeAccessor, open, openChange) { let normalizedOpen = (scope["G" + nodeAccessor] = normalizeBoolProp(open)); ((scope["E" + nodeAccessor] = openChange), (scope["F" + nodeAccessor] = openChange ? 4 : 5), openChange && !scope.H ? (scope[nodeAccessor].open = normalizedOpen) : _attr_details_or_dialog_open_default( scope, nodeAccessor, normalizedOpen, )); } function _attr_details_or_dialog_open_script(scope, nodeAccessor) { let el = scope[nodeAccessor]; new MutationObserver(() => { let openChange = scope["E" + nodeAccessor]; if (openChange && el.open === !scope["G" + nodeAccessor]) { let newValue = el.open; ((el.open = !newValue), openChange(newValue), run()); } }).observe(el, { attributes: !0, attributeFilter: ["open"] }); } function syncControllableFormInput(el, hasChanged, onChange) { ((el._ = onChange), controllableDelegate(el, "input", handleChange), el.form && controllableDelegate(el.form, "reset", handleFormReset), isResuming && hasChanged(el) && queueMicrotask(onChange)); } function handleChange(ev) { ev.target._?.(ev); } function handleFormReset(ev) { let handlers = []; for (let el of ev.target.elements) el._ && hasFormElementChanged(el) && handlers.push(el._); requestAnimationFrame(() => { if (!ev.defaultPrevented) for (let change of handlers) change(); }); } function hasValueChanged(el) { return el.value !== el.defaultValue; } function hasCheckboxChanged(el) { return el.checked !== el.defaultChecked; } function hasSelectChanged(el) { for (let opt of el.options) if (opt.selected !== opt.defaultSelected) return !0; } function hasFormElementChanged(el) { return el.options ? hasSelectChanged(el) : hasValueChanged(el) || hasCheckboxChanged(el); } function normalizeStrProp(value) { return normalizeAttrValue(value) || ""; } function normalizeBoolProp(value) { return null != value && !1 !== value; } function _to_text(value) { return value || 0 === value ? value + "" : ""; } function _attr(element, name, value) { setAttribute(element, name, normalizeAttrValue(value)); } function setAttribute(element, name, value) { element.getAttribute(name) != value && (void 0 === value ? element.removeAttribute(name) : element.setAttribute(name, value)); } function _attr_class(element, value) { setAttribute( element, "class", toDelimitedString(value, " ", stringifyClassObject) || void 0, ); } function _attr_class_items(element, items) { for (let key in items) _attr_class_item(element, key, items[key]); } function _attr_class_item(element, name, value) { element.classList.toggle(name, !!value); } function _attr_style(element, value) { setAttribute( element, "style", toDelimitedString(value, ";", stringifyStyleObject) || void 0, ); } function _attr_style_items(element, items) { for (let key in items) _attr_style_item(element, key, items[key]); } function _attr_style_item(element, name, value) { element.style.setProperty(name, _to_text(value)); } function _attr_nonce(scope, nodeAccessor) { _attr(scope[nodeAccessor], "nonce", scope.$.cspNonce); } function _text(node, value) { let normalizedValue = normalizeString(value); node.data !== normalizedValue && (node.data = normalizedValue); } function _text_content(node, value) { let normalizedValue = normalizeString(value); node.textContent !== normalizedValue && (node.textContent = normalizedValue); } function _attrs(scope, nodeAccessor, nextAttrs) { let el = scope[nodeAccessor]; for (let i = el.attributes.length; i--; ) { let { name: name } = el.attributes.item(i); (nextAttrs && (name in nextAttrs || hasAttrAlias(el, name, nextAttrs))) || el.removeAttribute(name); } attrsInternal(scope, nodeAccessor, nextAttrs); } function _attrs_content(scope, nodeAccessor, nextAttrs) { (_attrs(scope, nodeAccessor, nextAttrs), _attr_content(scope, nodeAccessor, nextAttrs?.content)); } function hasAttrAlias(element, attr, nextAttrs) { return ( "checked" === attr && "INPUT" === element.tagName && "checkedValue" in nextAttrs ); } function _attrs_partial(scope, nodeAccessor, nextAttrs, skip) { let el = scope[nodeAccessor], partial = {}; for (let i = el.attributes.length; i--; ) { let { name: name } = el.attributes.item(i); !skip[name] && (!nextAttrs || !(name in nextAttrs)) && el.removeAttribute(name); } for (let name in nextAttrs) { let key = isEventHandler(name) ? `on-${getEventHandlerName(name)}` : name; skip[key] || (partial[key] = nextAttrs[name]); } attrsInternal(scope, nodeAccessor, partial); } function _attrs_partial_content(scope, nodeAccessor, nextAttrs, skip) { (_attrs_partial(scope, nodeAccessor, nextAttrs, skip), _attr_content(scope, nodeAccessor, nextAttrs?.content)); } function attrsInternal(scope, nodeAccessor, nextAttrs) { let events, skip, el = scope[nodeAccessor]; switch (el.tagName) { case "INPUT": if ("checked" in nextAttrs || "checkedChange" in nextAttrs) _attr_input_checked( scope, nodeAccessor, nextAttrs.checked, nextAttrs.checkedChange, ); else if ("checkedValue" in nextAttrs || "checkedValueChange" in nextAttrs) _attr_input_checkedValue( scope, nodeAccessor, nextAttrs.checkedValue, nextAttrs.checkedValueChange, nextAttrs.value, ); else { if (!("value" in nextAttrs) && !("valueChange" in nextAttrs)) break; _attr_input_value( scope, nodeAccessor, nextAttrs.value, nextAttrs.valueChange, ); } skip = /^(?:value|checked(?:Value)?)(?:Change)?$/; break; case "SELECT": ("value" in nextAttrs || "valueChange" in nextAttrs) && (_attr_select_value( scope, nodeAccessor, nextAttrs.value, nextAttrs.valueChange, ), (skip = /^value(?:Change)?$/)); break; case "TEXTAREA": ("value" in nextAttrs || "valueChange" in nextAttrs) && (_attr_input_value( scope, nodeAccessor, nextAttrs.value, nextAttrs.valueChange, ), (skip = /^value(?:Change)?$/)); break; case "DETAILS": case "DIALOG": ("open" in nextAttrs || "openChange" in nextAttrs) && (_attr_details_or_dialog_open( scope, nodeAccessor, nextAttrs.open, nextAttrs.openChange, ), (skip = /^open(?:Change)?$/)); } for (let name in nextAttrs) { let value = nextAttrs[name]; switch (name) { case "class": _attr_class(el, value); break; case "style": _attr_style(el, value); break; default: isEventHandler(name) ? ((events ||= scope["I" + nodeAccessor] = {})[ getEventHandlerName(name) ] = value) : skip?.test(name) || ("content" === name && "META" !== el.tagName) || _attr(el, name, value); } } } function _attr_content(scope, nodeAccessor, value) { let content = (function (value) { let renderer = normalizeDynamicRenderer(value); if (renderer && renderer.g) return renderer; })(value); scope["D" + nodeAccessor] !== (scope["D" + nodeAccessor] = content?.g) && (setConditionalRenderer(scope, nodeAccessor, content, createAndSetupBranch), content?.e && subscribeToScopeSet(content.f, content.e, scope["A" + nodeAccessor])); for (let accessor in content?.h) content.h[accessor](scope["A" + nodeAccessor], content.t[accessor]); } function _attrs_script(scope, nodeAccessor) { let el = scope[nodeAccessor], events = scope["I" + nodeAccessor]; switch (scope["F" + nodeAccessor]) { case 0: _attr_input_checked_script(scope, nodeAccessor); break; case 1: _attr_input_checkedValue_script(scope, nodeAccessor); break; case 2: _attr_input_value_script(scope, nodeAccessor); break; case 3: _attr_select_value_script(scope, nodeAccessor); break; case 4: _attr_details_or_dialog_open_script(scope, nodeAccessor); } for (let name in events) _on(el, name, events[name]); } function _html(scope, value, accessor) { let firstChild = scope[accessor], parentNode = firstChild.parentNode, lastChild = scope["H" + accessor] || firstChild, newContent = parseHTML(_to_text(value), parentNode.namespaceURI); (insertChildNodes( parentNode, firstChild, (scope[accessor] = newContent.firstChild || newContent.appendChild(new Text())), (scope["H" + accessor] = newContent.lastChild), ), removeChildNodes(firstChild, lastChild)); } function normalizeAttrValue(value) { if (value || 0 === value) return !0 === value ? "" : value + ""; } function normalizeString(value) { return value || 0 === value ? value + "" : "‍"; } function _lifecycle(scope, thisObj, index = 0) { let accessor = "K" + index, instance = scope[accessor]; instance ? (Object.assign(instance, thisObj), instance.onUpdate?.()) : ((scope[accessor] = thisObj), thisObj.onMount?.(), ($signal(scope, accessor).onabort = () => thisObj.onDestroy?.())); } function removeChildNodes(startNode, endNode) { let stop = endNode.nextSibling, current = startNode; for (; current !== stop; ) { let next = current.nextSibling; (current.remove(), (current = next)); } } function insertChildNodes(parentNode, referenceNode, startNode, endNode) { parentNode.insertBefore(toInsertNode(startNode, endNode), referenceNode); } function toInsertNode(startNode, endNode) { if (startNode === endNode) return startNode; let parent = new DocumentFragment(), stop = endNode.nextSibling, current = startNode; for (; current !== stop; ) { let next = current.nextSibling; (parent.appendChild(current), (current = next)); } return parent; } function _await_promise(nodeAccessor, params) { let promiseAccessor = "L" + (nodeAccessor = decodeAccessor(nodeAccessor)), branchAccessor = "A" + nodeAccessor; return ( _enable_catch(), (scope, promise) => { let awaitBranch = scope[branchAccessor], tryBranch = findBranchWithKey(scope, "Q") || awaitBranch, awaitCounter = tryBranch.O; (awaitCounter?.i || (awaitCounter = tryBranch.O = { i: 0, c() { if (--awaitCounter.i) return 1; if (tryBranch === scope[branchAccessor]) scope[nodeAccessor].parentNode && scope[nodeAccessor].replaceWith( scope[branchAccessor].S.parentNode, ); else { let placeholderBranch = tryBranch.P; placeholderBranch && ((tryBranch.P = 0), placeholderBranch.S.parentNode.insertBefore( tryBranch.S.parentNode, placeholderBranch.S, ), removeAndDestroyBranch(placeholderBranch)); } queueEffect(tryBranch, (scope2) => { let pendingEffects2 = scope2.J; pendingEffects2 && ((scope2.J = []), runEffects(pendingEffects2, 1)); }); }, }), placeholderShown.add(pendingEffects), scope[promiseAccessor] || (awaitBranch && (awaitBranch.W ||= []), awaitCounter.i++ || requestAnimationFrame( () => awaitCounter.i && runEffects( prepareEffects(() => queueRender( tryBranch === awaitBranch ? scope : tryBranch, () => { tryBranch.Q ? (insertBranchBefore( (tryBranch.P = createAndSetupBranch( scope.$, tryBranch.Q, tryBranch._, tryBranch.S.parentNode, )), tryBranch.S.parentNode, tryBranch.S, ), tempDetachBranch(tryBranch)) : awaitBranch.V || (awaitBranch.S.parentNode.insertBefore( scope[nodeAccessor], awaitBranch.S, ), tempDetachBranch(tryBranch)); }, -1, ), ), ), ))); let thisPromise = (scope[promiseAccessor] = promise.then( (data) => { if (thisPromise === scope[promiseAccessor]) { let referenceNode = scope[nodeAccessor]; ((scope[promiseAccessor] = 0), queueMicrotask(run), queueRender( scope, () => { ((awaitBranch = scope[branchAccessor]).V && (pendingScopes.push(awaitBranch), setupBranch(awaitBranch.V, awaitBranch), (awaitBranch.V = 0), insertBranchBefore( awaitBranch, scope[nodeAccessor].parentNode, scope[nodeAccessor], ), referenceNode.remove()), params?.(awaitBranch, [data])); let pendingRenders2 = awaitBranch.W; if ( ((awaitBranch.W = 0), pendingRenders2?.forEach(queuePendingRender), placeholderShown.add(pendingEffects), awaitCounter.c(), awaitCounter.m) ) { let fnScopes = new Map(), effects = awaitCounter.m(); for (let i = 0; i < pendingEffects.length; ) { let fn = pendingEffects[i++], scopes = fnScopes.get(fn); (scopes || fnScopes.set(fn, (scopes = new Set())), scopes.add(pendingEffects[i++])); } for (let i = 0; i < effects.length; ) { let fn = effects[i++], scope2 = effects[i++]; fnScopes.get(fn)?.has(scope2) || queueEffect(scope2, fn); } } }, -1, )); } }, (error) => { thisPromise === scope[promiseAccessor] && ((awaitCounter.i = scope[promiseAccessor] = 0), schedule(), queueRender(scope, renderCatch, -1, error)); }, )); } ); } function _await_content(nodeAccessor, template, walks, setup) { let branchAccessor = "A" + (nodeAccessor = decodeAccessor(nodeAccessor)), renderer = _content("", template, walks, setup)(); return (scope) => { (((scope[branchAccessor] = createBranch( scope.$, renderer, scope, scope[nodeAccessor].parentNode, )).V = renderer), pendingScopes.pop()); }; } function _try(nodeAccessor, template, walks, setup) { let branchAccessor = "A" + (nodeAccessor = decodeAccessor(nodeAccessor)), renderer = _content("", template, walks, setup)(); return (scope, input) => { scope[branchAccessor] || setConditionalRenderer( scope, nodeAccessor, renderer, createAndSetupBranch, ); let branch = scope[branchAccessor]; branch && ((branch.C = nodeAccessor), (branch.E = normalizeDynamicRenderer(input.catch)), (branch.Q = normalizeDynamicRenderer(input.placeholder))); }; } function renderCatch(scope, error) { let tryWithCatch = findBranchWithKey(scope, "E"); if (!tryWithCatch) throw error; { let owner = tryWithCatch._, placeholderBranch = tryWithCatch.P; (placeholderBranch && (tryWithCatch.O && (tryWithCatch.O.i = 0), (owner["A" + tryWithCatch.C] = placeholderBranch), destroyBranch(tryWithCatch)), caughtError.add(pendingEffects), setConditionalRenderer( owner, tryWithCatch.C, tryWithCatch.E, createAndSetupBranch, ), tryWithCatch.E.d?.(owner["A" + tryWithCatch.C], [error])); } } function _if(nodeAccessor, ...branchesArgs) { let branchAccessor = "D" + (nodeAccessor = decodeAccessor(nodeAccessor)), branches = [], i = 0; for (; i < branchesArgs.length; ) branches.push( _content("", branchesArgs[i++], branchesArgs[i++], branchesArgs[i++])(), ); return ( enableBranches(), (scope, newBranch) => { newBranch !== scope[branchAccessor] && setConditionalRenderer( scope, nodeAccessor, branches[(scope[branchAccessor] = newBranch)], createAndSetupBranch, ); } ); } var _dynamic_tag = function (nodeAccessor, getContent, getTagVar, inputIsArgs) { let childScopeAccessor = "A" + (nodeAccessor = decodeAccessor(nodeAccessor)), rendererAccessor = "D" + nodeAccessor; return ( enableBranches(), (scope, newRenderer, getInput) => { let normalizedRenderer = normalizeDynamicRenderer(newRenderer); if ( scope[rendererAccessor] !== (scope[rendererAccessor] = normalizedRenderer?.g || normalizedRenderer) || (getContent && !normalizedRenderer && !scope[childScopeAccessor]) ) if ( (setConditionalRenderer( scope, nodeAccessor, normalizedRenderer || (getContent ? getContent(scope) : void 0), createBranchWithTagNameOrRenderer, ), getTagVar && (scope[childScopeAccessor].T = (value) => getTagVar()(scope, value)), "string" == typeof normalizedRenderer) ) { if (getContent) { let content = getContent(scope); (setConditionalRenderer( scope[childScopeAccessor], "a", content, createAndSetupBranch, ), content.e && subscribeToScopeSet( content.f, content.e, scope[childScopeAccessor].Aa, )); } } else normalizedRenderer?.e && subscribeToScopeSet( normalizedRenderer.f, normalizedRenderer.e, scope[childScopeAccessor], ); if (normalizedRenderer) { let childScope = scope[childScopeAccessor], args = getInput?.(); if ("string" == typeof normalizedRenderer) ((getContent ? _attrs : _attrs_content)( childScope, "a", (inputIsArgs ? args[0] : args) || {}, ), (childScope.Ia || childScope.Ea) && queueEffect(childScope, dynamicTagScript)); else { for (let accessor in normalizedRenderer.h) normalizedRenderer.h[accessor]( childScope, normalizedRenderer.t[accessor], ); if (normalizedRenderer.d) if (inputIsArgs) normalizedRenderer.d( childScope, normalizedRenderer._ ? args[0] : args, ); else { let inputWithContent = getContent ? { ...args, content: getContent(scope) } : args || {}; normalizedRenderer.d( childScope, normalizedRenderer._ ? inputWithContent : [inputWithContent], ); } } } } ); }; function _resume_dynamic_tag() { _resume("d", dynamicTagScript); } function dynamicTagScript(branch) { _attrs_script(branch, "a"); } function setConditionalRenderer( scope, nodeAccessor, newRenderer, createBranch2, ) { let referenceNode = scope[nodeAccessor], prevBranch = scope["A" + nodeAccessor], parentNode = referenceNode.nodeType > 1 ? (prevBranch?.S || referenceNode).parentNode : referenceNode, newBranch = (scope["A" + nodeAccessor] = newRenderer && createBranch2(scope.$, newRenderer, scope, parentNode)); referenceNode === parentNode ? (prevBranch && (destroyBranch(prevBranch), (referenceNode.textContent = "")), newBranch && insertBranchBefore(newBranch, parentNode, null)) : prevBranch ? (newBranch ? insertBranchBefore(newBranch, parentNode, prevBranch.S) : parentNode.insertBefore(referenceNode, prevBranch.S), removeAndDestroyBranch(prevBranch)) : newBranch && (insertBranchBefore(newBranch, parentNode, referenceNode), referenceNode.remove()); } var _for_of = loop(([all, by = bySecondArg], cb) => { forOf( all, "string" == typeof by ? (item, i) => cb(item[by], [item, i]) : (item, i) => cb(by(item, i), [item, i]), ); }), _for_in = loop(([obj, by = byFirstArg], cb) => forIn(obj, (key, value) => cb(by(key, value), [key, value])), ), _for_to = loop(([to, from, step, by = byFirstArg], cb) => forTo(to, from, step, (v) => cb(by(v), [v])), ), _for_until = loop(([until, from, step, by = byFirstArg], cb) => forUntil(until, from, step, (v) => cb(by(v), [v])), ); function loop(forEach) { return (nodeAccessor, template, walks, setup, params) => { let scopesAccessor = "A" + (nodeAccessor = decodeAccessor(nodeAccessor)), renderer = _content("", template, walks, setup)(); return ( enableBranches(), (scope, value) => { let oldScopesByKey, hasPotentialMoves, referenceNode = scope[nodeAccessor], oldScopes = toArray(scope[scopesAccessor]), newScopes = (scope[scopesAccessor] = []), oldLen = oldScopes.length, parentNode = referenceNode.nodeType > 1 ? referenceNode.parentNode || oldScopes[0]?.S.parentNode : referenceNode; forEach(value, (key, args) => { let branch = oldLen && (oldScopesByKey ||= oldScopes.reduce( (map, scope2, i) => map.set(scope2.M ?? i, scope2), new Map(), )).get(key); (branch ? (hasPotentialMoves = oldScopesByKey.delete(key)) : (branch = createAndSetupBranch( scope.$, renderer, scope, parentNode, )), (branch.M = key), newScopes.push(branch), params?.(branch, args)); }); let newLen = newScopes.length, hasSiblings = referenceNode !== parentNode, afterReference = null, oldEnd = oldLen - 1, newEnd = newLen - 1, start = 0; if ( (hasSiblings && (oldLen ? ((afterReference = oldScopes[oldEnd].K.nextSibling), newLen || parentNode.insertBefore(referenceNode, afterReference)) : newLen && ((afterReference = referenceNode.nextSibling), referenceNode.remove())), !hasPotentialMoves) ) { oldLen && (oldScopes.forEach( hasSiblings ? removeAndDestroyBranch : destroyBranch, ), hasSiblings || (parentNode.textContent = "")); for (let newScope of newScopes) insertBranchBefore(newScope, parentNode, afterReference); return; } for (let branch of oldScopesByKey.values()) removeAndDestroyBranch(branch); for ( ; start < oldLen && start < newLen && oldScopes[start] === newScopes[start]; ) start++; for ( ; oldEnd >= start && newEnd >= start && oldScopes[oldEnd] === newScopes[newEnd]; ) (oldEnd--, newEnd--); if ( (oldEnd + 1 < oldLen && (afterReference = oldScopes[oldEnd + 1].S), start > oldEnd) ) { if (start <= newEnd) for (let i = start; i <= newEnd; i++) insertBranchBefore(newScopes[i], parentNode, afterReference); return; } if (start > newEnd) return; let lo, hi, mid, diffLen = newEnd - start + 1, oldPos = new Map(), sources = new Array(diffLen), pred = new Array(diffLen), tails = [], tail = -1; for (let i = start; i <= oldEnd; i++) oldPos.set(oldScopes[i], i); for (let i = diffLen; i--; ) sources[i] = oldPos.get(newScopes[start + i]) ?? -1; for (let i = 0; i < diffLen; i++) if (~sources[i]) if (tail < 0 || sources[tails[tail]] < sources[i]) (~tail && (pred[i] = tails[tail]), (tails[++tail] = i)); else { for (lo = 0, hi = tail; lo < hi; ) ((mid = ((lo + hi) / 2) | 0), sources[tails[mid]] < sources[i] ? (lo = mid + 1) : (hi = mid)); sources[i] < sources[tails[lo]] && (lo > 0 && (pred[i] = tails[lo - 1]), (tails[lo] = i)); } for (hi = tails[tail], lo = tail + 1; lo-- > 0; ) ((tails[lo] = hi), (hi = pred[hi])); for (let i = diffLen; i--; ) (~tail && i === tails[tail] ? tail-- : insertBranchBefore( newScopes[start + i], parentNode, afterReference, ), (afterReference = newScopes[start + i].S)); } ); }; } function createBranchWithTagNameOrRenderer( $global, tagNameOrRenderer, parentScope, parentNode, ) { let branch = createBranch( $global, tagNameOrRenderer, parentScope, parentNode, ); return ( "string" == typeof tagNameOrRenderer ? (branch.a = branch.S = branch.K = document.createElementNS( "svg" === tagNameOrRenderer ? "http://www.w3.org/2000/svg" : "math" === tagNameOrRenderer ? "http://www.w3.org/1998/Math/MathML" : parentNode.namespaceURI, tagNameOrRenderer, )) : setupBranch(tagNameOrRenderer, branch), branch ); } function bySecondArg(_item, index) { return index; } function byFirstArg(name) { return name; } var asyncRendersLookup, rendering, pendingRenders = [], pendingRendersLookup = new Map(), caughtError = new WeakSet(), placeholderShown = new WeakSet(), pendingEffects = [], pendingScopes = [], scopeKeyOffset = 1e3; function queueRender(scope, signal, signalKey, value, scopeKey = scope.L) { let key = scopeKey * scopeKeyOffset + signalKey, render = signalKey >= 0 && pendingRendersLookup.get(key); render ? (render.u = value) : (queuePendingRender((render = { a: key, j: scope, y: signal, u: value })), signalKey >= 0 && pendingRendersLookup.set(key, render)); } function queuePendingRender(render) { let i = pendingRenders.push(render) - 1; for (; i; ) { let parentIndex = (i - 1) >> 1, parent = pendingRenders[parentIndex]; if (render.a - parent.a >= 0) break; ((pendingRenders[i] = parent), (i = parentIndex)); } pendingRenders[i] = render; } function queueEffect(scope, fn) { pendingEffects.push(fn, scope); } function run() { let effects = pendingEffects; asyncRendersLookup = new Map(); try { ((rendering = 1), runRenders()); } finally { ((pendingRendersLookup = asyncRendersLookup), (asyncRendersLookup = rendering = 0), (pendingRenders = []), (pendingEffects = [])); } runEffects(effects); } function prepareEffects(fn) { let prevRenders = pendingRenders, prevEffects = pendingEffects, prevLookup = asyncRendersLookup, preparedEffects = (pendingEffects = []); ((pendingRenders = []), (asyncRendersLookup = pendingRendersLookup), (pendingRendersLookup = new Map())); try { ((rendering = 1), fn(), runRenders()); } finally { ((rendering = 0), (pendingRendersLookup = asyncRendersLookup), (asyncRendersLookup = prevLookup), (pendingRenders = prevRenders), (pendingEffects = prevEffects)); } return preparedEffects; } var runEffects = (effects) => { for (let i = 0; i < effects.length; ) effects[i++](effects[i++]); }; function runRenders() { for (; pendingRenders.length; ) { let render = pendingRenders[0], item = pendingRenders.pop(); if (render !== item) { let i = 0, mid = pendingRenders.length >> 1, key = (pendingRenders[0] = item).a; for (; i < mid; ) { let bestChild = 1 + (i << 1), right = bestChild + 1; if ( (right < pendingRenders.length && pendingRenders[right].a - pendingRenders[bestChild].a < 0 && (bestChild = right), pendingRenders[bestChild].a - key >= 0) ) break; ((pendingRenders[i] = pendingRenders[bestChild]), (i = bestChild)); } pendingRenders[i] = item; } render.j.F?.I || runRender(render); } for (let scope of pendingScopes) scope.H = 0; pendingScopes = []; } var runRender = (render) => render.y(render.j, render.u), _enable_catch = () => { ((_enable_catch = () => {}), enableBranches()); let handlePendingTry = (fn, scope, branch) => { for (; branch; ) { if (branch.O?.i) return (branch.J ||= []).push(fn, scope); branch = branch.N; } }; ((runEffects = ( (runEffects2) => (effects, checkPending = placeholderShown.has(effects)) => { if (checkPending || caughtError.has(effects)) { let fn, scope, branch, i = 0; for (; i < effects.length; ) ((fn = effects[i++]), (scope = effects[i++]), (branch = scope.F), !branch?.I && (!checkPending || !handlePendingTry(fn, scope, branch)) && fn(scope)); } else runEffects2(effects); } )(runEffects)), (runRender = ((runRender2) => (render) => { try { let branch = render.j.F; for (; branch; ) { if (branch.W) return ( asyncRendersLookup.set(render.a, render), branch.W.push(render) ); branch = branch.N; } runRender2(render); } catch (error) { renderCatch(render.j, error); } })(runRender))); }; function $signalReset(scope, id) { let ctrl = scope.A?.[id]; ctrl && (queueEffect(ctrl, abort), (scope.A[id] = void 0)); } function $signal(scope, id) { return ( scope.F && (scope.F.B ||= new Set()).add(scope), ((scope.A ||= {})[id] ||= new AbortController()).signal ); } function abort(ctrl) { ctrl.abort(); } var classIdToBranch = new Map(), compat = { patchDynamicTag: function (fn) { _dynamic_tag = fn(_dynamic_tag); }, queueEffect: queueEffect, init(warp10Noop) { (_resume("$C_s", (branch) => { classIdToBranch.set(branch.m5c, branch); }), _resume("$C_b", warp10Noop)); }, registerRenderer(fn) { _resume("$C_r", fn); }, isRenderer: (renderer) => renderer.k, getStartNode: (branch) => branch.S, setScopeNodes(branch, startNode, endNode) { ((branch.S = startNode), (branch.K = endNode)); }, runComponentEffects() { this.effects && runEffects(this.effects); }, runComponentDestroy() { this.scope && destroyBranch(this.scope); }, resolveRegistered: (value, $global) => Array.isArray(value) && "string" == typeof value[0] ? (function (id, scope) { let val = registeredValues[id]; return scope ? val(scope) : val; })( value[0], 2 === value.length && self[$global.runtimeId]?.[$global.renderId]?.s[value[1]], ) : value, createRenderer(params, clone) { let renderer = _content("", 0, 0, 0, params)(); return ( (renderer.k = (branch) => { let cloned = clone(); ((branch.S = cloned.startNode), (branch.K = cloned.endNode)); }), renderer ); }, render(out, component, renderer, args) { let branch = component.scope, created = 0; if ( (!branch && (branch = classIdToBranch.get(component.id)) && ((component.scope = branch), classIdToBranch.delete(component.id)), "object" == typeof args[0] && "renderBody" in args[0]) ) { let input = args[0], normalizedInput = (args[0] = {}); for (let key in input) normalizedInput["renderBody" === key ? "content" : key] = input[key]; } if ( ((component.effects = prepareEffects(() => { (branch || ((created = 1), (branch = component.scope = createAndSetupBranch( out.global, renderer, renderer.f, document.body, ))), renderer.d?.(branch, renderer._ ? args[0] : args)); })), created) ) return toInsertNode(branch.S, branch.K); }, }, _template = (id, template, walks, setup, inputSignal) => { let renderer = _content(id, template, walks, setup, inputSignal)(); return ( (renderer.mount = mount), (renderer._ = renderer), _resume(id, renderer) ); }; function mount(input = {}, reference, position) { let branch, parentNode = reference, nextSibling = null, { $global: $global } = input; switch ( ($global ? (({ $global: $global, ...input } = input), ($global = { runtimeId: "M", renderId: "_", ...$global })) : ($global = { runtimeId: "M", renderId: "_" }), position) ) { case "beforebegin": ((parentNode = reference.parentNode), (nextSibling = reference)); break; case "afterbegin": nextSibling = reference.firstChild; break; case "afterend": ((parentNode = reference.parentNode), (nextSibling = reference.nextSibling)); } let curValue, args = this.d, effects = prepareEffects(() => { ((branch = createBranch($global, this, void 0, parentNode)), (branch.T = (newValue) => { curValue = newValue; }), this.l?.(branch), args?.(branch, input)); }); return ( insertChildNodes(parentNode, nextSibling, branch.S, branch.K), runEffects(effects), { get value() { return curValue; }, set value(newValue) { _var_change(branch, newValue); }, update(newInput) { args && runEffects( prepareEffects(() => { args(branch, newInput); }), ); }, destroy() { removeAndDestroyBranch(branch); }, } ); } ================================================ FILE: .sizes/name-cache.json ================================================ {"vars":{"props":{"$empty":"e","$rest":"t","$attrTag":"n","$attrTags":"r","$attrTagIterator":"o","$_assert_hoist":"i","$_assert_init":"l","$forIn":"u","$forOf":"f","$forTo":"a","$forUntil":"c","$_call":"s","$stringifyClassObject":"d","$stringifyStyleObject":"p","$toDelimitedString":"h","$isEventHandler":"g","$getEventHandlerName":"v","$normalizeDynamicRenderer":"m","$decodeAccessor":"b","$toArray":"y","$push":"S","$defaultDelegator":"A","$_on":"_","$createDelegator":"k","$handleDelegated":"C","$stripSpacesAndPunctuation":"N","$parsers":"w","$parseHTML":"E","$isScheduled":"x","$channel":"M","$nextScopeId":"I","$createScope":"F","$skipScope":"$","$findBranchWithKey":"T","$destroyBranch":"L","$destroyScope":"G","$destroyNestedScopes":"H","$resetControllers":"O","$removeAndDestroyBranch":"D","$insertBranchBefore":"K","$tempDetachBranch":"V","$schedule":"R","$flushAndWaitFrame":"B","$triggerMacroTask":"W","$_let":"q","$_const":"U","$_or":"j","$_for_closure":"P","$_if_closure":"Q","$subscribeToScopeSet":"J","$_closure":"X","$_closure_get":"Z","$_child_setup":"z","$_var":"Y","$_return":"ee","$_return_change":"te","$_var_change":"ne","$tagIdsByGlobal":"re","$_id":"oe","$_script":"ie","$_el_read":"le","$traverse":"ue","$_hoist":"fe","$_hoist_resume":"ae","$walker":"ce","$walk":"se","$walkInternal":"de","$createBranch":"pe","$setParentBranch":"he","$createAndSetupBranch":"ge","$setupBranch":"ve","$_content":"me","$_content_resume":"be","$_content_closures":"ye","$curRuntimeId":"Se","$readyLookup":"Ae","$branchesEnabled":"_e","$embedEnabled":"ke","$cloneCache":"Ce","$registeredValues":"Ne","$enableBranches":"we","$isResuming":"Ee","$ready":"xe","$initEmbedded":"Me","$init":"Ie","$runResumeEffects":"Fe","$_resume":"$e","$_var_resume":"Te","$_el":"Le","$inputType":"Ge","$controllableDelegate":"He","$_attr_input_checked_default":"Oe","$_attr_input_checked":"De","$_attr_input_checked_script":"Ke","$_attr_input_checkedValue_default":"Ve","$_attr_input_checkedValue":"Re","$_attr_input_checkedValue_script":"Be","$_attr_input_value_default":"We","$_attr_input_value":"qe","$_attr_input_value_script":"Ue","$setInputValue":"je","$_attr_select_value_default":"Pe","$_attr_select_value":"Qe","$_attr_select_value_script":"Je","$setSelectValue":"Xe","$getSelectValue":"Ze","$_attr_details_or_dialog_open_default":"ze","$_attr_details_or_dialog_open":"Ye","$_attr_details_or_dialog_open_script":"et","$syncControllableFormInput":"tt","$handleChange":"nt","$handleFormReset":"rt","$hasValueChanged":"ot","$hasCheckboxChanged":"it","$hasSelectChanged":"lt","$hasFormElementChanged":"ut","$normalizeStrProp":"ft","$normalizeBoolProp":"at","$_to_text":"ct","$_attr":"st","$setAttribute":"dt","$_attr_class":"pt","$_attr_class_items":"ht","$_attr_class_item":"gt","$_attr_style":"vt","$_attr_style_items":"mt","$_attr_style_item":"bt","$_attr_nonce":"yt","$_text":"St","$_text_content":"At","$_attrs":"_t","$_attrs_content":"kt","$hasAttrAlias":"Ct","$_attrs_partial":"Nt","$_attrs_partial_content":"wt","$attrsInternal":"Et","$_attr_content":"xt","$_attrs_script":"Mt","$_html":"It","$normalizeAttrValue":"Ft","$normalizeString":"$t","$_lifecycle":"Tt","$removeChildNodes":"Lt","$insertChildNodes":"Gt","$toInsertNode":"Ht","$_await_promise":"Ot","$_await_content":"Dt","$_try":"Kt","$renderCatch":"Vt","$_if":"Rt","$_dynamic_tag":"Bt","$_resume_dynamic_tag":"Wt","$dynamicTagScript":"qt","$setConditionalRenderer":"Ut","$_for_of":"jt","$_for_in":"Pt","$_for_to":"Qt","$_for_until":"Jt","$loop":"Xt","$createBranchWithTagNameOrRenderer":"Zt","$bySecondArg":"zt","$byFirstArg":"Yt","$asyncRendersLookup":"en","$rendering":"tn","$pendingRenders":"nn","$pendingRendersLookup":"rn","$caughtError":"on","$placeholderShown":"ln","$pendingEffects":"un","$pendingScopes":"fn","$scopeKeyOffset":"an","$queueRender":"cn","$queuePendingRender":"sn","$queueEffect":"dn","$run":"pn","$prepareEffects":"hn","$runEffects":"gn","$runRenders":"vn","$runRender":"mn","$_enable_catch":"bn","$$signalReset":"yn","$$signal":"Sn","$abort":"An","$classIdToBranch":"_n","$compat":"kn","$_template":"Cn","$mount":"Nn","$$clickCount__script":"Bn","$$clickCount":"Dn","$$setup":"jn","$forEach":"xn","$$if_content__comment_comments":"aa","$$if_content__setup":"sa","$$if_content__id":"ta","$$for_content__id":"na","$$for_content__input_path":"ia","$$for_content__open__script":"la","$$for_content__open":"ma","$$for_content__setup":"ca","$$for_content__if":"oa","$$for_content__comment_comments":"ua","$$for_content__$params":"ba","$$for_content__comment":"ea","$$for":"_a","$$input_comments$1":"da","$$input_path$1":"fa"}}} ================================================ FILE: .sizes.json ================================================ { "examples": { "counter": "./packages/runtime-tags/src/__tests__/fixtures/basic-counter/template.marko", "comments": "./packages/runtime-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/template.marko" }, "results": [ { "name": "*", "total": { "min": 21238, "brotli": 7981 } }, { "name": "counter", "user": { "min": 173, "brotli": 148 }, "runtime": { "min": 4079, "brotli": 1829 }, "total": { "min": 4252, "brotli": 1977 } }, { "name": "counter 💧", "user": { "min": 96, "brotli": 100 }, "runtime": { "min": 2301, "brotli": 1220 }, "total": { "min": 2397, "brotli": 1320 } }, { "name": "comments", "user": { "min": 694, "brotli": 380 }, "runtime": { "min": 6509, "brotli": 2855 }, "total": { "min": 7203, "brotli": 3235 } }, { "name": "comments 💧", "user": { "min": 130, "brotli": 110 }, "runtime": { "min": 2453, "brotli": 1257 }, "total": { "min": 2583, "brotli": 1367 } } ] } ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright 2024 eBay Inc. and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability Please report security issues **privately** using GitHub’s **Report a vulnerability** form on this repository (Security tab). **Do not** file public GitHub issues for security problems. When reporting, please include: - Affected project/repo and version(s) - Impact and component(s) involved - Reproduction steps or PoC (if available) - Your contact and preferred credit name If you do not receive an acknowledgement of your report within **6 business days**, or if you cannot find a private security contact for the project, you may **escalate to the OpenJS Foundation CNA** at `security@lists.openjsf.org`. If the project acknowledges your report but does not provide any further response or engagement within **14 days**, escalation is also appropriate. ## Coordination & Disclosure We follow coordinated vulnerability disclosure: - We will acknowledge your report, assess impact, and work on a fix. - We aim to provide status updates at reasonable intervals until resolution. - We will publish a security advisory (and **CVE via the OpenJS CNA when applicable**) once a fix or mitigation is available. We credit reporters by default unless you request otherwise. ================================================ FILE: babel.config.js ================================================ module.exports = (api) => ({ retainLines: true, presets: [ [ "@babel/env", { loose: true, targets: { node: "20", }, }, ], ], overrides: [ { test: "./packages/runtime-class/src/**/*", plugins: api.env("production") ? [ ["babel-plugin-minprops", { matchPrefix: "___", context: "marko" }], "./scripts/babel-plugin-marko-debug", ] : [], }, ], }); ================================================ FILE: cspell.json ================================================ { "version": "0.2", "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/master/cspell.schema.json", "words": [ "marko", "markoc", "markojs", "taglib", "Taglib", "TAGLIB", "taglibs", "Taglibs", "htmljs", "HTMLJS", "vdom", "Vdom", "VDOM", "vnode", "vnodes", "codegen", "morphdom", "renderbody", "tagname", "quasis", "nodetype", "runtimeid", "inlines", "webpacks", "minprops", "diffable", "Diffable", "autotest", "devmode", "styl", "descs", "deopt", "deopts", "browserslist", "codemod", "keygen", "luxass", "Piercey", "mlrawlings", "rturnq", "feross", "juliangruber", "Greenkeeper", "whatwg", "npmjs", "iojs", "ebayui", "userland", "sourcemapping", "treeshaken", "prebundling", "subcomponents", "unkeyed", "Autokeyed", "autokeys", "falsey", "falseish", "destructures", "reorderer", "Reorderer", "renderable", "Renderable", "interactable", "downstreams", "Downstreams", "downtranspiles", "autoloading", "autodiscover", "autodiscovers", "expando", "weakmaps", "macrotask", "charset", "charcode", "charcodes", "fnmatch", "extglob", "extglobs", "nullglob", "noglobstar", "noext", "nocase", "nobrace", "nonegate", "nonull", "bsdglob", "newcap", "nocomment", "kinded", "callees", "weakmaps", "wbind", "noopener", "noreferrer", "nomodule", "modulepreload", "fetchpriority", "popovertarget", "popovertargetaction", "beforematch", "onbeforematch", "shadowrootmode", "virtualkeyboardpolicy", "stylesheet", "noncryptographic", "HPACK", "Fastly", "beresp", "pingback", "webmention", "microdata", "colgroup", "datalist", "fieldset", "figcaption", "optgroup", "rowspan", "srcdoc", "srcset", "usemap", "enctype", "novalidate", "maxlength", "autoplay", "autofocus", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "hreflang", "referrerpolicy", "contenteditable", "tabindex", "inputmode", "itemprop", "itemref", "itemscope", "itemtype", "playsinline", "disablepictureinpicture", "disableremoteplayback", "controlslist", "intrinsicsize", "srclang", "noscript", "quicktime", "hgroup", "samp", "tspan", "colcount", "colindex", "rowcount", "rowindex", "setsize", "valuemax", "valuemin", "valuenow", "valuetext", "posinset", "roledescription", "haspopup", "keyshortcuts", "labelledby", "describedby", "flowto", "multiselectable", "alertdialog", "columnheader", "contentinfo", "listitem", "menuitemcheckbox", "menuitemradio", "progressbar", "rowgroup", "rowheader", "spinbutton", "tablist", "treegrid", "activedescendant", "colindextext", "rowindextext", "onblur", "onfocus", "onclick", "onresize", "onstorage", "onunload", "ononline", "onoffline", "onpopstate", "onhashchange", "onpageshow", "onpagehide", "onbeforeunload", "onbeforeprint", "onafterprint", "onlanguagechange", "onredo", "onundo", "ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "oncanplay", "oncanplaythrough", "oncontextmenu", "oncuechange", "ondblclick", "ondurationchange", "onemptied", "onloadeddata", "onloadedmetadata", "onloadstart", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmousewheel", "onpause", "onplay", "onplaying", "onratechange", "onreset", "onscroll", "onseeked", "onseeking", "onselect", "onshow", "onstalled", "onsubmit", "onsuspend", "ontimeupdate", "onvolumechange", "onwaiting", "dropeffect", "elementtiming", "enterkeyhint", "autocapitalize", "accesskey", "exportparts", "imagesrcset", "nohref", "noshade", "cellspacing", "charoff", "codetype", "marginheight", "marginwidth", "topmargin", "bottommargin", "leftmargin", "rightmargin", "bgcolor", "longdesc", "classid", "keygen", "maction", "maligngroup", "malignmark", "menclose", "merror", "mfenced", "mfile", "mfrac", "mglyph", "mlabeledtr", "mlongdiv", "mmultiscripts", "mpadded", "mpath", "mphantom", "mprescripts", "mroot", "mrow", "mscarries", "mscarry", "msgroup", "msline", "mspace", "msqrt", "msrow", "mstack", "mstyle", "msub", "msubsup", "msup", "mtable", "mtext", "munder", "munderover", "xlink", "webkitdirectory", "webworkers", "ltrim", "libc", "miterlimit", "linejoin", "evenodd", "noremoteplayback", "noplaybackrate", "nofullscreen", "nodownload", "posterimage", "videofile", "nqry", "gentest", "testling", "jsonminify", "pppconfig", "pppoe", "pppoeconf", "bkuri", "impp", "closedby", "closerequest", "scrollmonitor", "Datatest", "tryonline", "Huncwot", "Hyperclick", "Subresource", "Protip", "esque", "newcap", "MUID", "SVGM", "TSBASETYPE", "TSTYPE", "TSTYPEELEMENT", "MODULEDECLARATION", "IMPORTOREXPORTDECLARATION", "TIMEDOUT", "timedout", "argly", "onattach", "ondetach", "ondomready", "autopictureinpicture", "bday", "autoinitialization", "overcomplicating", "Prettyprinting", "brainer", "Ahhhh", "Khoon", "Kelleher", "Aberer", "Perini", "Addy", "Osmani", "Rigsby", "afph", "afpha", "afphc", "strs", "oogle", "onwarn", "buttn", "dont", "imagesizes", "treeitems" ], "ignoreRegExpList": [], "files": ["*"], "ignorePaths": [ "dist", "fixtures", "fixtures-interop", "**/node_modules", "**/CHANGELOG.md" ] } ================================================ FILE: eslint.config.mjs ================================================ import eslint from "@eslint/js"; import sortImportPlugin from "eslint-plugin-simple-import-sort"; import globals from "globals"; import tseslint from "typescript-eslint"; export default tseslint.config( { ignores: [ "!packages/runtime-class/src/node_modules", ".cache", ".sizes", ".vscode", "**/__snapshots__", "**/*.marko.js", "**/*actual*", "**/*dist/", "**/*expected*", "**/snapshots", "**/test/**/input.js", "coverage", "node_modules", ], }, eslint.configs.recommended, ...tseslint.configs.recommended, { languageOptions: { globals: { ...globals.mocha, ...globals.browser, ...globals.node, }, }, plugins: { "simple-import-sort": sortImportPlugin, }, rules: { "simple-import-sort/imports": "error", "simple-import-sort/exports": "error", "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-import-type-side-effects": "error", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-unused-expressions": "off", "@typescript-eslint/no-require-imports": "off", "@typescript-eslint/no-duplicate-enum-values": "off", "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-empty-object-type": "off", }, }, ); ================================================ FILE: package.json ================================================ { "name": "marko-project", "private": true, "workspaces": [ "./packages/*" ], "scripts": { "@ci:build": "npm run build", "@ci:lint": "eslint --format unix . && prettier . --check --with-node-modules --log-level=warn", "@ci:release": "npm run build && node scripts/pkg-override && changeset publish && node scripts/pkg-override && npm ci", "@ci:release-alias": "node -r ~ts scripts/publish-alias.ts", "@ci:test": "cross-env NODE_OPTIONS=\"--max-old-space-size=4096\" MARKO_DEBUG=1 c8 npm test", "@ci:version": "npm run build && npm run format && changeset version && npm i --package-lock-only", "build": "npm run build --ws && npm run build:types", "build:sizes": "node -r ~ts scripts/sizes", "build:types": "npx tsc --noEmit packages/runtime-tags/index.d.ts && npx tsc --noEmit packages/runtime-class/index.d.ts && tsc -b tsconfig.build.json", "change": "changeset add", "compile": "node -r ~ts scripts/inspect-compiled-output.ts", "format": "eslint --format unix --fix .; prettier . --write --with-node-modules --log-level=warn", "lint": "eslint --format unix . && prettier . --check --with-node-modules --log-level=warn && cspell \"**/*.{md,ts,js,marko}\"", "prepare": "husky && patch-package && npm run build-babel-types -w @marko/compiler", "report": "open ./coverage/lcov-report/index.html", "test": "mocha", "test:update": "UPDATE_EXPECTATIONS=1 mocha --update" }, "devDependencies": { "@babel/cli": "^7.28.6", "@babel/code-frame": "^7.29.0", "@babel/core": "^7.29.0", "@babel/generator": "^7.29.1", "@babel/parser": "^7.29.0", "@babel/plugin-syntax-typescript": "^7.28.6", "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-typescript": "^7.28.6", "@babel/preset-env": "^7.29.0", "@babel/preset-typescript": "^7.28.5", "@babel/register": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@changesets/changelog-github": "^0.6.0", "@changesets/cli": "^2.30.0", "@ebay/browserslist-config": "^2.13.0", "@eslint/js": "^10.0.1", "@rollup/plugin-terser": "^1.0.0", "@rollup/plugin-virtual": "^3.0.2", "@types/babel__code-frame": "^7.27.0", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.27.0", "@types/babel__traverse": "^7.28.0", "@types/js-beautify": "^1.14.3", "@types/jsdom": "^28.0.0", "@types/mocha": "^10.0.10", "@types/node": "^25.3.3", "~ts": "file:scripts/babel-register.js", "babel-plugin-minprops": "^2.0.1", "bluebird": "^3.7.2", "c8": "^11.0.0", "chai": "^4.4.1", "cross-env": "^10.1.0", "cspell": "^9.7.0", "diffable-html": "^6.0.1", "esbuild": "^0.27.3", "eslint": "^10.0.2", "eslint-formatter-unix": "^9.0.1", "eslint-plugin-simple-import-sort": "^12.1.1", "express": "^5.2.1", "globals": "^17.4.0", "husky": "^9.1.7", "it-fails": "^1.0.9", "js-beautify": "^1.15.4", "jsdom": "^28.1.0", "jsdom-context-require": "^5.2.8", "kleur": "^4.1.5", "lint-staged": "^16.3.2", "mocha": "^11.7.5", "mocha-autotest": "^1.1.3", "mocha-snap": "^5.0.1", "patch-package": "^8.0.1", "prettier": "^3.8.1", "prettier-plugin-packagejson": "^3.0.2", "pretty-format": "^30.2.0", "rolldown": "^1.0.0-rc.7", "rollup": "^4.59.0", "table": "^6.9.0", "through": "^2.3.8", "through2": "^4.0.2", "tiny-glob": "^0.2.9", "typescript": "^5.9.3", "typescript-eslint": "^8.56.1" } } ================================================ FILE: packages/compiler/CHANGELOG.md ================================================ # Change Log ## 5.39.62 ### Patch Changes - [#3133](https://github.com/marko-js/marko/pull/3133) [`1ca1a71`](https://github.com/marko-js/marko/commit/1ca1a71d0f07c2e9e233899c4677005026873942) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add validations around tags api attribute names. ## 5.39.61 ### Patch Changes - [#3130](https://github.com/marko-js/marko/pull/3130) [`2dc2152`](https://github.com/marko-js/marko/commit/2dc21520fbd1029c55c7e6c8c4f1a641d5cb8b90) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Support bound attribute modifiers as a way to cast change handler values. ## 5.39.60 ### Patch Changes - [#3119](https://github.com/marko-js/marko/pull/3119) [`109e423`](https://github.com/marko-js/marko/commit/109e4237b2ba12cc1db11f345614e62ab5d675e0) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where babel internal api was not correctly using package overrides when publishing. ## 5.39.59 ### Patch Changes - [#3117](https://github.com/marko-js/marko/pull/3117) [`e0419aa`](https://github.com/marko-js/marko/commit/e0419aaea01c9125fc5b67cfb51ed5fabb674dbb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrades eslint which captured some unecessary variable initializations and assignments. - [#3118](https://github.com/marko-js/marko/pull/3118) [`1961089`](https://github.com/marko-js/marko/commit/1961089c02743978cc4887346ff293a160d5139a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid loading babel configs when babel is not installed locally. ## 5.39.58 ### Patch Changes - [#3110](https://github.com/marko-js/marko/pull/3110) [`900a3d5`](https://github.com/marko-js/marko/commit/900a3d54a97606fb8be1a4b7d90d03313d5d7643) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure types stripped before transform phase in compiler. ## 5.39.57 ### Patch Changes - [#3108](https://github.com/marko-js/marko/pull/3108) [`97cf126`](https://github.com/marko-js/marko/commit/97cf126772fa4521f171d3d968b18a11c6e0028f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with translating concise mode tags api style tag. - [#3108](https://github.com/marko-js/marko/pull/3108) [`f1a93a7`](https://github.com/marko-js/marko/commit/f1a93a7f4a0230aa57cf62aea094db370e0a0fad) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade htmljs-parser to fix a concise mode whitespace normalization issue. ## 5.39.56 ### Patch Changes - [#3097](https://github.com/marko-js/marko/pull/3097) [`f774948`](https://github.com/marko-js/marko/commit/f774948773e89c4f7e4564fa2eb1c0cc7569bbfa) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Revert a recent change to preserve parenthesized expressions in the compiler. This caused a regression through some analysis which did not account for parenthesized expressions. - [#3096](https://github.com/marko-js/marko/pull/3096) [`3efe00f`](https://github.com/marko-js/marko/commit/3efe00f53244a3d9c2558e6926dcea601b9ff838) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Normalize controllable values following the same rules as DOM normalization before triggering change handlers. ## 5.39.55 ### Patch Changes - [#3081](https://github.com/marko-js/marko/pull/3081) [`a6bfcdc`](https://github.com/marko-js/marko/commit/a6bfcdce1174e37b76cce297e859646fdecd7adc) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression that prevented loading @marko/compiler in the browser. ## 5.39.54 ### Patch Changes - [#3079](https://github.com/marko-js/marko/pull/3079) [`06842e9`](https://github.com/marko-js/marko/commit/06842e9bd39ccf3b9b5fc25f4de33e9c399f954b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Bundle babel with rolldown instead of esbuild (produces smaller bundle). ## 5.39.53 ### Patch Changes - [#3077](https://github.com/marko-js/marko/pull/3077) [`020dfd4`](https://github.com/marko-js/marko/commit/020dfd4bbb780aa83f2233097217d0cb27b3e26a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure browserslist is an optional dependency with bundled babel. ## 5.39.52 ### Patch Changes - [#3075](https://github.com/marko-js/marko/pull/3075) [`fe579b5`](https://github.com/marko-js/marko/commit/fe579b53fb5b3341654268a68546d48a39bde57a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add stub types for babel packages in internal compiler api. ## 5.39.51 ### Patch Changes - [#3073](https://github.com/marko-js/marko/pull/3073) [`1aabdc3`](https://github.com/marko-js/marko/commit/1aabdc30bb7fa3b82e76a5b4724f469133f14c85) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Remove direct dependency on babel, refactor to use internal copy. ## 5.39.50 ### Patch Changes - [#3071](https://github.com/marko-js/marko/pull/3071) [`c5d31de`](https://github.com/marko-js/marko/commit/c5d31de1b55b26ffb746b7a03b01f2ce26ba0981) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix babel ast patching logic to work with latest babel. ## 5.39.49 ### Patch Changes - [#3061](https://github.com/marko-js/marko/pull/3061) [`0134076`](https://github.com/marko-js/marko/commit/0134076c0e11173a5e9c377aefb0d9709a3a6415) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add ability for generated template ids to be overwritten via compiler config. ## 5.39.48 ### Patch Changes - [#3044](https://github.com/marko-js/marko/pull/3044) [`2a43f7e`](https://github.com/marko-js/marko/commit/2a43f7e4147553779133a94c88f8c965fc8dd19f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve logic around building up analyzed watch files. ## 5.39.47 ### Patch Changes - [#3028](https://github.com/marko-js/marko/pull/3028) [`72a614d`](https://github.com/marko-js/marko/commit/72a614d9494f1b65060310b7abc0c54d1fd4767b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with var's inside scriptlets having incorrect scoping. ## 5.39.46 ### Patch Changes - [#3024](https://github.com/marko-js/marko/pull/3024) [`f634f38`](https://github.com/marko-js/marko/commit/f634f38d6dfffd72c23b4ec7e7bf5596ebd0b5de) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Use compiler modules api to read CWD in interop code. ## 5.39.45 ### Patch Changes - [#3001](https://github.com/marko-js/marko/pull/3001) [`792dd1d`](https://github.com/marko-js/marko/commit/792dd1d5d193554889f7ba6e734c1730b947cf2d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose Marko target api on compiled meta data. - [#2999](https://github.com/marko-js/marko/pull/2999) [`d2f437b`](https://github.com/marko-js/marko/commit/d2f437bf7118c3160a4f4c9cf977b8396d9fc8db) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add support for "use class" comment to opt into to class api when exclusive `tags` folders prefer tags api. - [#2999](https://github.com/marko-js/marko/pull/2999) [`d2f437b`](https://github.com/marko-js/marko/commit/d2f437bf7118c3160a4f4c9cf977b8396d9fc8db) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add exclusive `tags` folder discovery as a "prefer tags api" heuristic in interop mode. ## 5.39.44 ### Patch Changes - [#2996](https://github.com/marko-js/marko/pull/2996) [`1a65ff3`](https://github.com/marko-js/marko/commit/1a65ff3f4ed31b1e3fab37328962950db28a68e6) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Move strip types logic to be after transform phase. - [#2994](https://github.com/marko-js/marko/pull/2994) [`1bf2788`](https://github.com/marko-js/marko/commit/1bf2788042fd3e6928303c5782909612a59c5206) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure MarkoScriptlet's are visited for outer binding identifiers. - [#2996](https://github.com/marko-js/marko/pull/2996) [`2a23dec`](https://github.com/marko-js/marko/commit/2a23decc64b3dbfea024241b1301dba7f6d69679) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Run parse hooks after the main parse phase is complete. ## 5.39.43 ### Patch Changes - [#2983](https://github.com/marko-js/marko/pull/2983) [`fdc46fb`](https://github.com/marko-js/marko/commit/fdc46fb3e762595a43fd1fa2f714af7f8819d341) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Default title tag to be text only for Marko 6. - [#2978](https://github.com/marko-js/marko/pull/2978) [`55fd324`](https://github.com/marko-js/marko/commit/55fd324c3f4ea00535856c7719f8b4c46f55de40) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Update compiler to avoid mutating translator visitors. - [#2983](https://github.com/marko-js/marko/pull/2983) [`fdc46fb`](https://github.com/marko-js/marko/commit/fdc46fb3e762595a43fd1fa2f714af7f8819d341) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Normalize taglib ids to be consistent with register ids and across Marko 5/6. ## 5.39.42 ### Patch Changes - [#2949](https://github.com/marko-js/marko/pull/2949) [`6648a22`](https://github.com/marko-js/marko/commit/6648a2229084e3ae431c175fb283e41b9bb1dab5) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow compiler import helper to be used outside of translate. ## 5.39.41 ### Patch Changes - [#2906](https://github.com/marko-js/marko/pull/2906) [`c6a9c12`](https://github.com/marko-js/marko/commit/c6a9c125e82d9a1fbb158677cc8c26a94d80e2ec) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with incorrect babel scopes after stripping types. ## 5.39.40 ### Patch Changes - [#2859](https://github.com/marko-js/marko/pull/2859) [`22112e5`](https://github.com/marko-js/marko/commit/22112e524cf12baf0b119a5ad3417145459a159c) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure markoOpts is always accurate when running child template analysis. ## 5.39.39 ### Patch Changes - [#2855](https://github.com/marko-js/marko/pull/2855) [`29173ce`](https://github.com/marko-js/marko/commit/29173ced3806d932eb05dc14002fc4969ef4ac6b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure scopes are crawled before stripping types. ## 5.39.38 ### Patch Changes - [#2853](https://github.com/marko-js/marko/pull/2853) [`b52a62f`](https://github.com/marko-js/marko/commit/b52a62f3ae5d07bee23685289aec169476820f69) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure stripTypes compiler option is applied when targeting source output. ## 5.39.37 ### Patch Changes - [#2834](https://github.com/marko-js/marko/pull/2834) [`5c9a37f`](https://github.com/marko-js/marko/commit/5c9a37fa17c6a2f5f771c919b8415e4dfb25fca4) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue striping type specifiers in imports. ## 5.39.36 ### Patch Changes - [#2830](https://github.com/marko-js/marko/pull/2830) [`9a688af`](https://github.com/marko-js/marko/commit/9a688af3c92a73ae7492cdaa4b9ff1e0b2f9127e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with static/server/client statements with type imports not properly being stripped. ## 5.39.35 ### Patch Changes - [#2823](https://github.com/marko-js/marko/pull/2823) [`58c2165`](https://github.com/marko-js/marko/commit/58c21653aa0a1d6e1db208c36a1a584b44ba2ff0) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure type stripping runs before transform phase in compiler. ## 5.39.34 ### Patch Changes - [#2815](https://github.com/marko-js/marko/pull/2815) [`ed8d064`](https://github.com/marko-js/marko/commit/ed8d064d154532cfa7c12be524d6b47556da0c7f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure `@marko/compiler/modules` always uses packagem name imports for easier aliasing in website tooling. ## 5.39.33 ### Patch Changes - [#2756](https://github.com/marko-js/marko/pull/2756) [`46f1f90`](https://github.com/marko-js/marko/commit/46f1f9075043754aadec1175db5885f72c84e016) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve tags api compat. ## 5.39.32 ### Patch Changes - [#2753](https://github.com/marko-js/marko/pull/2753) [`9ba0cab`](https://github.com/marko-js/marko/commit/9ba0cab6474e7cd483b93992be5b8b5e7c8df0aa) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Update package dependencies. ## 5.39.31 ### Patch Changes - [#2749](https://github.com/marko-js/marko/pull/2749) [`9e0684f`](https://github.com/marko-js/marko/commit/9e0684f1171d7ab8364be719c4cf5b62df78126c) Thanks [@LuLaValva](https://github.com/LuLaValva)! - Prevent loss of comments in a scriptlet without statements ## 5.39.30 ### Patch Changes - [#2743](https://github.com/marko-js/marko/pull/2743) [`5b3ca5c`](https://github.com/marko-js/marko/commit/5b3ca5ce79b2a90ef505f290c6b17344ebcf3372) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Minor improvements to class/id shorthand parsing. ## 5.39.29 ### Patch Changes - [#2734](https://github.com/marko-js/marko/pull/2734) [`b6ba333`](https://github.com/marko-js/marko/commit/b6ba333ee289ff27a549d1a2ea60b06338cb7ef5) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade all deps. Fix support for [discard binding proposal](https://github.com/tc39/proposal-discard-binding). ## 5.39.28 ### Patch Changes - [#2715](https://github.com/marko-js/marko/pull/2715) [`e60a20f`](https://github.com/marko-js/marko/commit/e60a20f7e2dcbdb2dcfa45bc15f2901ffd0443c7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Remove script tag definition that caused a conflict when in interop mode. - [#2715](https://github.com/marko-js/marko/pull/2715) [`dc178ce`](https://github.com/marko-js/marko/commit/dc178ced9f75aac923f3c5b043aa40d62e8d0f4d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Move translator loading logic back into shared utility. Moving this out caused a regression for tools that call `getRuntimeEntryFiles` or `taglib.buildLookup` directly. ## 5.39.27 ### Patch Changes - [#2713](https://github.com/marko-js/marko/pull/2713) [`2d11230`](https://github.com/marko-js/marko/commit/2d11230f012397681f63071ea9b33b246b45f9ad) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid using "util" module to improve browser compat of compiler. ## 5.39.26 ### Patch Changes - [#2707](https://github.com/marko-js/marko/pull/2707) [`89d0196`](https://github.com/marko-js/marko/commit/89d019678ecfb004af9b5892482d6af9d6178c4d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix false positive interop checks. ## 5.39.25 ### Patch Changes - [#2705](https://github.com/marko-js/marko/pull/2705) [`75eaa9d`](https://github.com/marko-js/marko/commit/75eaa9d833f6711b5b60757ef02ca987fc310b01) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid using process api in compiler to make it easier to load in environments without it. ## 5.39.24 ### Patch Changes - [#2703](https://github.com/marko-js/marko/pull/2703) [`f67361b`](https://github.com/marko-js/marko/commit/f67361bc52191c9092833438868f09bb583252e1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Load interop translator by default if installed. ## 5.39.23 ### Patch Changes - [#2701](https://github.com/marko-js/marko/pull/2701) [`8f68b6e`](https://github.com/marko-js/marko/commit/8f68b6efc960a3e59f59cbb49c549a248a03a79f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression where explicitly passing in `undefined` for translator was not loading the default translator. ## 5.39.22 ### Patch Changes - [#2699](https://github.com/marko-js/marko/pull/2699) [`dc3ee34`](https://github.com/marko-js/marko/commit/dc3ee348e9b95c12bf74d4212a82756d7ad90a18) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid node:crypto - use custom hash algo for component ids. ## 5.39.21 ### Patch Changes - [#2696](https://github.com/marko-js/marko/pull/2696) [`eefa829`](https://github.com/marko-js/marko/commit/eefa829038b5bdd6edbbf95cef61e152e91ca9ec) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve internal module loading api. Ensure all taglib requires happen relative to project dir. ## 5.39.20 ### Patch Changes - [#2691](https://github.com/marko-js/marko/pull/2691) [`0758ae7`](https://github.com/marko-js/marko/commit/0758ae72e3a3da9fdf1dca37001aa6e8479655f9) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where scriptlets with comments were being printed without brackets when printing the marko ast. ## 5.39.19 ### Patch Changes - [#2648](https://github.com/marko-js/marko/pull/2648) [`3b883d4`](https://github.com/marko-js/marko/commit/3b883d4d9729e5b13bb0e8d19850c087d0e8245f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where tags added from the translator were given lower priority than tags added by the core compiler. ## 5.39.18 ### Patch Changes - [#2636](https://github.com/marko-js/marko/pull/2636) [`dc748b4`](https://github.com/marko-js/marko/commit/dc748b4932c1db3f556d4fc898ab47911828b6b6) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add parenthesized expressions to the list of computable values. ## 5.39.17 ### Patch Changes - [#2623](https://github.com/marko-js/marko/pull/2623) [`525345f`](https://github.com/marko-js/marko/commit/525345f4f71c53c00d7779a4c5d95fceaec3d33b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Refactor getFile and getProgram handling to avoid circular references between babel-utils and babel-plugin code. ## 5.39.16 ### Patch Changes - [#2621](https://github.com/marko-js/marko/pull/2621) [`aad5a8d`](https://github.com/marko-js/marko/commit/aad5a8d9473d0add9093f84bd570af8d47e0a4db) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose getProgram and getFile apis from @marko/compiler/babel-utils. Exposing it directly from the compiler was causing an issue with the website. ## 5.39.15 ### Patch Changes - [#2607](https://github.com/marko-js/marko/pull/2607) [`7110193`](https://github.com/marko-js/marko/commit/7110193bffa170a662549265c33996691f17453e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose getProgram and getFile apis for accessing the file/program of the active compilation. ## 5.39.14 ### Patch Changes - [#2589](https://github.com/marko-js/marko/pull/2589) [`765915a`](https://github.com/marko-js/marko/commit/765915ad423827bcdec6281413c59ecda173a80d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue when using with latest version of babel. ## 5.39.13 ### Patch Changes - [#2534](https://github.com/marko-js/marko/pull/2534) [`cfca41a`](https://github.com/marko-js/marko/commit/cfca41ac8c571d1fecb3b889df5eead1dfe06130) Thanks [@rturnq](https://github.com/rturnq)! - Add support for tag varaible hoisting ## 5.39.12 ### Patch Changes - [#2485](https://github.com/marko-js/marko/pull/2485) [`09c0558`](https://github.com/marko-js/marko/commit/09c0558a1b26df2d828d56bd853f885a17683e38) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure Marko 5 renderBodies are serialized properly across the compat layer. ## 5.39.11 ### Patch Changes - [#2470](https://github.com/marko-js/marko/pull/2470) [`218c436`](https://github.com/marko-js/marko/commit/218c43674e478062cdbc0fcbaef0dc13cd79107f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve tags / class api interop layer for destroyed tags. ## 5.39.10 ### Patch Changes - [#2453](https://github.com/marko-js/marko/pull/2453) [`b4d73b0`](https://github.com/marko-js/marko/commit/b4d73b0ab2ca2e07ec27172015ce7dd68ad1312f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose @marko/compiler/babel-utils as a top level file for legacy resolvers. ## 5.39.9 ### Patch Changes - [#2451](https://github.com/marko-js/marko/pull/2451) [`602eaad`](https://github.com/marko-js/marko/commit/602eaad0a48047b2fb678b8e77d6b345a0930b8d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid swallowing errors when resolved paths in marko.json files could not be resolve (now leaves the value as is, previously would ignore the path). - [#2449](https://github.com/marko-js/marko/pull/2449) [`6cf4978`](https://github.com/marko-js/marko/commit/6cf4978d765914e1d1c3ee62a3c691ce20c4903b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Support aggregate errors when final error is a HTMLJS parser error. ## 5.39.8 ### Patch Changes - [#2445](https://github.com/marko-js/marko/pull/2445) [`b12d7a9`](https://github.com/marko-js/marko/commit/b12d7a9b76dd9fca89ed717b8491b08d5e927fe0) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add engines field to package.json ## 5.39.7 ### Patch Changes - [#2438](https://github.com/marko-js/marko/pull/2438) [`4b6c613`](https://github.com/marko-js/marko/commit/4b6c6135badad6db7e4a8f0f59fb005ed66b04fa) Thanks [@mlrawlings](https://github.com/mlrawlings)! - use tags/ instead of components/ for runtime-tags - [#2439](https://github.com/marko-js/marko/pull/2439) [`8ebe566`](https://github.com/marko-js/marko/commit/8ebe566854179ad8cf8cfca7858d607ab208c01e) Thanks [@mlrawlings](https://github.com/mlrawlings)! - fix: remove duplicate imports of compat runtime ## 5.39.6 ### Patch Changes - [#2434](https://github.com/marko-js/marko/pull/2434) [`6a235a8`](https://github.com/marko-js/marko/commit/6a235a88813cd45a8704060e4fac3ed82c2f3437) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve registry id normalization. ## 5.39.5 ### Patch Changes - [#2426](https://github.com/marko-js/marko/pull/2426) [`2142dfd`](https://github.com/marko-js/marko/commit/2142dfd05d6b6ebc5f55883ca13a15847cdb07fa) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Use statement parsing for script tag to improve sourcemap accuracy. - [#2426](https://github.com/marko-js/marko/pull/2426) [`2142dfd`](https://github.com/marko-js/marko/commit/2142dfd05d6b6ebc5f55883ca13a15847cdb07fa) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where negative sourcemap offets leaning to the previous line were outputting incorrect values. ## 5.39.4 ### Patch Changes - [`e60bd4f`](https://github.com/marko-js/marko/commit/e60bd4fd25ccee475dad49195fca64024a6164bf) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix incorrect filepath for marko babel transform. ## 5.39.3 ### Patch Changes - [#2420](https://github.com/marko-js/marko/pull/2420) [`4a980fe`](https://github.com/marko-js/marko/commit/4a980fe444299f095f0f423767d5340e15c33682) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix publish alias issue. ## 5.39.2 ### Patch Changes - [#2418](https://github.com/marko-js/marko/pull/2418) [`00e7392`](https://github.com/marko-js/marko/commit/00e7392361a17f49345400d53644bcee13e9b375) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue when parsing embedded script code with negative offset locations. ## 5.39.1 ### Patch Changes - [#2416](https://github.com/marko-js/marko/pull/2416) [`619c87f`](https://github.com/marko-js/marko/commit/619c87faeebc31f6885bbb868fc89bab8a90ebea) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix package json repository config. ## 5.39.0 ### Minor Changes - [#2408](https://github.com/marko-js/marko/pull/2408) [`2be37f7`](https://github.com/marko-js/marko/commit/2be37f72d3030621e2f85b6615731a5af24e0211) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Merge translator packages into their respective runtime packages. ## 5.38.5 ### Patch Changes - [#2404](https://github.com/marko-js/marko/pull/2404) [`fbc0cef`](https://github.com/marko-js/marko/commit/fbc0cefb860cd91142231df04c05b7e4c0d1b1ee) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade all dependencies. Fix support for latest babel version. - Updated dependencies [[`fbc0cef`](https://github.com/marko-js/marko/commit/fbc0cefb860cd91142231df04c05b7e4c0d1b1ee)]: - @marko/babel-utils@6.6.3 ## 5.38.4 ### Patch Changes - [#2401](https://github.com/marko-js/marko/pull/2401) [`46f8d7c`](https://github.com/marko-js/marko/commit/46f8d7cfba231d1ab724fec83f07d1192d5d4d7f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add support for tags API script tag. - Updated dependencies [[`032afa1`](https://github.com/marko-js/marko/commit/032afa125b19969346639ac99ae9740521d0c3a2)]: - @marko/babel-utils@6.6.2 ## 5.38.3 ### Patch Changes - [#2395](https://github.com/marko-js/marko/pull/2395) [`00cc3fb`](https://github.com/marko-js/marko/commit/00cc3fbe934d96a644175cc86cd72221131a884d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where lasso manifest file paths were not being provided correctly for lasso-marko. ## 5.38.2 ### Patch Changes - [#2387](https://github.com/marko-js/marko/pull/2387) [`8e67da0`](https://github.com/marko-js/marko/commit/8e67da0f725ad5074a1bf933cb75ca569d21f2d7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with an attribute tag containing only a spread. ## 5.38.1 ### Patch Changes - [#2383](https://github.com/marko-js/marko/pull/2383) [`133b562`](https://github.com/marko-js/marko/commit/133b562c19081402330e4054eabc49a4ce635274) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Partially revert #2380 which was causing non idempotent builds. - Updated dependencies [[`133b562`](https://github.com/marko-js/marko/commit/133b562c19081402330e4054eabc49a4ce635274)]: - @marko/babel-utils@6.6.1 ## 5.38.0 ### Minor Changes - [#2380](https://github.com/marko-js/marko/pull/2380) [`c5d2b48`](https://github.com/marko-js/marko/commit/c5d2b4871e9dab7037a624681d0161b72fdc799d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Replace `optimizeKnownTemplates` with a better an simpler `optimizeRegistryId` api. ### Patch Changes - Updated dependencies [[`c5d2b48`](https://github.com/marko-js/marko/commit/c5d2b4871e9dab7037a624681d0161b72fdc799d)]: - @marko/babel-utils@6.6.0 ## 5.37.26 ### Patch Changes - [#2368](https://github.com/marko-js/marko/pull/2368) [`bb44af0`](https://github.com/marko-js/marko/commit/bb44af04b1ad29d14200ff5cff26b27a39ce446e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with "package: " deps (used for lasso) not being hoisted when building the hydrate output. ## 5.37.25 ### Patch Changes - [#2367](https://github.com/marko-js/marko/pull/2367) [`c8e943d`](https://github.com/marko-js/marko/commit/c8e943d30ea621356b14ce5a2bf8c040f9d41f82) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ignore errors from child template analysis (assume child will be compiled after imported anyway). - [#2365](https://github.com/marko-js/marko/pull/2365) [`894d0d0`](https://github.com/marko-js/marko/commit/894d0d05daddee107640f83bcd8a11f46b4e359b) Thanks [@rturnq](https://github.com/rturnq)! - Expose globalConfig and fix config default export - Updated dependencies [[`c8e943d`](https://github.com/marko-js/marko/commit/c8e943d30ea621356b14ce5a2bf8c040f9d41f82)]: - @marko/babel-utils@6.5.13 ## 5.37.24 ### Patch Changes - [#2358](https://github.com/marko-js/marko/pull/2358) [`76951d8`](https://github.com/marko-js/marko/commit/76951d887d02e6f0dd3f0fe1345721d4a94a0069) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Always use MarkoTagBody AST nodes for control flow (even with attribute tags). This fixes a regression with the @marko/tags-api-preview and is more accurate to what is actually happening, especially from a variable scoping perspective. - Updated dependencies [[`76951d8`](https://github.com/marko-js/marko/commit/76951d887d02e6f0dd3f0fe1345721d4a94a0069)]: - @marko/babel-utils@6.5.12 ## 5.37.23 ### Patch Changes - [#2346](https://github.com/marko-js/marko/pull/2346) [`8ec88ff`](https://github.com/marko-js/marko/commit/8ec88fff87ef40ce19aba8992e075a839a61683e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Switch back to using babels startIndex api since the regression has been fixed. - [#2344](https://github.com/marko-js/marko/pull/2344) [`bafeac1`](https://github.com/marko-js/marko/commit/bafeac1db6acc73e5c38ade2a078485df28670b8) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Optimize circular reference child template analysis. - Updated dependencies [[`8ec88ff`](https://github.com/marko-js/marko/commit/8ec88fff87ef40ce19aba8992e075a839a61683e), [`bafeac1`](https://github.com/marko-js/marko/commit/bafeac1db6acc73e5c38ade2a078485df28670b8)]: - @marko/babel-utils@6.5.10 ## 5.37.22 ### Patch Changes - [#2342](https://github.com/marko-js/marko/pull/2342) [`8e07673`](https://github.com/marko-js/marko/commit/8e07673ca07cc83d9910c68ff8359264015c28d1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Make attribute tags a property on the MarkoTag AST and refactor how attribute tags are translated. - Updated dependencies [[`8e07673`](https://github.com/marko-js/marko/commit/8e07673ca07cc83d9910c68ff8359264015c28d1)]: - @marko/babel-utils@6.5.9 ## 5.37.21 ### Patch Changes - [#2338](https://github.com/marko-js/marko/pull/2338) [`033adb9`](https://github.com/marko-js/marko/commit/033adb92de3e40f24614e0de9d438f6390843a84) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure that errors discovered while loading optional module level taglibs are forwarded through the onError api. ## 5.37.20 ### Patch Changes - [#2334](https://github.com/marko-js/marko/pull/2334) [`212fbd0`](https://github.com/marko-js/marko/commit/212fbd063d046d865bb3e8f996db91060b6651b2) Thanks [@LuLaValva](https://github.com/LuLaValva)! - TypeScript dependency fix - [#2337](https://github.com/marko-js/marko/pull/2337) [`ea95de1`](https://github.com/marko-js/marko/commit/ea95de1deaaa03bf2bc57b2518954084dbc1442f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid babel `startColumn` api until https://github.com/babel/babel/pull/16936 is merged. - Updated dependencies [[`ea95de1`](https://github.com/marko-js/marko/commit/ea95de1deaaa03bf2bc57b2518954084dbc1442f)]: - @marko/babel-utils@6.5.8 ## 5.37.19 ### Patch Changes - [#2324](https://github.com/marko-js/marko/pull/2324) [`4776e33`](https://github.com/marko-js/marko/commit/4776e334ed8f4f70559042d28007dfa447942693) Thanks [@rturnq](https://github.com/rturnq)! - Allow child template analysis on manually imported tags in translator-default and optimize direct reference of imported tag ## 5.37.18 ### Patch Changes - [#2322](https://github.com/marko-js/marko/pull/2322) [`420405d`](https://github.com/marko-js/marko/commit/420405db952fcedafed0cb48d86620ca53bb2f1d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Remove the default cache auto clearing behavior. Previously the default compiler "cache" was cleared every setImmediate. This was to support server hot reloading in apps using `Lasso` (and `browser-refresh`). Since we brought back support for `browser-refresh` in the Marko package we now clear this cache when browser-refresh triggers a change making the default cache clearing redundant. ## 5.37.17 ### Patch Changes - [#2320](https://github.com/marko-js/marko/pull/2320) [`13b3270`](https://github.com/marko-js/marko/commit/13b32707ed673dd3dabe6dfdb90fcf5a19448776) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Optimize how style and script tags are diffed (similar to textarea) where the text nodes are concatenated and diffed as a whole. - [#2320](https://github.com/marko-js/marko/pull/2320) [`a9da4d6`](https://github.com/marko-js/marko/commit/a9da4d64cf8116867ea80150f10c4dc8a45a0c98) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression from #2138 which caused nullable native dynamic tags with body contents to not output the end tag. 😱 ## 5.37.16 ### Patch Changes - [#2318](https://github.com/marko-js/marko/pull/2318) [`1dbb189`](https://github.com/marko-js/marko/commit/1dbb189976ef56a28252fbf7da95ac18a3eadaf6) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where a null able native tag with no body content (eg `<${show && "div}/>`) was incorrectly outputting a fragment for the body content (which did not exist). ## 5.37.15 ### Patch Changes - [#2310](https://github.com/marko-js/marko/pull/2310) [`f06d4b0`](https://github.com/marko-js/marko/commit/f06d4b0559c3fbb3af67773c70b3aab25278b0ca) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid babel compiler assert api to fix a regression. - Updated dependencies [[`f06d4b0`](https://github.com/marko-js/marko/commit/f06d4b0559c3fbb3af67773c70b3aab25278b0ca)]: - @marko/babel-utils@6.5.7 ## 5.37.14 ### Patch Changes - [#2303](https://github.com/marko-js/marko/pull/2303) [`e6d117b`](https://github.com/marko-js/marko/commit/e6d117b67a3099ab0a29248d189de7b37b9d3d8a) Thanks [@rturnq](https://github.com/rturnq)! - Add frame property to compile errors ## 5.37.13 ### Patch Changes - [#2300](https://github.com/marko-js/marko/pull/2300) [`d45f91a`](https://github.com/marko-js/marko/commit/d45f91a5e0fff686cac7b7daf29deb60a6a1ffd7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where legacy compat `w-bind` directives were being incorrectly optimized as static vdom. ## 5.37.12 ### Patch Changes - [#2298](https://github.com/marko-js/marko/pull/2298) [`c01d83f`](https://github.com/marko-js/marko/commit/c01d83fb2617443a7dc03eb3b43a2f7752754a45) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with the "ignoreUnrecognizedTags" compiler option being used with dynamic tags that have attribute tags. - [#2298](https://github.com/marko-js/marko/pull/2298) [`cfff311`](https://github.com/marko-js/marko/commit/cfff3111148a43f58c7d2b78f679c09c04d429b5) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Removes the debug mode dom manipulation warning since chrome dropped the api's that allowed us to get useful stack traces. ## 5.37.11 ### Patch Changes - [#2296](https://github.com/marko-js/marko/pull/2296) [`81c5c0e`](https://github.com/marko-js/marko/commit/81c5c0e0436dc694f09c722f2103bfdc9cb3844f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issues related to recent babel changes. - [#2296](https://github.com/marko-js/marko/pull/2296) [`81c5c0e`](https://github.com/marko-js/marko/commit/81c5c0e0436dc694f09c722f2103bfdc9cb3844f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve support for @marko/compat. - Updated dependencies [[`81c5c0e`](https://github.com/marko-js/marko/commit/81c5c0e0436dc694f09c722f2103bfdc9cb3844f), [`81c5c0e`](https://github.com/marko-js/marko/commit/81c5c0e0436dc694f09c722f2103bfdc9cb3844f)]: - @marko/babel-utils@6.5.6 ## 5.37.10 ### Patch Changes - [#2294](https://github.com/marko-js/marko/pull/2294) [`c600610`](https://github.com/marko-js/marko/commit/c6006102479d8d10ffd1f18d13b8c607fbabd177) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with comment nodes in unescaped html by bringing back virtual comment nodes. ## 5.37.9 ### Patch Changes - [#2286](https://github.com/marko-js/marko/pull/2286) [`55338b5`](https://github.com/marko-js/marko/commit/55338b52969817b63c90ea84f30246ad0b94b6f9) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Optimize template literal printing in html output. ## 5.37.8 ### Patch Changes - [#2284](https://github.com/marko-js/marko/pull/2284) [`d0723d3`](https://github.com/marko-js/marko/commit/d0723d398338d86b48524e230fe24d93d62ee19a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix off by one issue for static statement sourcemaps (eg import) and for concise mode tags. - Updated dependencies [[`d0723d3`](https://github.com/marko-js/marko/commit/d0723d398338d86b48524e230fe24d93d62ee19a)]: - @marko/babel-utils@6.5.5 ## 5.37.7 ### Patch Changes - [#2282](https://github.com/marko-js/marko/pull/2282) [`32e2eff`](https://github.com/marko-js/marko/commit/32e2eff5c3ecdcb36f7b6ed98ea2a1e705538a29) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve handling of sourcemaps for inline style blocks and tags. - Updated dependencies [[`32e2eff`](https://github.com/marko-js/marko/commit/32e2eff5c3ecdcb36f7b6ed98ea2a1e705538a29)]: - @marko/babel-utils@6.5.4 ## 5.37.6 ### Patch Changes - [#2277](https://github.com/marko-js/marko/pull/2277) [`ce88d81`](https://github.com/marko-js/marko/commit/ce88d8194f98b4010032634f5427021810f6acdb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix "off by one" issue with source location information when the index was at the start of the line. - Updated dependencies [[`ce88d81`](https://github.com/marko-js/marko/commit/ce88d8194f98b4010032634f5427021810f6acdb)]: - @marko/babel-utils@6.5.3 ## 5.37.5 ### Patch Changes - [#2274](https://github.com/marko-js/marko/pull/2274) [`5cea7d6`](https://github.com/marko-js/marko/commit/5cea7d65ead9b58d7d7d244078d279d561fd3ea7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Optimize javascript parsing helpers to pass in start line / column information to babel rather than faking it with whitespace. For large templates this can have a significant impact on parsing performance. - Updated dependencies [[`5cea7d6`](https://github.com/marko-js/marko/commit/5cea7d65ead9b58d7d7d244078d279d561fd3ea7)]: - @marko/babel-utils@6.5.2 ## 5.37.4 ### Patch Changes - [#2252](https://github.com/marko-js/marko/pull/2252) [`bfe85d1`](https://github.com/marko-js/marko/commit/bfe85d18772f244abfced05d7cde5698b7e077ec) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - When loading a taglib, always process exports field if inside node_modules folder. - [#2252](https://github.com/marko-js/marko/pull/2252) [`339c28d`](https://github.com/marko-js/marko/commit/339c28dd590dc15b6a1011f38411809060f1a4ba) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow diagnostic fixes in parse stage. - Updated dependencies [[`339c28d`](https://github.com/marko-js/marko/commit/339c28dd590dc15b6a1011f38411809060f1a4ba)]: - @marko/babel-utils@6.5.1 ## 5.37.3 ### Patch Changes - [#2248](https://github.com/marko-js/marko/pull/2248) [`0ced6e1`](https://github.com/marko-js/marko/commit/0ced6e17c24808586bd24f025d77cfb3c391ea2e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix typo in upgrade docs and adding missing `browser-refresh` module. ## 5.37.2 ### Patch Changes - [#2246](https://github.com/marko-js/marko/pull/2246) [`a699cd9`](https://github.com/marko-js/marko/commit/a699cd9434996b8da0a14acba39fd1db03c0329a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Misc backward compat improvements: - Expose `marko/browser-refresh` as a noop - Allow translators to specify "optional" taglibs to load if they're installed (used for automatically loading compat taglibs) - `marko/node-require` legacy require hook now disables user babel transforms by default - Allow `` tag instances to use tag arguments syntax ## 5.37.1 ### Patch Changes - [#2244](https://github.com/marko-js/marko/pull/2244) [`934dc13`](https://github.com/marko-js/marko/commit/934dc13972b14b6cc9511ae19db70f5b74a366b5) Thanks [@LuLaValva](https://github.com/LuLaValva)! - Allow mixing comments with attr tags ## 5.37.0 ### Minor Changes - [#2238](https://github.com/marko-js/marko/pull/2238) [`a741f36`](https://github.com/marko-js/marko/commit/a741f36e60583a2403a912627765c3ec2aa824e5) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add new optimizedRegistryIds compiler option ### Patch Changes - Updated dependencies [[`a741f36`](https://github.com/marko-js/marko/commit/a741f36e60583a2403a912627765c3ec2aa824e5)]: - @marko/babel-utils@6.5.0 ## 5.36.2 ### Patch Changes - [#2232](https://github.com/marko-js/marko/pull/2232) [`a67e1c4`](https://github.com/marko-js/marko/commit/a67e1c42b04ede5d9b9ef3cb2f8e21bedd2f004f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where the `ignoreUnrecognizedTags` compiler option was incorrectly escaping attribute tags for recognized tags that did not explicitly define their attribute tags in a marko.json ## 5.36.1 ### Patch Changes - [#2217](https://github.com/marko-js/marko/pull/2217) [`4fc4614`](https://github.com/marko-js/marko/commit/4fc46149ae046dd0fac0e7cc7e904b188f616f7f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where element keys could be different because of hoisted const elements not always being keyed. This could cause a hydration issue since the server and client compilations would not agree on the keys. ## 5.36.0 ### Minor Changes - [#2214](https://github.com/marko-js/marko/pull/2214) [`2d0a566`](https://github.com/marko-js/marko/commit/2d0a566a569e0d8caab2fd9abc960e6810e29b56) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Using event handlers now causes a template to become an implicit component or split component (depending on if a string event handler is used). ## 5.35.14 ### Patch Changes - [#2212](https://github.com/marko-js/marko/pull/2212) [`a1a91a4`](https://github.com/marko-js/marko/commit/a1a91a474853a4b6dc31217d374ee0e7e1179cec) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issues related to hydrating sections under a native tag with the `no-update` directive. ## 5.35.13 ### Patch Changes - [#2210](https://github.com/marko-js/marko/pull/2210) [`7d1bbdb`](https://github.com/marko-js/marko/commit/7d1bbdb9af63164448697ceb20490ee0776bc70f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - I completely messed up the release of https://github.com/marko-js/marko/pull/2205, this fixes that. ## 5.35.12 ### Patch Changes - [`c8fe951`](https://github.com/marko-js/marko/commit/c8fe951813bf6c7d11e581faf9e43522ae76ae98) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Bump compiler and translator to pull in Marko runtime changes. ## 5.35.11 ### Patch Changes - [#2190](https://github.com/marko-js/marko/pull/2190) [`638ca07`](https://github.com/marko-js/marko/commit/638ca07db382345c26f90247115eef13394e9905) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Update dependencies - Updated dependencies [[`638ca07`](https://github.com/marko-js/marko/commit/638ca07db382345c26f90247115eef13394e9905)]: - @marko/babel-utils@6.4.3 ## 5.35.10 ### Patch Changes - [#2187](https://github.com/marko-js/marko/pull/2187) [`fe344b0`](https://github.com/marko-js/marko/commit/fe344b00041677f40ce49d03c0fb283322a1c898) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix some tags/class interop issues. ## 5.35.9 ### Patch Changes - [#2182](https://github.com/marko-js/marko/pull/2182) [`1fa3b05`](https://github.com/marko-js/marko/commit/1fa3b056006d5d0e3ac221b5b4a18b78de5add21) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Support tracking the "input" using babels scope analysis. ## 5.35.8 ### Patch Changes - [#2180](https://github.com/marko-js/marko/pull/2180) [`a8bfb50`](https://github.com/marko-js/marko/commit/a8bfb50d7617d338c8e6b11c3f18cbb4829a5cba) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where vdom optimizer was including elements with user key attributes. ## 5.35.7 ### Patch Changes - [#2173](https://github.com/marko-js/marko/pull/2173) [`614f432`](https://github.com/marko-js/marko/commit/614f432bfeab93eb35c23d6e378e914b27540f7f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression where hydrate dependencies had the incorrect resolved path if they were in node_modules. ## 5.35.6 ### Patch Changes - [`409ef4e`](https://github.com/marko-js/marko/commit/409ef4e76d680b6e4202658fdf9567c663898d8b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression where hydrate entry files had incorrect relative paths. ## 5.35.5 ### Patch Changes - [#2164](https://github.com/marko-js/marko/pull/2164) [`08823b9`](https://github.com/marko-js/marko/commit/08823b916b0aca172edeaba86b632a4cf5462a8a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with interop translator not outputting correct hydrate entry code. - Updated dependencies [[`08823b9`](https://github.com/marko-js/marko/commit/08823b916b0aca172edeaba86b632a4cf5462a8a)]: - @marko/babel-utils@6.4.2 ## 5.35.4 ### Patch Changes - [#2150](https://github.com/marko-js/marko/pull/2150) [`7ef2b89`](https://github.com/marko-js/marko/commit/7ef2b8956982455953f3c1180b2f9094ca489e52) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose all files from compiler exports. ## 5.35.3 ### Patch Changes - [#2148](https://github.com/marko-js/marko/pull/2148) [`b095755`](https://github.com/marko-js/marko/commit/b09575529493039ade02d9c35bcf21d5d4e6ef1d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with interop translator loading init-components tag. ## 5.35.2 ### Patch Changes - [#2140](https://github.com/marko-js/marko/pull/2140) [`4a1db86`](https://github.com/marko-js/marko/commit/4a1db8683d6c67fcff1bdbdaa76ab907c8b09170) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Some packages rely on a `@marko/compiler/package` entry point existing, adds back that export. ## 5.35.1 ### Patch Changes - [#2138](https://github.com/marko-js/marko/pull/2138) [`105c26b`](https://github.com/marko-js/marko/commit/105c26bd4f7f37bd6073e4795b01b83d31ecda06) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with package json src/dist override script. - Updated dependencies [[`105c26b`](https://github.com/marko-js/marko/commit/105c26bd4f7f37bd6073e4795b01b83d31ecda06)]: - @marko/babel-utils@6.4.1 ## 5.35.0 ### Minor Changes - [#2004](https://github.com/marko-js/marko/pull/2004) [`2704819`](https://github.com/marko-js/marko/commit/27048199d6a0ee48ed8118e9f7017a94c7dc4f3d) Thanks [@mlrawlings](https://github.com/mlrawlings)! - Release alpha of tags api translator/runtime. - [#2004](https://github.com/marko-js/marko/pull/2004) [`2704819`](https://github.com/marko-js/marko/commit/27048199d6a0ee48ed8118e9f7017a94c7dc4f3d) Thanks [@mlrawlings](https://github.com/mlrawlings)! - Add `mount` api for client rendered components and expose `Symbol.asyncIterator` for server rendered components. ### Patch Changes - Updated dependencies [[`2704819`](https://github.com/marko-js/marko/commit/27048199d6a0ee48ed8118e9f7017a94c7dc4f3d), [`2704819`](https://github.com/marko-js/marko/commit/27048199d6a0ee48ed8118e9f7017a94c7dc4f3d)]: - @marko/babel-utils@6.4.0 ## 5.34.7 ### Patch Changes - [#2115](https://github.com/marko-js/marko/pull/2115) [`a55fb06`](https://github.com/marko-js/marko/commit/a55fb06ec638eb830eb72c71cb766fc05b6ea8cb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve nested attribute tag handling with scriptlets. ## 5.34.6 ### Patch Changes - [#2085](https://github.com/marko-js/marko/pull/2085) [`d82b21e`](https://github.com/marko-js/marko/commit/d82b21e8f505c5006d3781cf9056743dd9972fe1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve compile error output. ## 5.34.5 ### Patch Changes - [#2079](https://github.com/marko-js/marko/pull/2079) [`2976dfa`](https://github.com/marko-js/marko/commit/2976dfac56c592dfd80ea79c6ea0e1389346f44c) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where additional exports were being removed when stripping typescript types. ## 5.34.4 ### Patch Changes - [#2076](https://github.com/marko-js/marko/pull/2076) [`69b3ff5`](https://github.com/marko-js/marko/commit/69b3ff57c829418946e05c13b644a5560f589086) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade all package deps to latest - Updated dependencies [[`69b3ff5`](https://github.com/marko-js/marko/commit/69b3ff57c829418946e05c13b644a5560f589086)]: - @marko/babel-utils@6.3.5 ## 5.34.3 ### Patch Changes - [#2074](https://github.com/marko-js/marko/pull/2074) [`bf23c566fac02f4e2991be357a95483663493b3f`](https://github.com/marko-js/marko/commit/bf23c566fac02f4e2991be357a95483663493b3f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade package lock and built types. ## 5.34.2 ### Patch Changes - [#2069](https://github.com/marko-js/marko/pull/2069) [`977d69078`](https://github.com/marko-js/marko/commit/977d690784f1d97acb3494bb822fa852c1380685) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with printing variable declarations with multiple variables. ## 5.34.1 ### Patch Changes - [#2064](https://github.com/marko-js/marko/pull/2064) [`5e294103f`](https://github.com/marko-js/marko/commit/5e294103f78642b8a44887a1569ffd0eabcf6821) Thanks [@LuLaValva](https://github.com/LuLaValva)! - fix sourcemaps ## 5.34.0 ### Minor Changes - [#2062](https://github.com/marko-js/marko/pull/2062) [`436ace040`](https://github.com/marko-js/marko/commit/436ace040b73d11908911d60c10845b6e99e8eca) Thanks [@LuLaValva](https://github.com/LuLaValva)! - Add "exports" to marko.json ## 5.33.8 ### Patch Changes - [#2060](https://github.com/marko-js/marko/pull/2060) [`648a94928`](https://github.com/marko-js/marko/commit/648a94928f662b04634a61395d5d48a956a8ff36) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose meta data about which child Marko templates were analyzed for a given compilation. - [#2059](https://github.com/marko-js/marko/pull/2059) [`aed88284b`](https://github.com/marko-js/marko/commit/aed88284b8b3c68965f70b6bdf9412c7100c5df5) Thanks [@LuLaValva](https://github.com/LuLaValva)! - fix AST types - Updated dependencies [[`648a94928`](https://github.com/marko-js/marko/commit/648a94928f662b04634a61395d5d48a956a8ff36)]: - @marko/babel-utils@6.3.4 ## 5.33.7 ### Patch Changes - [#2056](https://github.com/marko-js/marko/pull/2056) [`84f443d60`](https://github.com/marko-js/marko/commit/84f443d60539cc1b3382c6b16da4061070f97aca) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue when the Marko hot-reload runtime is loaded in native esm ## 5.33.6 ### Patch Changes - [#2054](https://github.com/marko-js/marko/pull/2054) [`1c5eccadf`](https://github.com/marko-js/marko/commit/1c5eccadf8d968552dbe8756905009107d783718) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression with @marko/babel-utils not exposing new parse helpers. - Updated dependencies [[`1c5eccadf`](https://github.com/marko-js/marko/commit/1c5eccadf8d968552dbe8756905009107d783718)]: - @marko/babel-utils@6.3.3 ## 5.33.5 ### Patch Changes - [#2051](https://github.com/marko-js/marko/pull/2051) [`5354d4411`](https://github.com/marko-js/marko/commit/5354d44112c56fcbbd7f44dd3bf91be1e5a7747c) Thanks [@LuLaValva](https://github.com/LuLaValva)! - add ts to ast - Updated dependencies [[`5354d4411`](https://github.com/marko-js/marko/commit/5354d44112c56fcbbd7f44dd3bf91be1e5a7747c)]: - @marko/babel-utils@6.3.2 ## 5.33.4 ### Patch Changes - [#2049](https://github.com/marko-js/marko/pull/2049) [`1554b1e1e`](https://github.com/marko-js/marko/commit/1554b1e1e53a75980af0b238cc27bed5ddfa215a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow `template.marko` to act as `index.marko` for backword compat with v4/v3. ## 5.33.3 ### Patch Changes - [#2042](https://github.com/marko-js/marko/pull/2042) [`447104632`](https://github.com/marko-js/marko/commit/44710463258999ad037febef10264e32f3291157) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - When compiling async, prefer using the async babel api for loading babel config files. ## 5.33.2 ### Patch Changes - [#2038](https://github.com/marko-js/marko/pull/2038) [`71a227a5f`](https://github.com/marko-js/marko/commit/71a227a5ff8b16c0bb983e082f28280518f712ce) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where using the longhand nested attribute tag syntax in a marko.json with a `target-property` defined was not registering the alias as a known attribute, leading to compile errors. ## 5.33.1 ### Patch Changes - [#2020](https://github.com/marko-js/marko/pull/2020) [`6a4e947b5`](https://github.com/marko-js/marko/commit/6a4e947b5ac9944e61d7871d314a6325a0522d1d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure .marko files are resolved for legacy renderer taglib configs. ## 5.33.0 ### Minor Changes - [#2012](https://github.com/marko-js/marko/pull/2012) [`6ba268c84`](https://github.com/marko-js/marko/commit/6ba268c841631b3ed36964c8f532e543885ad4f5) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Support registering a taglib in the compiler by just passing in a module id. ## 5.32.0 ### Minor Changes - [#2006](https://github.com/marko-js/marko/pull/2006) [`b2e70bc45`](https://github.com/marko-js/marko/commit/b2e70bc45006a8cccfa61ac99bbca40a71d05fd1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add compute node helper to replace babels `evaluate` helper. This helper is less aggressive and doesn't suffer from the false positives that popped up with babels version. ### Patch Changes - Updated dependencies [[`b2e70bc45`](https://github.com/marko-js/marko/commit/b2e70bc45006a8cccfa61ac99bbca40a71d05fd1)]: - @marko/babel-utils@6.3.0 ## 5.31.2 ### Patch Changes - [#2001](https://github.com/marko-js/marko/pull/2001) [`037a6ce67`](https://github.com/marko-js/marko/commit/037a6ce67088d63dcdc67a8b5bd02c10cf38b64e) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve some typings for the compiler apis. - Updated dependencies [[`037a6ce67`](https://github.com/marko-js/marko/commit/037a6ce67088d63dcdc67a8b5bd02c10cf38b64e)]: - @marko/babel-utils@6.2.1 ## 5.31.1 ### Patch Changes - [#1997](https://github.com/marko-js/marko/pull/1997) [`2afa3f6e6`](https://github.com/marko-js/marko/commit/2afa3f6e61ca262debde88bc11400a6ba97a2f19) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Ensure source maps are loaded in dev mode when using the @marko/register hook. ## 5.31.0 ### Minor Changes - [#1996](https://github.com/marko-js/marko/pull/1996) [`d93037843`](https://github.com/marko-js/marko/commit/d930378434279451b0113ae6a268304063b037f4) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Move tag validation to the translate phase and expose new utilities for working with macros in @marko/babel-utils. This allows for migration/transformer/etc compiler hooks to better work with 's. ### Patch Changes - Updated dependencies [[`d93037843`](https://github.com/marko-js/marko/commit/d930378434279451b0113ae6a268304063b037f4)]: - @marko/babel-utils@6.2.0 ## 5.30.3 ### Patch Changes - [#1992](https://github.com/marko-js/marko/pull/1992) [`1bc993012`](https://github.com/marko-js/marko/commit/1bc993012375315a6cbda3eed75291abf821de6b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix regression which would happen if tools tried to "delete" the `loc` property on error instances returned from Marko. This property is now configurable and can be deleted again. ## 5.30.2 ### Patch Changes - [#1990](https://github.com/marko-js/marko/pull/1990) [`a54a23794`](https://github.com/marko-js/marko/commit/a54a2379487fd20e6598d5fdfc7c7dbe0f644e8b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Change the stack frame for error messages generated by the compiler to work better with how node prints error messages. ## 5.30.1 ### Patch Changes - [#1987](https://github.com/marko-js/marko/pull/1987) [`8bf5cb1f0`](https://github.com/marko-js/marko/commit/8bf5cb1f097769c835a452ff4bbea67a6c741810) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - When duplicate taglib entries are found and merged, nullish values are now ignored. This means if you specify a property in a taglib it will not be unset by another (merged) taglib. - [#1986](https://github.com/marko-js/marko/pull/1986) [`1b29b859f`](https://github.com/marko-js/marko/commit/1b29b859fb0876d9a8d0d7bba44d08f77f1706bb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where `module-code` entries were not properly checking the expected module output (causing them to always output esm). This was previously fine due to the cjs conversion plugin running for these, however a recent change caused that plugin to no longer run for these files since (which should have been unnecessary, except for that they had the incorrect check). ## 5.30.0 ### Minor Changes - [#1984](https://github.com/marko-js/marko/pull/1984) [`c6e2d0655`](https://github.com/marko-js/marko/commit/c6e2d06554166daa8eefe34121323413cf2d9cb1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow migrator as a tag entry file. ### Patch Changes - Updated dependencies [[`c6e2d0655`](https://github.com/marko-js/marko/commit/c6e2d06554166daa8eefe34121323413cf2d9cb1)]: - @marko/babel-utils@6.1.0 ## 5.29.0 ### Minor Changes - [#1980](https://github.com/marko-js/marko/pull/1980) [`9d3b34eef`](https://github.com/marko-js/marko/commit/9d3b34eefa2d0d9f9b27b9635950360b62be2f1f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow parse errors to be recovered from by migrations. This adds a new ast node type of MarkoParseError. MarkoParseError nodes can be removed during the migration stage to handle legacy syntaxes. Any MarkoParseError left in the AST at the end of the migration phase will throw an error similar to what it would have previously thrown synchronously. This also means that all parse errors can be surfaced as an aggregate error instead of bailing on the first parse error. When the compiler is ran with `errorRecovery: true` these errors become diagnostics instead of being thrown. ### Patch Changes - Updated dependencies [[`9d3b34eef`](https://github.com/marko-js/marko/commit/9d3b34eefa2d0d9f9b27b9635950360b62be2f1f)]: - @marko/babel-utils@6.0.0 ## 5.28.5 ### Patch Changes - [#1978](https://github.com/marko-js/marko/pull/1978) [`931a5d24b`](https://github.com/marko-js/marko/commit/931a5d24bbf77d7b29922f34d66d8ca7c42cea07) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoids loading babel config when compiler output is set to source or migrate. ## 5.28.4 ### Patch Changes - [#1976](https://github.com/marko-js/marko/pull/1976) [`7555a46a1`](https://github.com/marko-js/marko/commit/7555a46a19cee973b279fd582ffd51671490dc40) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where aggregate errors from the compiler were not exposing error objects (was exposing the raw diagnostics). - [#1976](https://github.com/marko-js/marko/pull/1976) [`7555a46a1`](https://github.com/marko-js/marko/commit/7555a46a19cee973b279fd582ffd51671490dc40) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Include locations and original message for errors thrown from the compiler. ## 5.28.3 ### Patch Changes - [#1974](https://github.com/marko-js/marko/pull/1974) [`42f7b46e2`](https://github.com/marko-js/marko/commit/42f7b46e25168ef4998e9c3f6014f9b6e1234486) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Run migration fixes synchronously. - Updated dependencies [[`42f7b46e2`](https://github.com/marko-js/marko/commit/42f7b46e25168ef4998e9c3f6014f9b6e1234486)]: - @marko/babel-utils@5.22.1 ## 5.28.2 ### Patch Changes - [#1972](https://github.com/marko-js/marko/pull/1972) [`897b8beba`](https://github.com/marko-js/marko/commit/897b8bebadbb08e0457fb959bd573cb2a5a4d593) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where error messages without a source location were losing their message ## 5.28.1 ### Patch Changes - [#1970](https://github.com/marko-js/marko/pull/1970) [`ce5c40c95`](https://github.com/marko-js/marko/commit/ce5c40c9570c3410f62a2c9feb635ee7c7e54799) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue when outputting hydrate code with commonjs modules enabled. ## 5.28.0 ### Minor Changes - [#1968](https://github.com/marko-js/marko/pull/1968) [`70922e68e`](https://github.com/marko-js/marko/commit/70922e68e07578a867fff846e9bb623d64298e14) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add support for additional diagnostics emitted from the compiler. ### Patch Changes - Updated dependencies [[`70922e68e`](https://github.com/marko-js/marko/commit/70922e68e07578a867fff846e9bb623d64298e14)]: - @marko/babel-utils@5.22.0 ## 5.27.10 ### Patch Changes - [#1957](https://github.com/marko-js/marko/pull/1957) [`820fa12f4`](https://github.com/marko-js/marko/commit/820fa12f40f33abc1811f148441ff834cfe4654b) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix compiler config type definitions ## 5.27.9 ### Patch Changes - [#1955](https://github.com/marko-js/marko/pull/1955) [`ca9bfa2a2`](https://github.com/marko-js/marko/commit/ca9bfa2a2b16cecdbb269a8116b3186166b07061) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix type definition for MarkoTagBody AST. ## 5.27.8 ### Patch Changes - [#1949](https://github.com/marko-js/marko/pull/1949) [`7f6b65a4b`](https://github.com/marko-js/marko/commit/7f6b65a4b6d34dad6b4f6961be3b8766b7146e63) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Use @internal module to host browser/worker remapped files. Improves support for some tools that don't work well with nested package.json files. ## 5.27.7 ### Patch Changes - [#1934](https://github.com/marko-js/marko/pull/1934) [`04d6fad6d`](https://github.com/marko-js/marko/commit/04d6fad6d599adc98d6f0ef00a5c44b4a4fc7485) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where types were not being stripped from the inline Marko component class. ## 5.27.6 ### Patch Changes - [#1929](https://github.com/marko-js/marko/pull/1929) [`c7a197a5c`](https://github.com/marko-js/marko/commit/c7a197a5c2e49e4b365d185d6e24ab431a61abc9) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Adds strict typescript types for the native HTML tags. ## 5.27.5 ### Patch Changes - [`712f68062`](https://github.com/marko-js/marko/commit/712f68062326b5fb71073b691d1761d4ac71bdc3) Thanks [@LuLaValva](https://github.com/LuLaValva)! - Add types for Marko translator-default ## 5.27.4 ### Patch Changes - [#1923](https://github.com/marko-js/marko/pull/1923) [`62afb3256`](https://github.com/marko-js/marko/commit/62afb3256a0c402e75b90f06af4e8cdc5c8112f3) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Remove class lifecycle types to avoid the need to `override` them. ## 5.27.3 ### Patch Changes - [#1921](https://github.com/marko-js/marko/pull/1921) [`1fe71a502`](https://github.com/marko-js/marko/commit/1fe71a5020c5930c63e9c7ff226a3befca0e58a4) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid using `typeof window` and prefer `typeof document` checks for browser environment (improves future deno support). - [#1921](https://github.com/marko-js/marko/pull/1921) [`f0c697d7b`](https://github.com/marko-js/marko/commit/f0c697d7b5b0afcbe524f390db2b3c5fa54d5607) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoids using a package.json remap for the browser implementation of the \_preserve internal tag (used to implement `no-update` directives). This fixes an issue where in vite the module could not be loaded properly. ## 5.27.2 ### Patch Changes - [#1920](https://github.com/marko-js/marko/pull/1920) [`7d5dab41c`](https://github.com/marko-js/marko/commit/7d5dab41c33cacbdff376570df09f65eb228a6a9) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid adding `export {}` (from "@babel/plugin-transform-typescript") when outputing a template with the types stripped. - [#1918](https://github.com/marko-js/marko/pull/1918) [`cceab7d20`](https://github.com/marko-js/marko/commit/cceab7d2061c627d5f3ea296f0acba80f97ad494) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Reduce script parsing restrictions added by Babel. This was causing Babel to error when parsing partial scripts. ```marko static const x = 1; export { x }; ``` Before this change in the above code Babel would error when parsing `export { x }` saying `x` was not previously defined. This is because Marko parses these statements in isolation. - [#1920](https://github.com/marko-js/marko/pull/1920) [`7d5dab41c`](https://github.com/marko-js/marko/commit/7d5dab41c33cacbdff376570df09f65eb228a6a9) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid outputing a `declare`'d type on a `class`. ## 5.27.1 ### Patch Changes - [#1916](https://github.com/marko-js/marko/pull/1916) [`ac1d5062a`](https://github.com/marko-js/marko/commit/ac1d5062a7be8bb359ba8d378d3c7b2ec6dc14f6) Thanks [@mlrawlings](https://github.com/mlrawlings)! - fix: modify/remove some inefficient regexes ## 5.27.0 ### Minor Changes - [#1909](https://github.com/marko-js/marko/pull/1909) [`e8f1370cf`](https://github.com/marko-js/marko/commit/e8f1370cf668bb579e48fd05a60c086bed6bb466) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Allow repeated attribute tags without using a `marko.json` file. Attribute tag objects now also contain `Symbol.iterator` implementation to make the single case more easily forwarded to the `` tag. ### Patch Changes - [#1914](https://github.com/marko-js/marko/pull/1914) [`22228e804`](https://github.com/marko-js/marko/commit/22228e804c76d630c0fc333fa4750bb6e42c0814) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrades the included version of HTMLJS-Parser ## 5.26.0 ### Minor Changes - [#1907](https://github.com/marko-js/marko/pull/1907) [`7211a6937`](https://github.com/marko-js/marko/commit/7211a6937b2044a14f2c2194269a697c76066b54) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose `$global` as a shorthand for `out.global` within the template scope. ## 5.25.0 ### Minor Changes - [#1899](https://github.com/marko-js/marko/pull/1899) [`4fc38e800`](https://github.com/marko-js/marko/commit/4fc38e80010241da76d24a46c2cd838aa5cf309f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose the ability to intercept errors from the taglib builder. ## 5.24.0 ### Minor Changes - [#1897](https://github.com/marko-js/marko/pull/1897) [`72cdc3e5b`](https://github.com/marko-js/marko/commit/72cdc3e5b6c72a0b5d4b4738eb420571fa0cafa4) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Expose a top level `@marko/compiler/config` entry point for loading the default compiler config. ## 5.23.6 ### Patch Changes - [#1892](https://github.com/marko-js/marko/pull/1892) [`c55ae937c`](https://github.com/marko-js/marko/commit/c55ae937c4d756482d49a6b8797669cd39ca6288) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve types for the await tag and Marko.Template. ## 5.23.5 ### Patch Changes - [#1888](https://github.com/marko-js/marko/pull/1888) [`d110b0b5f`](https://github.com/marko-js/marko/commit/d110b0b5f6607a911d15b2045d46b9aa6ecba2d2) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve type definitions. ## 5.23.4 ### Patch Changes - [`23e36a04b`](https://github.com/marko-js/marko/commit/23e36a04b0c6f7d6b53307d7838f61a1e0f2ce29) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add missing type definition file to exposed types in package.json. - [`d920e833d`](https://github.com/marko-js/marko/commit/d920e833df0b58456f28f7cb45ebd38b56c05ba7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add missing type definition for taglib. - Updated dependencies [[`d920e833d`](https://github.com/marko-js/marko/commit/d920e833df0b58456f28f7cb45ebd38b56c05ba7)]: - @marko/babel-utils@5.21.4 ## 5.23.3 ### Patch Changes - [#1885](https://github.com/marko-js/marko/pull/1885) [`f1efd707a`](https://github.com/marko-js/marko/commit/f1efd707aa1c2aeac092ef7fff4ef5cb959f45b6) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Add taglib extensions and type definitions for typescript support. ## 5.23.2 ### Patch Changes - [#1880](https://github.com/marko-js/marko/pull/1880) [`c4cce33e8`](https://github.com/marko-js/marko/commit/c4cce33e8c917af7c45ffc64d748e88364a0b91a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix an issue where merging scripts (via the out.script api) was not properly inserting delimeters when scripts are added in different async writers. ## 5.23.1 ### Patch Changes - [#1875](https://github.com/marko-js/marko/pull/1875) [`b744720db`](https://github.com/marko-js/marko/commit/b744720db5483633643c5a75bd2eedc37aa9ff25) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrades "magic-string" module (used for css sourcemaps) to avoid deprecation warning. ## 5.23.0 ### Minor Changes - [#1865](https://github.com/marko-js/marko/pull/1865) [`797e90489`](https://github.com/marko-js/marko/commit/797e90489359e1e87a9756da5082c1e085555546) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Changes the "default" attributes name to be "value". This is technically a breaking change, but it primarily only impacts the tags-api-preview which will also be getting a release to support this change. ## 5.22.10 ### Patch Changes - [#1862](https://github.com/marko-js/marko/pull/1862) [`30e0ea43d`](https://github.com/marko-js/marko/commit/30e0ea43d56e0a3c59748eae32a0ab85921c1aeb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Avoid mutating component instance in HMR mode. (Improves support in tags api preview) ## 5.22.9 ### Patch Changes - [#1860](https://github.com/marko-js/marko/pull/1860) [`e64809458`](https://github.com/marko-js/marko/commit/e648094582c6a5c10d567bb7c844b50b6541e355) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve tag scanning performance. * [#1860](https://github.com/marko-js/marko/pull/1860) [`e64809458`](https://github.com/marko-js/marko/commit/e648094582c6a5c10d567bb7c844b50b6541e355) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Update htmljs-parser version. ## 5.22.8 ### Patch Changes - [#1855](https://github.com/marko-js/marko/pull/1855) [`760824659`](https://github.com/marko-js/marko/commit/76082465962b99c6b6f364104c2f135901534c0a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix browser-refresh client support when using @marko/compiler/register ## 5.22.7 ### Patch Changes - [#1853](https://github.com/marko-js/marko/pull/1853) [`76771598e`](https://github.com/marko-js/marko/commit/76771598e83f143697c9a2bca3869f3c9fcf6ab1) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Enable the meta option for the compiler when @marko/compiler/register is used. This makes usage with lasso easier. ## 5.22.6 ### Patch Changes - [#1845](https://github.com/marko-js/marko/pull/1845) [`65bab8e6d`](https://github.com/marko-js/marko/commit/65bab8e6df02e6fd485a45d9a9c2200545f21479) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where Marko runtime was being incorrectly matched when swapping from dev to prod runtimes. - Updated dependencies [[`65bab8e6d`](https://github.com/marko-js/marko/commit/65bab8e6df02e6fd485a45d9a9c2200545f21479)]: - @marko/babel-utils@5.21.3 ## 5.22.5 ### Patch Changes - [#1843](https://github.com/marko-js/marko/pull/1843) [`963f08ce9`](https://github.com/marko-js/marko/commit/963f08ce92e56f1d210068bedd5fc033b6db71c0) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade htmljs-parser. ## 5.22.4 ### Patch Changes - [#1841](https://github.com/marko-js/marko/pull/1841) [`26cd305ea`](https://github.com/marko-js/marko/commit/26cd305ea4391fb4846c07d5ba4984cc152584e7) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade htmljs-parser. ## 5.22.3 ### Patch Changes - [#1839](https://github.com/marko-js/marko/pull/1839) [`1df553e45`](https://github.com/marko-js/marko/commit/1df553e45829c7e0d754c5fec2c7d65e74c89457) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade HTMLJS-Parser. ## 5.22.2 ### Patch Changes - [#1837](https://github.com/marko-js/marko/pull/1837) [`63161abed`](https://github.com/marko-js/marko/commit/63161abed5fa071e88d06646bf0f55f0c6852b54) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with source map position for shorthand attribute methods. ## 5.22.1 ### Patch Changes - [#1830](https://github.com/marko-js/marko/pull/1830) [`efd6da235`](https://github.com/marko-js/marko/commit/efd6da23587567ddf035c06a9ab82472ca1683bb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue with parsing type definitions for tag variables ## 5.22.0 ### Minor Changes - [#1826](https://github.com/marko-js/marko/pull/1826) [`e285cbbd1`](https://github.com/marko-js/marko/commit/e285cbbd1092afb1e669156777a3a9ccd46affb2) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Support removing typescript types. ## 5.21.7 ### Patch Changes - [#1824](https://github.com/marko-js/marko/pull/1824) [`2f6459d2c`](https://github.com/marko-js/marko/commit/2f6459d2c421ac82c4627c90f1c50cb229a99d33) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where shorthand attribute methods could not have a "return" statement. ## 5.21.6 ### Patch Changes - [#1814](https://github.com/marko-js/marko/pull/1814) [`b11f9d076`](https://github.com/marko-js/marko/commit/b11f9d076f40a0997c5c8534804ebc1b87d417cc) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade htmljs-parser. ## 5.21.5 ### Patch Changes - [#1811](https://github.com/marko-js/marko/pull/1811) [`49ef9801b`](https://github.com/marko-js/marko/commit/49ef9801b506ea6b7eafcb46e759a3463b0efd3d) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrade htmljs-parser to improve source location information. ## 5.21.4 ### Patch Changes - [#1806](https://github.com/marko-js/marko/pull/1806) [`04adc2d24`](https://github.com/marko-js/marko/commit/04adc2d24eb0111d6e4a8bd760d420199240cb2f) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix issue where attribute shorthand methods would have incorrect sourcemap position. ## 5.21.3 ### Patch Changes - [#1800](https://github.com/marko-js/marko/pull/1800) [`c352de67e`](https://github.com/marko-js/marko/commit/c352de67ecb19d45d9c6874a8ba048fb656bb562) Thanks [@mlrawlings](https://github.com/mlrawlings)! - fix: update deps, inline babel helper removed from latest version ## 5.21.2 ### Patch Changes - [#1797](https://github.com/marko-js/marko/pull/1797) [`5921c2297`](https://github.com/marko-js/marko/commit/5921c2297297698c4026f0a4d077c364c42e038a) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Pin a newer version of htmljs-parser that fixes some parser bugs. See: https://github.com/marko-js/htmljs-parser/pull/103 ## 5.21.1 ### Patch Changes - [#1792](https://github.com/marko-js/marko/pull/1792) [`c9107ea7f`](https://github.com/marko-js/marko/commit/c9107ea7f6fc69df10700114fe35b7b494414194) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix broken previous release where the "main" field for package.json files was not correctly updated when published - Updated dependencies [[`c9107ea7f`](https://github.com/marko-js/marko/commit/c9107ea7f6fc69df10700114fe35b7b494414194)]: - @marko/babel-utils@5.21.1 ## 5.21.0 ### Minor Changes - [#1787](https://github.com/marko-js/marko/pull/1787) [`dd9009d66`](https://github.com/marko-js/marko/commit/dd9009d665f4f660d106aa0c3364e34ca3561abc) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Upgrades the compiler to use the latest major release of `htmljs-parser` bringing in the improvements listed here: https://github.com/marko-js/htmljs-parser/pull/93 ### Patch Changes - Updated dependencies [[`dd9009d66`](https://github.com/marko-js/marko/commit/dd9009d665f4f660d106aa0c3364e34ca3561abc)]: - @marko/babel-utils@5.21.0 ## [5.20.9](https://github.com/marko-js/marko/compare/v5.20.8...v5.20.9) (2022-04-27) **Note:** Version bump only for package @marko/compiler ## [5.20.8](https://github.com/marko-js/marko/compare/v5.20.7...v5.20.8) (2022-04-26) ### Bug Fixes - type for BabelFile.markoConfig now reflects defaulted values ([cd49696](https://github.com/marko-js/marko/commit/cd496964c13af64b626a9cc10a3b55658e7418c8)) ## [5.20.7](https://github.com/marko-js/marko/compare/v5.20.6...v5.20.7) (2022-04-26) ### Bug Fixes - set cache entry before analysis to prevent infinite recursion ([d327864](https://github.com/marko-js/marko/commit/d3278640dbc403221c070f4529f18e9a05a60370)) ## [5.20.6](https://github.com/marko-js/marko/compare/v5.20.5...v5.20.6) (2022-04-25) **Note:** Version bump only for package @marko/compiler ## [5.20.5](https://github.com/marko-js/marko/compare/v5.20.4...v5.20.5) (2022-04-15) ### Bug Fixes - **translator-default:** string literals in dynamic tags incorrectly doing component lookup ([28aa2e8](https://github.com/marko-js/marko/commit/28aa2e84c1f7335f77c2d0ef29d30453401e7b0d)) ## [5.20.4](https://github.com/marko-js/marko/compare/v5.20.3...v5.20.4) (2022-04-11) ### Bug Fixes - autoloading translators ([5eda8f3](https://github.com/marko-js/marko/commit/5eda8f388a9d0d253f4cda5c13bd5e716cbbc18d)) ## [5.20.3](https://github.com/marko-js/marko/compare/v5.20.2...v5.20.3) (2022-03-24) **Note:** Version bump only for package @marko/compiler ## [5.20.2](https://github.com/marko-js/marko/compare/v5.20.1...v5.20.2) (2022-03-23) **Note:** Version bump only for package @marko/compiler # [5.20.0](https://github.com/marko-js/marko/compare/v5.19.3...v5.20.0) (2022-03-11) **Note:** Version bump only for package @marko/compiler ## [5.19.1](https://github.com/marko-js/marko/compare/v5.19.0...v5.19.1) (2022-01-28) **Note:** Version bump only for package @marko/compiler # [5.19.0](https://github.com/marko-js/marko/compare/v5.18.2...v5.19.0) (2022-01-28) ### Features - support analyze field in marko.json ([#1769](https://github.com/marko-js/marko/issues/1769)) ([981f7f3](https://github.com/marko-js/marko/commit/981f7f39f932533178c538f8fc2788ea6f93d909)) ## [5.18.2](https://github.com/marko-js/marko/compare/v5.18.1...v5.18.2) (2022-01-25) **Note:** Version bump only for package @marko/compiler ## [5.18.1](https://github.com/marko-js/marko/compare/v5.18.0...v5.18.1) (2022-01-25) **Note:** Version bump only for package @marko/compiler # [5.18.0](https://github.com/marko-js/marko/compare/v5.17.10...v5.18.0) (2022-01-24) **Note:** Version bump only for package @marko/compiler ## [5.17.10](https://github.com/marko-js/marko/compare/v5.17.9...v5.17.10) (2022-01-14) ### Bug Fixes - issue with dynamic tag names not tracking references ([9d86540](https://github.com/marko-js/marko/commit/9d86540a37b0028370206d2367c0a2fc8a724575)) ## [5.17.6](https://github.com/marko-js/marko/compare/v5.17.5...v5.17.6) (2022-01-02) **Note:** Version bump only for package @marko/compiler ## [5.17.4](https://github.com/marko-js/marko/compare/v5.17.3...v5.17.4) (2021-11-17) ### Bug Fixes - hoisted variable scopes clean up ([32f382b](https://github.com/marko-js/marko/commit/32f382bb0d054f2cb3709d571a0b95ac267f0523)) ## [5.17.3](https://github.com/marko-js/marko/compare/v5.17.2...v5.17.3) (2021-10-30) ### Bug Fixes - upgrade babel deps & fix builder regression ([91b3c58](https://github.com/marko-js/marko/commit/91b3c5855923adb64ab30677729e2d0404245846)) ## [5.16.1](https://github.com/marko-js/marko/compare/v5.16.0...v5.16.1) (2021-10-22) ### Bug Fixes - regression with identical tag name & taglib deduping ([a8d85d7](https://github.com/marko-js/marko/commit/a8d85d7771378d0e995c988cabe4b511ab95dc3d)) - upgrade htmljs-parser ([d95a37c](https://github.com/marko-js/marko/commit/d95a37c01ae3ddb7532f3add20b7feb8268e728f)) # [5.16.0](https://github.com/marko-js/marko/compare/v5.15.12...v5.16.0) (2021-10-11) ### Features - upgrade htmljs-parser ([a53fc71](https://github.com/marko-js/marko/commit/a53fc717c1c019e764c677af8665a5159c885dd8)) ## [5.15.11](https://github.com/marko-js/marko/compare/v5.15.10...v5.15.11) (2021-09-29) ### Bug Fixes - normalize file opts similar to babel ([86310e6](https://github.com/marko-js/marko/commit/86310e603985ed96cba523fb07e25a0852cff8e6)) ## [5.15.10](https://github.com/marko-js/marko/compare/v5.15.9...v5.15.10) (2021-09-07) **Note:** Version bump only for package @marko/compiler ## [5.15.9](https://github.com/marko-js/marko/compare/v5.15.8...v5.15.9) (2021-09-05) ### Bug Fixes - attribute shorthand method source locations ([20e3cf4](https://github.com/marko-js/marko/commit/20e3cf42aa35392edb8582491abf1a31b6a06d8a)) ## [5.15.8](https://github.com/marko-js/marko/compare/v5.15.7...v5.15.8) (2021-09-05) ### Bug Fixes - consistent file.opts during parse & other stages ([ff07ead](https://github.com/marko-js/marko/commit/ff07eadde29ace7aaf4323d11f78c892fdc8f0ed)) - incorrect source position for attribute arguments ([0c0ff04](https://github.com/marko-js/marko/commit/0c0ff04e767342c910f5087faf4bdef2778f0f92)) ## [5.15.7](https://github.com/marko-js/marko/compare/v5.15.6...v5.15.7) (2021-09-03) **Note:** Version bump only for package @marko/compiler ## [5.15.6](https://github.com/marko-js/marko/compare/v5.15.5...v5.15.6) (2021-09-03) ### Bug Fixes - supports babel 7.15.4 ([a301a87](https://github.com/marko-js/marko/commit/a301a870e8e719d770ccef1958e9d9c03a93d765)) ## [5.15.4](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.15.3...v5.15.4) (2021-08-07) ### Bug Fixes - improve compiler register hook types ([ecdafa0](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ecdafa047cdcbe87b941856102a00da34d8efe25)) ## [5.15.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.15.2...v5.15.3) (2021-08-06) **Note:** Version bump only for package @marko/compiler ## [5.15.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.15.1...v5.15.2) (2021-08-06) ### Bug Fixes - issue with hoisted tag var scopes ([86162a1](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/86162a1471aeb2d6f6729ef2ed872092b549105b)) # [5.15.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.14.2...v5.15.0) (2021-07-28) ### Features - expose @marko/compiler/register api ([5726899](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/572689909618939585e93c1a0d1ab101ff73aefd)) ## [5.14.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.14.1...v5.14.2) (2021-07-28) ### Bug Fixes - support method shorthand from updated parser ([accb1bf](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/accb1bf51ff73ccff5f3fcbd0c65172b9a7a262a)) ## [5.14.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.14.0...v5.14.1) (2021-07-26) ### Bug Fixes - **compiler:** issue with getters on taglibs not properly merging ([c728439](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c728439906bc87a9167f02aecd979e5801b1c415)) # [5.14.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.13.0...v5.14.0) (2021-07-24) ### Bug Fixes - issue with root translator running in hydrate mode ([56495ae](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/56495aee99f1adbbdbdc08324561fbbd62ae95a1)) ### Features - lazy load load compiler hook paths, expose error loc object ([f49fc19](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f49fc1901bb1fc66ae1eb64b98ce2402d4faa8fa)) # [5.13.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.12.1...v5.13.0) (2021-07-23) ### Features - add support for new binding shorthand syntax ([1c20064](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/1c20064bdf04c3491b40e68aa6e57113dd40bc40)) ## [5.12.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.12.0...v5.12.1) (2021-07-21) ### Bug Fixes - issue with tag var scope hoisting ([ed8de11](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ed8de119f1d81da04f2006922864be0ef8a60ab0)) # [5.12.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.11.3...v5.12.0) (2021-07-12) **Note:** Version bump only for package @marko/compiler ## [5.11.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.11.2...v5.11.3) (2021-07-08) **Note:** Version bump only for package @marko/compiler ## [5.11.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.11.1...v5.11.2) (2021-07-07) ### Bug Fixes - incorrect search file types for taglib lookup ([4e6bd9a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/4e6bd9a2e9de27566b78c98301715054c421c264)) ## [5.11.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.11.0...v5.11.1) (2021-07-07) ### Bug Fixes - add missing compiler hook aliases during taglib loading ([0e008e3](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/0e008e33e5c39d99b6a0744c1ad0132adbd0bf6a)) # [5.11.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.7...v5.11.0) (2021-07-07) ### Features - add hoisting support for tag var bindings ([956a80c](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/956a80c5c28948745b0e554971853d88ceb41871)) - support taglib translate hook, support arrays in taglib hooks ([e2b0e66](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/e2b0e66138acec5ee11ec0f582da99391a5c7396)) ## [5.10.7](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.6...v5.10.7) (2021-06-23) ### Bug Fixes - **compiler:** improve sourceMap config option type definition ([5a5092e](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/5a5092e89d77046b046db2d34a1d34715f93756e)) ## [5.10.6](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.5...v5.10.6) (2021-06-10) **Note:** Version bump only for package @marko/compiler ## [5.10.5](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.4...v5.10.5) (2021-06-08) **Note:** Version bump only for package @marko/compiler ## [5.10.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.1...v5.10.2) (2021-05-04) ### Bug Fixes - **compiler:** var name typo ([8aaf910](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/8aaf9105323587fae4f40dd69a2497f114a867c5)) ## [5.10.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.10.0...v5.10.1) (2021-05-04) ### Bug Fixes - **compiler:** issue with undefined added to watchFiles ([4704b62](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/4704b62a81165856a803b2155946b4d143d58287)) # [5.10.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.9.0...v5.10.0) (2021-04-30) ### Features - add new HMR runtime ([a873762](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/a87376299952c8f9fc5c3d467c571acc0956bfb3)) # [5.9.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.8.4...v5.9.0) (2021-04-21) ### Features - expose api to get runtime entry files for translator ([#1687](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1687)) ([fad9159](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/fad91598b28f3ab6e8e3550e42c50d062ea41ad9)) ## [5.8.4](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.8.3...v5.8.4) (2021-04-19) **Note:** Version bump only for package @marko/compiler ## [5.8.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.8.2...v5.8.3) (2021-04-18) **Note:** Version bump only for package @marko/compiler ## [5.8.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.8.1...v5.8.2) (2021-04-18) **Note:** Version bump only for package @marko/compiler ## [5.8.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.8.0...v5.8.1) (2021-04-16) ### Bug Fixes - **compiler:** add missing config type definition ([7437e88](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/7437e888b7cbd3c7f8ed5ae164d959d8c0d7eb04)) # [5.8.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.7.0...v5.8.0) (2021-04-16) ### Features - add new hydrateIncludeImports option ([#1686](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1686)) ([db84f91](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/db84f913b47e4372c84c09a34ca8529b646b7869)) # [5.7.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.6.2...v5.7.0) (2021-04-07) ### Features - **compiler:** use default translator for buildLookup api ([#1682](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1682)) ([0899847](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/0899847ea80dc65d6d8b80114f7caaf77cadccf5)) ## [5.6.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.6.1...v5.6.2) (2021-03-30) **Note:** Version bump only for package @marko/compiler ## [5.6.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.6.0...v5.6.1) (2021-03-27) **Note:** Version bump only for package @marko/compiler # [5.6.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.5.4...v5.6.0) (2021-03-27) **Note:** Version bump only for package @marko/compiler ## [5.5.4](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.5.3...v5.5.4) (2021-03-22) **Note:** Version bump only for package @marko/compiler ## [5.5.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.5.2...v5.5.3) (2021-03-22) **Note:** Version bump only for package @marko/compiler ## [5.5.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.5.1...v5.5.2) (2021-03-19) ### Bug Fixes - cast result of readFile to string ([#1679](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1679)) ([501a7fb](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/501a7fbfbe9e12869fd685f1e5c8ee4417da816d)) ## [5.5.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.5.0...v5.5.1) (2021-03-18) ### Bug Fixes - **compiler:** type definitions had incorrect path ([f7d4eb9](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f7d4eb981e80f87394ab64976e5f31156f80a408)) # [5.5.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.4.2...v5.5.0) (2021-03-18) ### Bug Fixes - **compiler:** use provided FS for taglib building ([#1674](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1674)) ([edb570e](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/edb570eda4b3d544795536bf81613f6c97c9859a)) - correct Marko debug mode for ci tests ([031ca0d](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/031ca0d93fa77a3405b95467e7a98f2c5a8120de)) ### Features - add hydrate option ([#1673](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1673)) ([a4e7013](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/a4e701355efcd93971eb46988f5e990f4517796f)) ## [5.4.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.4.1...v5.4.2) (2021-03-10) **Note:** Version bump only for package @marko/compiler ## [5.4.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.4.0...v5.4.1) (2021-03-10) **Note:** Version bump only for package @marko/compiler # [5.4.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.3.0...v5.4.0) (2021-03-10) **Note:** Version bump only for package @marko/compiler ## [5.2.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.2.1...v5.2.2) (2021-03-01) ### Bug Fixes - add some additional missing deps from marko to @marko/compiler ([65ac580](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/65ac580e57cb42ab94adc447c9b59744a69c8b64)) ## [5.2.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.2.0...v5.2.1) (2021-03-01) ### Bug Fixes - **compiler:** add missing dependency after moving taglib code ([ae843f1](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ae843f1b802fcbc1c7347247247a3c8551f6cfd2)) # [5.2.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.21...v5.2.0) (2021-03-01) ### Features - move taglib apis into compiler source code ([f7cbb1b](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f7cbb1b5719ce767b7970ca7264a081010e8e65a)) ## [5.1.21](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.20...v5.1.21) (2021-03-01) **Note:** Version bump only for package @marko/compiler ## [5.1.20](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.19...v5.1.20) (2021-02-26) **Note:** Version bump only for package @marko/compiler ## [5.1.19](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.18...v5.1.19) (2021-02-26) ### Bug Fixes - **marko:** bring back hot-reload when node-require hook used ([8d856a0](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/8d856a0250a1f2522f06a91a11c2d73c6a05e7b2)) - move @marko/babel-types into compiler ([5369a63](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/5369a63e0ce66c422981893525ff6c9bcbd461dd)) - **compiler:** issue with path.state missing ([22ab5b2](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/22ab5b282ad5b8eedf2705956a45d21cc1d55717)) ## [5.1.18](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.17...v5.1.18) (2021-02-21) **Note:** Version bump only for package @marko/compiler ## [5.1.17](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.16...v5.1.17) (2021-02-18) **Note:** Version bump only for package @marko/compiler ## [5.1.16](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.15...v5.1.16) (2021-02-17) **Note:** Version bump only for package @marko/compiler ## [5.1.15](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.14...v5.1.15) (2021-02-13) **Note:** Version bump only for package @marko/compiler ## [5.1.14](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.13...v5.1.14) (2021-02-12) **Note:** Version bump only for package @marko/compiler ## [5.1.13](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.12...v5.1.13) (2021-02-12) **Note:** Version bump only for package @marko/compiler ## [5.1.12](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.11...v5.1.12) (2021-02-12) **Note:** Version bump only for package @marko/compiler ## [5.1.11](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.10...v5.1.11) (2021-02-11) **Note:** Version bump only for package @marko/compiler ## [5.1.10](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.9...v5.1.10) (2021-02-05) **Note:** Version bump only for package @marko/compiler ## [5.1.9](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.8...v5.1.9) (2021-02-03) **Note:** Version bump only for package @marko/compiler ## [5.1.8](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.7...v5.1.8) (2021-02-02) **Note:** Version bump only for package @marko/compiler ## [5.1.7](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.6...v5.1.7) (2021-02-01) **Note:** Version bump only for package @marko/compiler ## [5.1.6](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.5...v5.1.6) (2021-01-29) ### Bug Fixes - **compiler:** improve type definitions ([291690e](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/291690edb061afd0f98a8eb514db6b8f429fe5a0)) ## [5.1.5](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.4...v5.1.5) (2021-01-28) ### Bug Fixes - issue with bundled compiler not respecting NODE_ENV ([c7be2a7](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c7be2a7052366bff706eb2622a6b059866294b5b)) ## [5.1.4](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.3...v5.1.4) (2021-01-27) **Note:** Version bump only for package @marko/compiler ## [5.1.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.2...v5.1.3) (2021-01-27) **Note:** Version bump only for package @marko/compiler ## [5.1.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.1...v5.1.2) (2021-01-26) **Note:** Version bump only for package @marko/compiler ## [5.1.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.1.0...v5.1.1) (2021-01-26) **Note:** Version bump only for package @marko/compiler # [5.1.0](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.82...v5.1.0) (2021-01-26) ### Features - no longer publish as 'next' dist-tag ([8113e25](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/8113e250d823000810d0fa13d76efc4cc69f4ad1)) # [5.0.0-next.82](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.81...v5.0.0-next.82) (2021-01-21) ### Bug Fixes - issue with path.hub being missing when traversing ([7aef97c](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/7aef97ca48ec26be19a1e5527156cc1c9a13b674)) # [5.0.0-next.81](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.80...v5.0.0-next.81) (2021-01-20) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.80](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.79...v5.0.0-next.80) (2021-01-19) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.79](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.78...v5.0.0-next.79) (2021-01-19) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.78](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.77...v5.0.0-next.78) (2021-01-19) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.77](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.76...v5.0.0-next.77) (2021-01-19) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.76](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.75...v5.0.0-next.76) (2021-01-15) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.75](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.74...v5.0.0-next.75) (2021-01-14) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.74](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.73...v5.0.0-next.74) (2021-01-14) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.73](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.72...v5.0.0-next.73) (2021-01-14) ### Bug Fixes - use same debug check for compiler and runtime ([#1647](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1647)) ([0c8632f](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/0c8632fe92d06b27d0741fa2d5a2b599f0890693)) # [5.0.0-next.72](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.71...v5.0.0-next.72) (2021-01-13) ### Features - **compiler:** support string as translator option ([0c6e968](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/0c6e968b4eadd9c792c8495cd218791b04206ec5)) # [5.0.0-next.71](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.70...v5.0.0-next.71) (2021-01-12) ### Features - move tag param ast to MarkoTagBody ([02c1e29](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/02c1e29426b7995d869ab8a9fd1f8dd6dccaeca5)) # [5.0.0-next.70](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.69...v5.0.0-next.70) (2020-12-16) ### Features - add cached analyze stage ([bb6a050](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/bb6a050bbb82d5a4fcfc5e1ca6835d36a67809fa)) # [5.0.0-next.69](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.68...v5.0.0-next.69) (2020-12-14) ### Features - **compiler:** provide state object during compiler hooks ([24cefa4](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/24cefa4c068a8b272aa998391a695d2efd5d9786)) # [5.0.0-next.68](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.67...v5.0.0-next.68) (2020-12-11) ### Features - **babel-utils:** expose import and id utils ([#1636](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1636)) ([644e4d8](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/644e4d8756c2260a1e2d28374a31a67552414179)) # [5.0.0-next.67](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.66...v5.0.0-next.67) (2020-12-09) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.66](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.65...v5.0.0-next.66) (2020-12-08) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.65](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.64...v5.0.0-next.65) (2020-12-02) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.64](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.63...v5.0.0-next.64) (2020-12-02) ### Bug Fixes - **babel-types:** support scope analysis for tag variables ([c527474](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c5274740b5fde01b85b8b46381fadf2fc75245f2)) # [5.0.0-next.63](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.62...v5.0.0-next.63) (2020-12-01) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.62](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.61...v5.0.0-next.62) (2020-12-01) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.61](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.60...v5.0.0-next.61) (2020-12-01) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.60](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.59...v5.0.0-next.60) (2020-11-22) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.59](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.58...v5.0.0-next.59) (2020-11-21) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.58](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.57...v5.0.0-next.58) (2020-11-20) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.57](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.56...v5.0.0-next.57) (2020-11-20) ### Bug Fixes - **translator-default:** ensure accruate component id metadata ([c4b0360](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c4b036058ea57f31e151e0dae965858839d1795c)) ### Features - add default attribute support ([#1631](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1631)) ([46ceab3](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/46ceab34a5c1815933b8b2a9f3533716ae0fedcf)) - add parser support for tag variables ([#1630](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1630)) ([43c4433](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/43c4433cb026f7eace199203e15d1050a53dc35d)) # [5.0.0-next.56](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.55...v5.0.0-next.56) (2020-11-20) ### Bug Fixes - **compiler:** no longer error when compiling from root dir ([fe84fb3](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/fe84fb345affb4a48e10d51df18bcf1114e12d3f)) # [5.0.0-next.55](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.54...v5.0.0-next.55) (2020-11-19) ### Bug Fixes - babel-utils doesnt depend on compiler ([c429ffb](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c429ffb0aa4e79210b881d089a3db19d272a750d)) # [5.0.0-next.54](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.53...v5.0.0-next.54) (2020-11-17) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.53](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.52...v5.0.0-next.53) (2020-11-17) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.52](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.51...v5.0.0-next.52) (2020-11-12) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.51](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.50...v5.0.0-next.51) (2020-11-11) ### Features - cached compilations, nested tag analysis ([74d5f10](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/74d5f104b8f35178c399ab5c3514c33f8b63cdf0)) # [5.0.0-next.50](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.49...v5.0.0-next.50) (2020-10-12) ### Bug Fixes - no longer use fragments for preserved native els ([22e9322](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/22e9322a7e72b50812ab223f70bf9e68aee2208d)) # [5.0.0-next.49](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.48...v5.0.0-next.49) (2020-09-28) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.48](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.47...v5.0.0-next.48) (2020-09-18) ### Bug Fixes - **compiler:** improve hash template id performance and consistency ([d111748](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/d11174853f02b4edf25cb4b1b3cf0b687ca2bf4e)) # [5.0.0-next.47](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.46...v5.0.0-next.47) (2020-09-18) ### Bug Fixes - **compiler:** normalize windows paths when creating relative requires ([daf2b1a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/daf2b1af37d1c14175b69b52373d7d36ad115c59)) # [5.0.0-next.46](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.45...v5.0.0-next.46) (2020-09-17) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.45](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.44...v5.0.0-next.45) (2020-08-26) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.44](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.43...v5.0.0-next.44) (2020-08-26) ### Bug Fixes - typo with aria-describedby autocomplete ([f499634](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f499634679eb97003e45e1a9923590abc9190f06)) # [5.0.0-next.43](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.42...v5.0.0-next.43) (2020-08-20) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.42](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.41...v5.0.0-next.42) (2020-08-18) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.41](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.40...v5.0.0-next.41) (2020-08-18) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.40](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.39...v5.0.0-next.40) (2020-08-12) ### Bug Fixes - component type use relative path in dev mode ([7b7a4f9](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/7b7a4f9637648c7ded113fd132ce3ce5f2785e0a)) # [5.0.0-next.39](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.38...v5.0.0-next.39) (2020-08-10) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.38](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.37...v5.0.0-next.38) (2020-08-10) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.37](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.36...v5.0.0-next.37) (2020-08-05) ### Features - only enable optimization stage for production mode ([ee16e96](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ee16e96580b67e0cacb87a78001be940dc0324df)) # [5.0.0-next.36](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.35...v5.0.0-next.36) (2020-08-05) ### Features - expose watch file meta data ([#1591](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1591)) ([f14e46a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f14e46a1f3ddd01f659a0f86678773fb12a7f1a5)) # [5.0.0-next.35](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.34...v5.0.0-next.35) (2020-08-04) ### Features - add custom fileSystem config option ([#1590](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1590)) ([212dda9](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/212dda9c004af1958feacf5c9be9ac381feb2708)) # [5.0.0-next.34](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.33...v5.0.0-next.34) (2020-08-04) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.33](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.32...v5.0.0-next.33) (2020-08-03) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.32](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.31...v5.0.0-next.32) (2020-07-31) ### Bug Fixes - **compiler:** regression with sourcemaps ([bb818c8](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/bb818c8423e1d1cc4528c951b08ddab1579f25a9)) # [5.0.0-next.31](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.30...v5.0.0-next.31) (2020-07-31) ### Features - improve index position to line, column perf ([680dad6](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/680dad65dafdb4300d3f86ea2be6bb322ecd7de9)) # [5.0.0-next.30](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.29...v5.0.0-next.30) (2020-07-29) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.29](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.28...v5.0.0-next.29) (2020-07-29) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.28](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.27...v5.0.0-next.28) (2020-07-27) ### Bug Fixes - **compiler:** false positive for concise mode dynamic tag error ([94c41ca](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/94c41ca8f18dfcc50e1ecb23bdc25b3231e7b790)) # [5.0.0-next.27](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.26...v5.0.0-next.27) (2020-07-24) ### Bug Fixes - **compiler:** make taglib entry more bundler friendly ([1e89380](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/1e8938085a815b5d9485c3a38b7b643770566282)) # [5.0.0-next.26](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.25...v5.0.0-next.26) (2020-07-24) ### Bug Fixes - load correct taglib utils based on env ([#1585](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1585)) ([af2bc2a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/af2bc2a11c45cab380e9698af2d1329b4d4eb8d6)) # [5.0.0-next.25](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.24...v5.0.0-next.25) (2020-07-23) ### Bug Fixes - remove unecessary allExtensions api ([9a2c439](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/9a2c439b740fd3431e2d07f3112a8dfe8c734d74)) # [5.0.0-next.24](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.23...v5.0.0-next.24) (2020-07-22) ### Features - **compiler:** expose register taglib api ([#1583](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1583)) ([c45c082](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/c45c082b8f4b4a3548271b4526231e22b6d24222)) # [5.0.0-next.23](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.22...v5.0.0-next.23) (2020-07-14) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.22](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.21...v5.0.0-next.22) (2020-07-10) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.21](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.20...v5.0.0-next.21) (2020-07-07) ### Features - switch to storing marko meta on babels metadata ([ee6ad38](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ee6ad38d9f31fe1d1314350ddd011a39c6c2ab9a)) # [5.0.0-next.20](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.19...v5.0.0-next.20) (2020-07-07) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.19](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.18...v5.0.0-next.19) (2020-07-06) ### Bug Fixes - support manually registered taglibs ([9dc4d07](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/9dc4d07d1bfe4bb1c898e16a28289f021917c75f)) # [5.0.0-next.18](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.17...v5.0.0-next.18) (2020-05-27) ### Bug Fixes - **compiler:** modules override warning when compiled with webpack ([af28bac](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/af28bac6f60b268c88ebe28ab7d74807487cf3b1)) # [5.0.0-next.17](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.16...v5.0.0-next.17) (2020-05-27) ### Bug Fixes - additional taglib cleanup for website support ([f462d8a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/f462d8ad95c1d438561f028a7d2a79accccbe739)) # [5.0.0-next.16](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.15...v5.0.0-next.16) (2020-05-27) ### Features - website compatibility fixes ([4390fd1](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/4390fd1654d7b2753d2af899917ced7b3a395bc2)) # [5.0.0-next.15](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.14...v5.0.0-next.15) (2020-05-26) ### Features - **compiler:** require passing custom translator directly ([b9d4c46](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/b9d4c46ff3b6d3685c01f7b82e591f3f90d4c02b)) # [5.0.0-next.14](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.13...v5.0.0-next.14) (2020-05-26) ### Bug Fixes - improve browser support for website ([#1574](https://github.com/marko-js/marko/tree/master/packages/compiler/issues/1574)) ([9df798a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/9df798af5e71b71881995b6e06a9fb1b30b6fac2)) # [5.0.0-next.13](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.12...v5.0.0-next.13) (2020-05-20) ### Bug Fixes - **compiler:** ensure marko babel plugin not overwritten ([ac9a4c5](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/ac9a4c58bdedd1cd3ce762e1b5ce744d77719e3c)) - **compiler:** regression causing marko plugin to not load ([a08b55a](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/a08b55ac8d34f3031834dc76a7936ebb8964d01d)) # [5.0.0-next.12](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.11...v5.0.0-next.12) (2020-05-19) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.11](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.10...v5.0.0-next.11) (2020-04-27) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.10](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.9...v5.0.0-next.10) (2020-04-23) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.9](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.8...v5.0.0-next.9) (2020-04-16) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.8](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.7...v5.0.0-next.8) (2020-03-17) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.7](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.6...v5.0.0-next.7) (2020-03-17) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.6](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.5...v5.0.0-next.6) (2020-03-16) ### Bug Fixes - make Marko a peerDependency ([2eac257](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/2eac2572bec0986b2ac3903b1d43bef11d0bd437)) # [5.0.0-next.5](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.4...v5.0.0-next.5) (2020-02-26) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.4](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.3...v5.0.0-next.4) (2020-02-25) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.3](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.2...v5.0.0-next.3) (2020-02-25) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.2](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v5.0.0-next.1...v5.0.0-next.2) (2020-02-25) **Note:** Version bump only for package @marko/compiler # [5.0.0-next.1](https://github.com/marko-js/marko/tree/master/packages/compiler/compare/v4.18.48...v5.0.0-next.1) (2020-02-25) ### Features - import compiler from marko-js/x ([02670c8](https://github.com/marko-js/marko/tree/master/packages/compiler/commit/02670c86931396c52a5a03a7ae4fcef873297f60)) ================================================ FILE: packages/compiler/babel-types.d.ts ================================================ import { Scope } from "./dist/traverse"; export * from "./dist/traverse"; export * from "./dist/types"; export { Scope }; export const MARKO_TYPES: string[]; declare module "./dist/types" { interface Program { params: Identifier[]; } } ================================================ FILE: packages/compiler/babel-utils.d.ts ================================================ import type { Config, types as t } from "@marko/compiler"; export interface AttributeDefinition { allowExpressions: boolean; filePath: string; name: string; type?: string; html?: boolean; enum?: string[]; pattern?: RegExp; required: boolean; defaultValue: unknown; description?: string; deprecated: boolean; autocomplete: Array<{ displayText: string; snippet: string; description: string; descriptionMoreURL?: string; }>; } export interface PluginDefinition { path?: string; hook: Plugin; } export interface ParsePluginDefinition { path?: string; hook: ParsePlugin; } export interface TagDefinition { dir: string; filePath: string; attributeGroups?: string[]; patternAttributes?: AttributeDefinition[]; attributes: { [x: string]: AttributeDefinition }; description?: string; nestedTags?: { [x: string]: TagDefinition & { isNestedTag: true; isRepeated: boolean; targetProperty: string; }; }; autocomplete?: Array<{ displayText: string; snippet: string; description: string; descriptionMoreURL?: string; }>; htmlType?: "html" | "svg" | "math"; html: boolean; name: string; isNestedTag?: boolean; isRepeated?: boolean; targetProperty?: string; taglibId: string; types?: string; template?: string; renderer?: string; deprecated: boolean; openTagOnly: boolean; analyzer?: PluginDefinition; translator?: PluginDefinition; parser?: ParsePluginDefinition; transformers?: PluginDefinition[]; migrators?: PluginDefinition[]; parseOptions?: { text?: boolean; statement?: boolean; controlFlow?: boolean; openTagOnly?: boolean; rawOpenTag?: boolean; preserveWhitespace?: boolean; }; } export interface TaglibLookup { getTagsSorted(): TagDefinition[]; getTag(tagName: string): undefined | TagDefinition; getAttribute( tagName: string, attrName: string, ): undefined | AttributeDefinition; forEachAttribute( tagName: string, callback: (attr: AttributeDefinition, tag: TagDefinition) => void, ): void; exclusiveTagDiscoveryDirs: undefined | false | string; manualTagsDirs: undefined | Set; } export interface Attribute { allowExpressions?: boolean; type?: string; html?: boolean; enum?: string[]; pattern?: RegExp; required?: boolean; defaultValue?: unknown; description?: string; deprecated?: boolean; autocomplete?: Array<{ displayText?: string; snippet?: string; description?: string; descriptionMoreURL?: string; }>; } export interface Tag { attributeGroups?: string[]; patternAttributes?: Attribute[]; attributes?: { [x: string]: Attribute }; description?: string; nestedTags?: { [x: string]: Tag & { isRepeated?: boolean; targetProperty?: string; }; }; autocomplete?: Array<{ displayText?: string; snippet?: string; description?: string; descriptionMoreURL?: string; }>; htmlType?: "html" | "svg" | "math"; html?: boolean; types?: string; template?: string; renderer?: string; deprecated?: boolean; openTagOnly?: boolean; analyze?: Plugin; translate?: Plugin; parse?: ParsePlugin; transform?: Plugin | Plugin[]; migrate?: Plugin | Plugin[]; parseOptions?: { rootOnly?: boolean; rawOpenTag?: boolean; openTagOnly?: boolean; controlFlow?: boolean; ignoreAttributes?: boolean; relaxRequireCommas?: boolean; text?: boolean; }; } export function defineTag(tag: T): T; export type FunctionPlugin = ( path: t.NodePath, types: typeof t, ) => void; export interface EnterExitPlugin { enter?(path: t.NodePath, types: typeof t): void; exit?(path: t.NodePath, types: typeof t): void; } export interface ModulePlugin { default: EnterExitPlugin | FunctionPlugin; } export interface ModuleFunctionPlugin { default: FunctionPlugin; } export type ParsePlugin = ModuleFunctionPlugin | FunctionPlugin; export type Plugin = | ModulePlugin | EnterExitPlugin | FunctionPlugin; export function assertAllowedAttributes( path: t.NodePath, allowed: string[], ): void; export function assertNoArgs(path: t.NodePath): void; export function assertNoVar(path: t.NodePath): void; export function assertNoAttributes(path: t.NodePath): void; export function assertNoParams(path: t.NodePath): void; export function assertNoAttributeTags(path: t.NodePath): void; export function assertAttributesOrArgs(path: t.NodePath): void; export function assertAttributesOrSingleArg(path: t.NodePath): void; export function isNativeTag(path: t.NodePath): boolean; export function isMacroTag(path: t.NodePath): boolean; export function isDynamicTag(path: t.NodePath): boolean; export function isAttributeTag( path: t.NodePath, ): path is t.NodePath; export function isTransparentTag( path: t.NodePath, ): path is t.NodePath; export function isLoopTag( path: t.NodePath, ): path is t.NodePath; export function registerMacro(path: t.NodePath, name: string): void; export function hasMacro(path: t.NodePath, name: string): boolean; export function getMacroIdentifierForName( path: t.NodePath, name: string, ): t.Identifier; export function getMacroIdentifier(path: t.NodePath): t.Identifier; export function getTagTemplate( path: t.NodePath, ): string | undefined; export function getTagDef( path: t.NodePath, ): TagDefinition | undefined; export function getFullyResolvedTagName(path: t.NodePath): string; export function findParentTag( path: t.NodePath, ): t.NodePath | undefined; export function findAttributeTags( path: t.NodePath, ): Array>; export function getArgOrSequence( path: t.NodePath, ): t.Expression; export function loadFileForTag( path: t.NodePath, ): t.BabelFile | undefined; export function loadFileForImport( file: t.BabelFile, template: string, ): t.BabelFile | undefined; export function normalizeTemplateString( quasis: Array, ...expressions: t.Expression[] ): t.TemplateLiteral; type Loc = { line: number; column: number; index?: number }; type LocRange = { start: Loc; end: Loc }; export function getStart(file: t.BabelFile, node: t.Node): number | null; export function getEnd(file: t.BabelFile, node: t.Node): number | null; export function getLoc(file: t.BabelFile, pos: number): Loc; export function getLocRange( file: t.BabelFile, start: number, end: number, ): LocRange; export function withLoc( file: t.BabelFile, node: T, start: number, end: number, ): T; export function parseStatements( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, sourceOffset?: null | number, ): T; export function parseExpression( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, sourceOffset?: null | number, ): T; export function parseParams( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.Function["params"]; export function parseArgs( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.CallExpression["arguments"]; export function parseVar( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.VariableDeclarator["id"]; export function parseTemplateLiteral( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.TemplateLiteral; export function resolveRelativePath(file: t.BabelFile, request: string): string; export function importDefault( file: t.BabelFile, request: string, nameHint?: string, ): t.Identifier; export function importStar( file: t.BabelFile, request: string, nameHint?: string, ): t.Identifier; export function importNamed( file: t.BabelFile, request: string, name: string, nameHint?: string, ): t.Identifier; export function getTaglibLookup(file: t.BabelFile): TaglibLookup; export function getTagDefForTagName( file: t.BabelFile, tagName: string, ): TagDefinition | undefined; export function getTemplateId( optimize: boolean | Config, request: string, child?: string, ): string; export function resolveTagImport( path: t.NodePath, request: string, ): string | undefined; export enum DiagnosticType { Error = "error", Warning = "warning", Deprecation = "deprecation", Suggestion = "suggestion", } export interface Diagnostic { type: DiagnosticType; label: string; loc: undefined | false | LocRange; fix: boolean | ConfirmFix | SelectFix; } export interface DiagnosticOptions { label: string; loc?: undefined | false | LocRange; fix?: | undefined | (() => void) | (ConfirmFix & { apply(confirmed: boolean | undefined): void; }) | (SelectFix & { apply(selected: string | undefined): void; }); } export function diagnosticError( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticWarn( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticDeprecate( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticSuggest( path: t.NodePath, options: DiagnosticOptions, ): void; interface ConfirmFix { type: "confirm"; message: string; initialValue?: boolean; } interface SelectFix { type: "select"; message: string; options: { value: string; label?: string; }[]; initialValue?: string; } type Computed = | undefined | number | string | boolean | RegExp | bigint | null | { [x: string]: Computed } | Computed[]; export function computeNode(node: t.Node): undefined | { value: Computed }; export function getFile(): t.BabelFile; export function getProgram(): t.NodePath; ================================================ FILE: packages/compiler/babel-utils.js ================================================ module.exports = require("./dist/babel-utils"); ================================================ FILE: packages/compiler/config.d.ts ================================================ declare const Config: { output?: "html" | "dom" | "hydrate" | "migrate" | "source"; errorRecovery?: boolean; applyFixes?: Map; stripTypes?: boolean; runtimeId?: string | null; ast?: boolean; code?: boolean; writeVersionComment?: boolean; ignoreUnrecognizedTags?: boolean; sourceMaps?: boolean | "inline" | "both"; translator?: any; fileSystem?: Pick< typeof import("fs"), "statSync" | "readFileSync" | "readdirSync" >; modules?: "esm" | "cjs"; resolveVirtualDependency?: | (( filename: string, dep: { virtualPath: string; code: string; map?: any }, ) => string | undefined | null) | null; hydrateIncludeImports?: RegExp | ((request: string) => boolean); hydrateInit?: boolean; optimize?: boolean; optimizeKnownTemplates?: string[]; cache?: Map; hot?: boolean; /** @deprecated */ meta?: boolean; babelConfig?: { ast?: boolean | null; code?: boolean | null; comments?: boolean | null; compact?: boolean | "auto" | null; caller?: { name?: string; [x: string]: unknown }; minified?: boolean | null; [x: string]: unknown; }; }; export = Config; ================================================ FILE: packages/compiler/config.js ================================================ module.exports = require("./dist/config").default; ================================================ FILE: packages/compiler/index.d.ts ================================================ import { Diagnostic, TaglibLookup } from "@marko/compiler/babel-utils"; import { SourceMap } from "magic-string"; import * as types from "./babel-types"; export { types }; type _Config = typeof import("./config"); export interface Config extends _Config {} interface Dep { type: string; path: string; [x: string]: unknown; } interface VirtualDep { type: string; code: string; virtualPath: string; startPos?: number; endPos?: number; [x: string]: unknown; } export interface MarkoMeta { id: string; component?: string; watchFiles: string[]; tags?: string[]; deps: Array; analyzedTags?: [string, ...string[]]; diagnostics: Diagnostic[]; api: undefined | string; } export interface CompileResult { ast: types.File; code: string; map: SourceMap; meta: MarkoMeta; } export const globalConfig: Config; export function configure(config: Config): void; export function compile( src: string, filename: string, config?: Config, ): Promise; export function compileSync( src: string, filename: string, config?: Config, ): CompileResult; export function compileFile( filename: string, config?: Config, ): Promise; export function compileFileSync( filename: string, config?: Config, ): CompileResult; export function getRuntimeEntryFiles( output: string, translator?: string | undefined, ): string[]; export namespace taglib { export function resolveOptionalTaglibs( taglibIds: string[], ): [id: string, props: { [x: string]: unknown }][]; export function excludeDir(dirname: string): void; export function excludePackage(packageName: string): void; export function register(id: string): void; export function register(id: string, props: { [x: string]: unknown }): void; export function buildLookup( dirname: string, translator?: unknown, onError?: (err: Error) => void, ): TaglibLookup; export function clearCaches(): void; } ================================================ FILE: packages/compiler/internal/babel/index.ts ================================================ // eslint-disable-next-line @typescript-eslint/triple-slash-reference /// declare module "@babel/core" { export const File: any; } export { codeFrameColumns } from "@babel/code-frame"; export { File, loadPartialConfig, loadPartialConfigAsync, transformAsync, transformSync, } from "@babel/core"; export { default as generator } from "@babel/generator"; export { parse, parseExpression } from "@babel/parser"; export { default as pluginSyntaxTypeScript } from "@babel/plugin-syntax-typescript"; export { default as pluginTransformModulesCommonjs } from "@babel/plugin-transform-modules-commonjs"; export { default as pluginTransformTypeScript } from "@babel/plugin-transform-typescript"; export { default as traverse } from "@babel/traverse"; export * as types from "@babel/types"; ================================================ FILE: packages/compiler/internal/babel/modules.d.ts ================================================ declare module "@babel/core"; declare module "@babel/types"; declare module "@babel/parser"; declare module "@babel/traverse"; declare module "@babel/generator"; declare module "@babel/code-frame"; declare module "@babel/plugin-syntax-typescript"; declare module "@babel/plugin-transform-modules-commonjs"; declare module "@babel/plugin-transform-typescript"; ================================================ FILE: packages/compiler/internal/babel/package.json ================================================ { "main": "index.ts", "types": "index.ts", "main:override": "../../dist/babel.js" } ================================================ FILE: packages/compiler/modules.d.ts ================================================ export const cwd: string; export const root: string; export const pkg: null | Record; export const require: (id: string) => unknown; export const resolve: (id: string, from: string) => string; export const tryResolve: (id: string, from: string) => string | undefined; ================================================ FILE: packages/compiler/modules.js ================================================ "use strict"; if (process.env.BUNDLE || typeof document === "object") { exports.cwd = "/"; exports.root = "/"; exports.pkg = null; exports.require = null; exports.resolve = null; exports.tryResolve = null; } else { const resolveFrom = require("resolve-from"); let cwd = "/"; let root = cwd; let pkg = null; if (typeof process === "object" && typeof process.cwd === "function") { try { cwd = process.cwd(); pkg = require("lasso-package-root").getRootPackage(cwd); if (pkg) root = pkg.__dirname; } catch { // ignore } } exports.cwd = cwd; exports.root = root; exports.pkg = pkg; exports.require = require; exports.resolve = (id, from) => { return resolveFrom(from || root, id); }; exports.tryResolve = (id, from) => { return resolveFrom.silent(from || root, id); }; } ================================================ FILE: packages/compiler/package.json ================================================ { "name": "@marko/compiler", "version": "5.39.62", "description": "Marko template to JS compiler.", "keywords": [ "babel", "htmljs", "marko", "parse", "parser", "plugin" ], "homepage": "https://github.com/marko-js/marko/blob/main/packages/runtime-class/docs/compiler.md", "bugs": "https://github.com/marko-js/marko/issues/new?template=Bug_report.md", "repository": { "type": "git", "url": "git+https://github.com/marko-js/marko.git", "directory": "packages/compiler" }, "license": "MIT", "author": "Dylan Piercey ", "exports": { ".": { "types": "./index.d.ts", "default": "./src/index.js" }, "./babel-utils": { "types": "./babel-utils.d.ts", "default": "./src/babel-utils/index.js" }, "./config": { "types": "./config.d.ts", "default": "./src/config.js" }, "./register": { "types": "./register.d.ts", "default": "./src/register.js" }, "./modules": { "types": "./modules.d.ts", "default": "./modules.js" }, "./internal/babel": "./internal/babel/index.ts", "./babel-types": "./babel-types.d.ts", "./dist/types": "./dist/types.d.ts", "./package": "./package.json", "./package.json": "./package.json", "./*": "./*" }, "main": "src/index.js", "types": "index.d.ts", "files": [ "dist", "internal", "config.js", "config.d.ts", "modules.js", "index.d.ts", "babel-types.d.ts", "babel-utils.js", "babel-utils.d.ts", "register.js", "register.d.ts" ], "scripts": { "build": "babel ./src --out-dir ./dist --copy-files --config-file ../../babel.config.js --env-name=production && node scripts/bundle-babel.mts", "build-babel-types": "node -r ~ts scripts/types" }, "dependencies": { "@luxass/strip-json-comments": "^1.4.0", "complain": "^1.6.1", "he": "^1.2.0", "htmljs-parser": "^5.10.2", "jsesc": "^3.1.0", "kleur": "^4.1.5", "lasso-package-root": "^1.0.1", "raptor-regexp": "^1.0.1", "raptor-util": "^3.2.0", "relative-import-path": "^1.0.0", "resolve-from": "^5.0.0", "self-closing-tags": "^1.0.1", "source-map-support": "^0.5.21" }, "devDependencies": { "marko": "^5.38.32" }, "engines": { "node": "18 || 20 || >=22" }, "publishConfig": { "access": "public" }, "exports:override": { ".": { "types": "./index.d.ts", "default": "./dist/index.js" }, "./babel-utils": { "types": "./babel-utils.d.ts", "default": "./dist/babel-utils/index.js" }, "./config": { "types": "./config.d.ts", "default": "./dist/config.js" }, "./register": { "types": "./register.d.ts", "default": "./dist/register.js" }, "./modules": "./modules.js", "./internal/babel": { "browser": "./dist/babel.web.js", "default": "./dist/babel.js" }, "./babel-types": "./babel-types.d.ts", "./dist/types": "./dist/types.d.ts", "./package": "./package.json", "./package.json": "./package.json", "./*": "./*" }, "main:override": "dist/index.js" } ================================================ FILE: packages/compiler/register.d.ts ================================================ import { Config } from "."; type Extensions = Partial; export default function register( config: Config & { extensions?: Extensions }, ): typeof require.extensions & { ".marko": (module: Module, filename: string) => any; }; ================================================ FILE: packages/compiler/register.js ================================================ module.exports = require("./dist/register"); ================================================ FILE: packages/compiler/scripts/bundle-babel.mts ================================================ import path from "node:path"; import { build } from "rolldown"; await Promise.all( (["browser", "node"] as const).map((platform) => build({ platform, input: "internal/babel/index.ts", cwd: path.join(import.meta.dirname, ".."), external: ["browserslist", "path", "assert", "fs"], output: { sourcemap: false, minify: "dce-only", format: "cjs", intro: "'use strict';", file: platform === "node" ? "dist/babel.js" : "dist/babel.web.js", }, }), ), ); ================================================ FILE: packages/compiler/scripts/types/babel-traverse.js ================================================ /********************************************************************************************** Some of the source code in this file is sourced from https://github.com/babel/babel, and is licensed as below: MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***********************************************************************************************/ import { MARKO_TYPES } from "@babel/types"; import fs from "fs"; const HUB_INTERFACE = "export interface HubInterface {"; const HUB_CLASS = "export class Hub implements HubInterface {\n constructor();"; const IMPORT = 'import * as t from "@babel/types"'; const EXPORT_NODE = "export import Node = t.Node;"; const NODE_PATH_GET = "get(key: string, context?: boolean | TraversalContext): NodePath | NodePath[];"; const IS = "// #region ------------------------- isXXX -------------------------"; const ASSERT = "// #region ------------------------- assertXXX -------------------------"; const BREAK = "\n "; const data = fs.readFileSync( require.resolve("@types/babel__traverse/index.d.ts"), "utf8", ); [HUB_INTERFACE, HUB_CLASS, IMPORT, EXPORT_NODE, IS, ASSERT].forEach((str) => { if (data.indexOf(str) === -1) { console.error( `Unable to find \`${str}\` in @types/babel__traverse/index.d.ts`, ); process.exit(1); } }); var result = data .replace( HUB_INTERFACE, `export interface BabelFile { ast: t.File, path: NodePath, hub: HubInterface, code: string, opts: Record & { filename: string }, metadata: Record & { marko: import("@marko/compiler").MarkoMeta }, markoOpts: Required } ${HUB_INTERFACE} file: BabelFile;`, ) .replace( HUB_CLASS, `${HUB_CLASS} file: BabelFile;`, ) .replace(IMPORT, `import * as t from './types'`) .replace(EXPORT_NODE, "type Node = t.Node") .replace(NODE_PATH_GET, "") .replace( IS, IS + BREAK + MARKO_TYPES.map( (t) => `is${t}(opts?: object | null): this is NodePath;`, ).join(BREAK), ) .replace( ASSERT, ASSERT + BREAK + MARKO_TYPES.map( (t) => `assert${t}(opts?: object | null): asserts this is NodePath;`, ).join(BREAK), ); export default result; ================================================ FILE: packages/compiler/scripts/types/babel-types.js ================================================ /********************************************************************************************** Some of the source code in this file is sourced from https://github.com/babel/babel, and is licensed as below: MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***********************************************************************************************/ import * as t from "@babel/types"; let code = `// NOTE: This file is autogenerated. Do not modify. // See packages/babel-types/scripts/generators/typescript-legacy.js for script used. interface BaseComment { value: string; start: number; end: number; loc: SourceLocation; type: "CommentBlock" | "CommentLine"; } export interface CommentBlock extends BaseComment { type: "CommentBlock"; } export interface CommentLine extends BaseComment { type: "CommentLine"; } export type Comment = CommentBlock | CommentLine; export interface SourceLocation { start: { line: number; column: number; }; end: { line: number; column: number; }; } export interface NodeExtra { [key: string]: unknown; } interface BaseNode { leadingComments: ReadonlyArray | null; innerComments: ReadonlyArray | null; trailingComments: ReadonlyArray | null; start: number | null; end: number | null; loc: SourceLocation | null; type: Node["type"]; extra?: NodeExtra; } export type Node = ${t.TYPES.sort().join(" | ")};\n\n`; // const lines = []; for (const type in t.NODE_FIELDS) { const fields = t.NODE_FIELDS[type]; const fieldNames = sortFieldNames(Object.keys(t.NODE_FIELDS[type]), type); const builderNames = t.BUILDER_KEYS[type]; const struct = ['type: "' + type + '";']; const args = []; fieldNames.forEach((fieldName) => { const field = fields[fieldName]; // Future / annoying TODO: // MemberExpression.property, ObjectProperty.key and ObjectMethod.key need special cases; either: // - convert the declaration to chain() like ClassProperty.key and ClassMethod.key, // - declare an alias type for valid keys, detect the case and reuse it here, // - declare a disjoint union with, for example, ObjectPropertyBase, // ObjectPropertyLiteralKey and ObjectPropertyComputedKey, and declare ObjectProperty // as "ObjectPropertyBase & (ObjectPropertyLiteralKey | ObjectPropertyComputedKey)" let typeAnnotation = stringifyValidator(field.validate, ""); if (isNullable(field) && !hasDefault(field)) { typeAnnotation += " | null"; } if (builderNames.includes(fieldName)) { if (areAllRemainingFieldsNullable(fieldName, builderNames, fields)) { args.push( `${t.toBindingIdentifierName(fieldName)}${ isNullable(field) ? "?:" : ":" } ${typeAnnotation}`, ); } else { args.push( `${t.toBindingIdentifierName(fieldName)}: ${typeAnnotation}${ isNullable(field) ? " | undefined" : "" }`, ); } } const alphaNumeric = /^\w+$/; if (t.isValidIdentifier(fieldName) || alphaNumeric.test(fieldName)) { struct.push(`${fieldName}: ${typeAnnotation};`); } else { struct.push(`"${fieldName}": ${typeAnnotation};`); } }); code += `export interface ${type} extends BaseNode { ${struct.join("\n ").trim()} }\n\n`; // super and import are reserved words in JavaScript if (type !== "Super" && type !== "Import") { lines.push( `export function ${toFunctionName(type)}(${args.join(", ")}): ${type};`, ); } else { const functionName = toFunctionName(type); lines.push( `declare function _${functionName}(${args.join(", ")}): ${type};`, `export { _${functionName} as ${functionName}}`, ); } } for (const typeName of t.TYPES) { const isDeprecated = !!t.DEPRECATED_KEYS[typeName]; const realName = isDeprecated ? t.DEPRECATED_KEYS[typeName] : typeName; const result = t.NODE_FIELDS[realName] || t.FLIPPED_ALIAS_KEYS[realName] ? `node is ${realName}` : "boolean"; if (isDeprecated) { lines.push(`/** @deprecated Use \`is${realName}\` */`); } lines.push( `export function is${typeName}(node: object | null | undefined, opts?: object | null): ${result};`, ); if (isDeprecated) { lines.push(`/** @deprecated Use \`assert${realName}\` */`); } lines.push( `export function assert${typeName}(node: object | null | undefined, opts?: object | null): void;`, ); } lines.push( // assert/ `export function assertNode(obj: any): void`, // builders/ `export function createTypeAnnotationBasedOnTypeof(type: 'string' | 'number' | 'undefined' | 'boolean' | 'function' | 'object' | 'symbol'): StringTypeAnnotation | VoidTypeAnnotation | NumberTypeAnnotation | BooleanTypeAnnotation | GenericTypeAnnotation`, `export function createUnionTypeAnnotation(types: [T]): T`, `export function createFlowUnionType(types: [T]): T`, // this probably misbehaves if there are 0 elements, and it's not a UnionTypeAnnotation if there's only 1 // it is possible to require "2 or more" for this overload ([T, T, ...T[]]) but it requires typescript 3.0 `export function createUnionTypeAnnotation(types: ReadonlyArray): UnionTypeAnnotation`, `export function createFlowUnionType(types: ReadonlyArray): UnionTypeAnnotation`, // this smells like "internal API" `export function buildChildren(node: { children: ReadonlyArray }): JSXElement['children']`, // clone/ `export function clone(n: T): T;`, `export function cloneDeep(n: T): T;`, `export function cloneDeepWithoutLoc(n: T): T;`, `export function cloneNode(n: T, deep?: boolean, withoutLoc?: boolean): T;`, `export function cloneWithoutLoc(n: T): T;`, // comments/ `export type CommentTypeShorthand = 'leading' | 'inner' | 'trailing'`, `export function addComment(node: T, type: CommentTypeShorthand, content: string, line?: boolean): T`, `export function addComments(node: T, type: CommentTypeShorthand, comments: ReadonlyArray): T`, `export function inheritInnerComments(node: Node, parent: Node): void`, `export function inheritLeadingComments(node: Node, parent: Node): void`, `export function inheritsComments(node: T, parent: Node): void`, `export function inheritTrailingComments(node: Node, parent: Node): void`, `export function removeComments(node: T): T`, // converters/ `export function ensureBlock(node: Extract): BlockStatement`, // too complex? `export function ensureBlock = 'body'>(node: Extract>, key: K): BlockStatement`, // gatherSequenceExpressions is not exported `export function toBindingIdentifierName(name: { toString(): string } | null | undefined): string`, `export function toBlock(node: Statement | Expression, parent?: Function | null): BlockStatement`, // it is possible for `node` to be an arbitrary object if `key` is always provided, // but that doesn't look like intended API `export function toComputedKey>(node: T, key?: Expression | Identifier): Expression`, `export function toExpression(node: Function): FunctionExpression`, `export function toExpression(node: Class): ClassExpression`, `export function toExpression(node: ExpressionStatement | Expression | Class | Function): Expression`, `export function toIdentifier(name: { toString(): string } | null | undefined): string`, `export function toKeyAlias(node: Method | Property, key?: Node): string`, // NOTE: this actually uses Scope from @babel/traverse, but we can't add a dependency on its types, // as they live in @types. Declare the structural subset that is required. `export function toSequenceExpression(nodes: ReadonlyArray, scope: { push(value: { id: LVal; kind: 'var'; init?: Expression}): void; buildUndefinedNode(): Node }): SequenceExpression | undefined`, `export function toStatement(node: AssignmentExpression, ignore?: boolean): ExpressionStatement`, `export function toStatement(node: Statement | AssignmentExpression, ignore?: boolean): Statement`, `export function toStatement(node: Class, ignore: true): ClassDeclaration | undefined`, `export function toStatement(node: Class, ignore?: boolean): ClassDeclaration`, `export function toStatement(node: Function, ignore: true): FunctionDeclaration | undefined`, `export function toStatement(node: Function, ignore?: boolean): FunctionDeclaration`, `export function toStatement(node: Statement | Class | Function | AssignmentExpression, ignore: true): Statement | undefined`, `export function toStatement(node: Statement | Class | Function | AssignmentExpression, ignore?: boolean): Statement`, `export function valueToNode(value: undefined): Identifier`, // (should this not be a UnaryExpression to avoid shadowing?) `export function valueToNode(value: boolean): BooleanLiteral`, `export function valueToNode(value: null): NullLiteral`, `export function valueToNode(value: string): StringLiteral`, // Infinities and NaN need to use a BinaryExpression; negative values must be wrapped in UnaryExpression `export function valueToNode(value: number): NumericLiteral | BinaryExpression | UnaryExpression`, `export function valueToNode(value: RegExp): RegExpLiteral`, `export function valueToNode(value: ReadonlyArray): ArrayExpression`, // this throws with objects that are not PlainObject according to lodash, // or if there are non-valueToNode-able values `export function valueToNode(value: object): ObjectExpression`, `export function valueToNode(value: undefined | boolean | null | string | number | RegExp | object): Expression`, // modifications/ `export function removeTypeDuplicates(types: ReadonlyArray): FlowType[]`, `export function appendToMemberExpression>(member: T, append: MemberExpression['property'], computed?: boolean): T`, `export function inherits(child: T, parent: Node | null | undefined): T`, `export function prependToMemberExpression>(member: T, prepend: MemberExpression['object']): T`, `export function removeProperties( n: Node, opts?: { preserveComments: boolean } | null ): void;`, `export function removePropertiesDeep( n: T, opts?: { preserveComments: boolean } | null ): T;`, // retrievers/ `export function getBindingIdentifiers(node: Node, duplicates: true, outerOnly?: boolean): Record>`, `export function getBindingIdentifiers(node: Node, duplicates?: false, outerOnly?: boolean): Record`, `export function getBindingIdentifiers(node: Node, duplicates: boolean, outerOnly?: boolean): Record>`, `export function getOuterBindingIdentifiers(node: Node, duplicates: true): Record>`, `export function getOuterBindingIdentifiers(node: Node, duplicates?: false): Record`, `export function getOuterBindingIdentifiers(node: Node, duplicates: boolean): Record>`, // traverse/ `export type TraversalAncestors = ReadonlyArray<{ node: Node, key: string, index?: number, }>; export type TraversalHandler = ( this: undefined, node: Node, parent: TraversalAncestors, type: T ) => void; export type TraversalHandlers = { enter?: TraversalHandler, exit?: TraversalHandler, };`.replace(/(^|\n) {2}/g, "$1"), `export function traverse(n: Node, h: TraversalHandler | TraversalHandlers, state?: T): void;`, `export function traverseFast(n: Node, h: TraversalHandler, state?: T): void;`, // utils/ // cleanJSXElementLiteralChild is not exported // inherit is not exported `export function shallowEqual(actual: object, expected: T): actual is T`, // validators/ `export function buildMatchMemberExpression(match: string, allowPartial?: boolean): (node: Node | null | undefined) => node is MemberExpression`, `export function is(type: T, n: Node | null | undefined, required?: undefined): n is Extract`, `export function is>(type: T, n: Node | null | undefined, required: Partial

    ): n is P`, `export function is

    (type: string, n: Node | null | undefined, required: Partial

    ): n is P`, `export function is(type: string, n: Node | null | undefined, required?: Partial): n is Node`, `export function isBinding(node: Node, parent: Node, grandparent?: Node): boolean`, `export function isBlockScoped(node: Node): node is FunctionDeclaration | ClassDeclaration | VariableDeclaration`, `export function isImmutable(node: Node): node is Immutable`, `export function isLet(node: Node): node is VariableDeclaration`, `export function isNode(node: object | null | undefined): node is Node`, `export function isNodesEquivalent>(a: T, b: any): b is T`, `export function isNodesEquivalent(a: any, b: any): boolean`, `export function isPlaceholderType(placeholderType: Node['type'], targetType: Node['type']): boolean`, `export function isReferenced(node: Node, parent: Node, grandparent?: Node): boolean`, `export function isScope(node: Node, parent: Node): node is Scopable`, `export function isSpecifierDefault(specifier: ModuleSpecifier): boolean`, `export function isType(nodetype: string, targetType: T): nodetype is T`, `export function isType(nodetype: string | null | undefined, targetType: string): boolean`, `export function isValidES3Identifier(name: string): boolean`, `export function isValidIdentifier(name: string): boolean`, `export function isVar(node: Node): node is VariableDeclaration`, // the MemberExpression implication is incidental, but it follows from the implementation `export function matchesPattern(node: Node | null | undefined, match: string | ReadonlyArray, allowPartial?: boolean): node is MemberExpression`, `export function validate(n: Node | null | undefined, key: K, value: T[K]): void;`, `export function validate(n: Node, key: string, value: any): void;`, ); for (const type in t.DEPRECATED_KEYS) { code += `/** * @deprecated Use \`${t.DEPRECATED_KEYS[type]}\` */ export type ${type} = ${t.DEPRECATED_KEYS[type]};\n `; } for (const type in t.FLIPPED_ALIAS_KEYS) { const types = t.FLIPPED_ALIAS_KEYS[type]; code += `export type ${type} = ${types .map((type) => `${type}`) .join(" | ")};\n`; } code += "\n"; code += "export interface Aliases {\n"; for (const type in t.FLIPPED_ALIAS_KEYS) { code += ` ${type}: ${type};\n`; } code += "}\n\n"; code += lines.join("\n") + "\n"; // export default code; // function areAllRemainingFieldsNullable(fieldName, fieldNames, fields) { const index = fieldNames.indexOf(fieldName); return fieldNames.slice(index).every((_) => isNullable(fields[_])); } function hasDefault(field) { return field.default != null; } function isNullable(field) { return field.optional || hasDefault(field); } function sortFieldNames(fields, type) { return fields.sort((fieldA, fieldB) => { const indexA = t.BUILDER_KEYS[type].indexOf(fieldA); const indexB = t.BUILDER_KEYS[type].indexOf(fieldB); if (indexA === indexB) return fieldA < fieldB ? -1 : 1; if (indexA === -1) return 1; if (indexB === -1) return -1; return indexA - indexB; }); } function stringifyValidator(validator, nodePrefix) { if (validator === undefined) { return "any"; } if (validator.each) { return `Array<${stringifyValidator(validator.each, nodePrefix)}>`; } if (validator.chainOf) { const ret = stringifyValidator(validator.chainOf[1], nodePrefix); return Array.isArray(ret) && ret.length === 1 && ret[0] === "any" ? stringifyValidator(validator.chainOf[0], nodePrefix) : ret; } if (validator.oneOf) { return validator.oneOf.map(JSON.stringify).join(" | "); } if (validator.oneOfNodeTypes) { return validator.oneOfNodeTypes.map((_) => nodePrefix + _).join(" | "); } if (validator.oneOfNodeOrValueTypes) { return validator.oneOfNodeOrValueTypes .map((_) => { return isValueType(_) ? _ : nodePrefix + _; }) .join(" | "); } if (validator.type) { return validator.type; } if (validator.shapeOf) { return ( "{ " + Object.keys(validator.shapeOf) .map((shapeKey) => { const propertyDefinition = validator.shapeOf[shapeKey]; if (propertyDefinition.validate) { const isOptional = propertyDefinition.optional || propertyDefinition.default != null; return ( shapeKey + (isOptional ? "?: " : ": ") + stringifyValidator(propertyDefinition.validate) ); } return null; }) .filter(Boolean) .join(", ") + " }" ); } return ["any"]; } function isValueType(type) { return type.charAt(0).toLowerCase() === type.charAt(0); } function toFunctionName(typeName) { const _ = typeName.replace(/^TS/, "ts").replace(/^JSX/, "jsx"); return _.slice(0, 1).toLowerCase() + _.slice(1); } ================================================ FILE: packages/compiler/scripts/types.js ================================================ import fs from "fs"; import babelTraverseCode from "./types/babel-traverse"; import babelTypesCode from "./types/babel-types"; fs.mkdirSync("dist", { recursive: true }); fs.writeFileSync("dist/types.d.ts", babelTypesCode); fs.writeFileSync("dist/traverse.d.ts", babelTraverseCode); ================================================ FILE: packages/compiler/src/babel-plugin/file.js ================================================ import { File } from "@marko/compiler/internal/babel"; import { buildCodeFrameError } from "../util/build-code-frame"; export class MarkoFile extends File { addHelper() { throw new Error("addHelper is not supported during a Marko transform"); } buildCodeFrameError(node, msg) { return buildCodeFrameError(this.opts.filename, this.code, node.loc, msg); } } ================================================ FILE: packages/compiler/src/babel-plugin/index.js ================================================ import { pluginTransformTypeScript, traverse, types as t, } from "@marko/compiler/internal/babel"; import path from "path"; import { diagnosticError } from "../babel-utils/diagnostics"; import { getFileInternal, setFileInternal } from "../babel-utils/get-file"; import { getTemplateId } from "../babel-utils/tags"; import { buildLookup } from "../taglib"; import taglibConfig from "../taglib/config"; import { buildCodeFrameError } from "../util/build-code-frame"; import throwAggregateError from "../util/merge-errors"; import { Hash } from "../util/quick-hash"; import shouldOptimize from "../util/should-optimize"; import tryLoadTranslator from "../util/try-load-translator"; import { MarkoFile } from "./file"; import { parseMarko } from "./parser"; import { visitor as migrate } from "./plugins/migrate"; import { visitor as transform } from "./plugins/transform"; const SOURCE_FILES = new WeakMap(); let stripTypesVisitor; export default (api, markoOpts) => { api.assertVersion(7); const translator = (markoOpts.translator = tryLoadTranslator( markoOpts.translator, )); markoOpts.output = markoOpts.output || "html"; if (markoOpts.optimize === undefined) { api.cache.using(shouldOptimize); markoOpts.optimize = shouldOptimize(); } if (!translator || !translator.translate) { throw new Error( "@marko/compiler: translator must provide a translate visitor object", ); } if ( markoOpts.output === "hydrate" && typeof markoOpts.resolveVirtualDependency !== "function" ) { throw new Error( `@marko/compiler: the "resolveVirtualDependency" option must be supplied when output is "hydrate".`, ); } if (markoOpts.stripTypes) { stripTypesVisitor ||= pluginTransformTypeScript(api, { isTSX: false, allowNamespaces: true, allowDeclareFields: true, optimizeConstEnums: true, onlyRemoveTypeImports: true, disallowAmbiguousJSXLike: false, }).visitor; } let curOpts; return { name: "marko", manipulateOptions(opts) { const { parserOpts } = opts; // We need to allow these for now since we are not parsing the entire file // These types of syntax errors will be picked up by the bundler / runtime anyways. parserOpts.allowAwaitOutsideFunction = parserOpts.allowImportExportEverywhere = parserOpts.allowReturnOutsideFunction = parserOpts.allowSuperOutsideMethod = parserOpts.allowUndeclaredExports = parserOpts.allowNewTargetOutsideFunction = parserOpts.createImportExpressions = true; parserOpts.plugins.push("objectRestSpread", "classProperties", [ "typescript", { disallowAmbiguousJSXLike: false, dts: false, }, ]); curOpts = opts; }, parserOverride(code) { const file = getMarkoFile(code, curOpts, markoOpts); const finalAst = t.cloneNode(file.ast, true); SOURCE_FILES.set(finalAst, file); return finalAst; }, pre(file) { const { buildError: prevBuildError } = file.hub; const { buildCodeFrameError: prevCodeFrameError } = file; const prevFS = taglibConfig.fs; const prevFile = getFileInternal(); taglibConfig.fs = markoOpts.fileSystem; setFileInternal(file); curOpts = undefined; try { const { ast, metadata } = file; const sourceFile = SOURCE_FILES.get(ast); metadata.marko = shallowClone(sourceFile.metadata.marko); if (isMarkoOutput(markoOpts.output)) { finalizeMeta(metadata.marko); return; } const taglibLookup = sourceFile.___taglibLookup; const rootTranslators = []; file.buildCodeFrameError = MarkoFile.prototype.buildCodeFrameError; file.hub.buildError = file.buildCodeFrameError.bind(file); file.markoOpts = markoOpts; file.___taglibLookup = taglibLookup; file.___getMarkoFile = getMarkoFile; if (markoOpts.output !== "hydrate") { for (const id in taglibLookup.taglibsById) { addPlugin( metadata.marko, rootTranslators, taglibLookup.taglibsById[id].translator, ); } } rootTranslators.push(translator.translate); file.___compileStage = "translate"; traverseAll(file, rootTranslators); finalizeMeta(metadata.marko); file.path.scope.crawl(); // Ensure all scopes are accurate for subsequent babel plugins } finally { taglibConfig.fs = prevFS; setFileInternal(prevFile); file.buildCodeFrameError = prevCodeFrameError; file.hub.buildError = prevBuildError; file.markoOpts = file.___taglibLookup = file.___getMarkoFile = undefined; } }, }; }; function getMarkoFile(code, fileOpts, markoOpts) { const { translator } = markoOpts; let compileCache = markoOpts.cache.get(translator); if (!compileCache) { markoOpts.cache.set(translator, (compileCache = new Map())); } const { filename } = fileOpts; const isSource = markoOpts.output === "source"; const isMigrate = markoOpts.output === "migrate"; const canCache = !(isSource || isMigrate); const id = getTemplateId(markoOpts, filename); const contentHash = canCache && new Hash().update(code).digest(); let cached = canCache && compileCache.get(id); if (cached) { if (cached.contentHash !== contentHash) { // File content changed, invalidate the cache. cached = undefined; } else { for (const watchFile of cached.file.metadata.marko.watchFiles) { let mtime = Infinity; try { mtime = markoOpts.fileSystem.statSync(watchFile).mtime; } catch { // ignore } if (mtime > cached.time) { // Some dependency changed, invalidate the cache. cached = undefined; break; } } } } if (cached) { cached.file.markoOpts = markoOpts; return cached.file; } const prevFs = taglibConfig.fs; const prevFile = getFileInternal(); taglibConfig.fs = markoOpts.fileSystem; try { const file = setFileInternal( new MarkoFile(fileOpts, { code, ast: { type: "File", program: { type: "Program", sourceType: "module", body: [], directives: [], params: [t.identifier("input")], }, }, }), ); file.markoOpts = markoOpts; file.___compileStage = "parse"; file.___getMarkoFile = getMarkoFile; const taglibLookup = (file.___taglibLookup = buildLookup( path.dirname(filename), translator, )); const meta = (file.metadata.marko = { id, deps: [], tags: [], watchFiles: [], diagnostics: [], api: translator.preferAPI, }); parseMarko(file); file.path.scope.crawl(); // Initialize bindings. if (isSource) { if (markoOpts.stripTypes) { stripTypes(file); } return file; } const rootMigrators = []; for (const id in taglibLookup.taglibsById) { for (const migrator of taglibLookup.taglibsById[id].migrators) { addPlugin(meta, rootMigrators, migrator); } } rootMigrators.push(migrate); file.___compileStage = "migrate"; traverseAll(file, rootMigrators); if (file.___hasParseErrors) { if (markoOpts.errorRecovery) { t.traverseFast(file.path.node, (node) => { if (node.type === "MarkoParseError") { diagnosticError(file.path, { label: node.label, loc: node.errorLoc || node.loc, }); } }); } else { let errors = []; t.traverseFast(file.path.node, (node) => { if (node.type === "MarkoParseError") { errors.push( buildCodeFrameError( file.opts.filename, file.code, node.errorLoc || node.loc, node.label, ), ); } }); throwAggregateError(errors); } } if (markoOpts.stripTypes) { stripTypes(file); } if (isMigrate) { return file; } file.___compileStage = "transform"; const rootTransformers = []; for (const id in taglibLookup.taglibsById) { for (const transformer of taglibLookup.taglibsById[id].transformers) { addPlugin(meta, rootTransformers, transformer); } } rootTransformers.push(transform); if (translator.transform) { rootTransformers.push(translator.transform); } traverseAll(file, rootTransformers); file.path.scope.crawl(); for (const taglibId in taglibLookup.taglibsById) { const { filePath } = taglibLookup.taglibsById[taglibId]; if ( filePath[filePath.length - 5] === "." && filePath.endsWith("marko.json") ) { meta.watchFiles.push(filePath); } } compileCache.set(id, { time: Date.now(), file, contentHash, }); if (translator.analyze) { try { file.___compileStage = "analyze"; traverseAll(file, translator.analyze); } catch (e) { compileCache.delete(id); throw e; } } return file; } finally { taglibConfig.fs = prevFs; setFileInternal(prevFile); } } function shallowClone(data) { const clone = {}; for (const key in data) { const v = data[key]; if (v !== undefined) { if (v === null || typeof v !== "object") { clone[key] = v; } else { const Ctor = v.constructor; switch (Ctor) { case Array: clone[key] = [...v]; break; case Object: case null: clone[key] = { ...v }; break; case Map: case Set: case Date: case RegExp: clone[key] = new Ctor(v); break; default: throw new Error(`Unsupported metadata type of ${Ctor.name}`); } } } } return clone; } function mergeVisitors(all) { if (Array.isArray(all)) { if (all.length === 1) { all = all[0]; } else { return traverse.visitors.merge(all.map(toExploded)); } } return toExploded(all); } const explodeCache = new WeakMap(); function toExploded(visitor) { let cached = explodeCache.get(visitor); if (!cached) { cached = traverse.visitors.explode(cloneVisitor(visitor)); explodeCache.set(visitor, cached); } return cached; } function cloneVisitor(visitor) { const clone = {}; for (const key in visitor) { clone[key] = cloneVisit(visitor[key]); } return clone; } function cloneVisit(visit) { if (!visit || typeof visit !== "object") { return visit; } return { ...visit }; } function traverseAll(file, visitors) { const program = file.path; traverse( program.node, mergeVisitors(visitors), program.scope, (program.state = { file }), program, true, ); } function addPlugin(meta, arr, plugin) { if (plugin) { const hook = plugin.hook.default || plugin.hook; if (plugin.path) { meta.watchFiles.push(plugin.path); } if (Array.isArray(hook)) { arr.push(...hook); } else { arr.push(hook); } } } function stripTypes(file) { const importScriptlets = new Map(); for (const path of file.path.get("body")) { if (path.type === "MarkoScriptlet" && path.node.static) { for (const stmt of path.get("body")) { if (stmt.isImportDeclaration()) { // Hoist import declarations from scriptlets // temporarily so that they will be processed by // babel typescript transform. const importNode = stmt.node; importScriptlets.set(importNode, path.node); stmt.remove(); path.insertBefore(importNode); } } } } traverseAll(file, stripTypesVisitor); for (const path of file.path.get("body")) { if (path.type === "ExportNamedDeclaration") { if (!(path.node.declaration || path.node.specifiers.length)) { // The babel typescript plugin will add an empty export declaration // if there are no other imports/exports in the file. // This is not needed for Marko file outputs since there is always // a default export. path.remove(); } } else if (path.isImportDeclaration()) { const importNode = path.node; const scriptlet = importScriptlets.get(importNode); if (scriptlet) { let hasTypes = false; for (const specifier of path.get("specifiers")) { if ( specifier.node.type === "ImportSpecifier" && specifier.node.importKind === "type" ) { hasTypes = true; specifier.remove(); } } path.remove(); // Add back imports from scriptlets that were // hoisted for the babel typescript transform. if (!hasTypes || importNode.specifiers.length) { scriptlet.body.unshift(importNode); } } } } } function isMarkoOutput(output) { return output === "source" || output === "migrate"; } function finalizeMeta(meta) { meta.watchFiles = [...new Set(meta.watchFiles)]; if (meta.analyzedTags) { meta.analyzedTags = [...meta.analyzedTags]; } } ================================================ FILE: packages/compiler/src/babel-plugin/parser.js ================================================ import { getTagDefForTagName, parseArgs, parseExpression, parseParams, parseStatements, parseTemplateLiteral, parseTypeArgs, parseTypeParams, parseVar, } from "@marko/compiler/babel-utils"; import { types as t } from "@marko/compiler/internal/babel"; import { createParser, TagType } from "htmljs-parser"; import { buildCodeFrameError } from "../util/build-code-frame"; import throwAggregateError from "../util/merge-errors"; const noop = () => {}; const emptyRange = (part) => part.start === part.end; const isAttrTag = (tag) => tag.name.value?.[0] === "@"; const isStatementTag = (tag) => tag.tagDef?.parseOptions?.statement; const toBabelPosition = ({ line, character }) => ({ // Babel lines start at 1 and use "column" instead of "character". line: line + 1, column: character, }); export function parseMarko(file) { const { code } = file; const { htmlParseOptions = {} } = file.markoOpts; const { watchFiles } = file.metadata.marko; const parseVisits = []; let currentTag = file.path; let currentBody = currentTag; let currentAttr = undefined; let currentShorthandId = undefined; let currentShorthandClassNames = undefined; let { preserveWhitespace } = htmlParseOptions; let preservingWhitespaceUntil = preserveWhitespace; let onNext = noop; const positionAt = (index) => toBabelPosition(parser.positionAt(index)); const locationAt = (range) => { const { start, end } = parser.locationAt(range); return { start: toBabelPosition(start), end: toBabelPosition(end), }; }; const withLoc = (node, range) => { node.start = range.start; node.end = range.end; node.loc = locationAt(range); return node; }; const enterTag = (node) => { if (isAttrTag(node)) { if (currentTag === file.path) { throw file.buildCodeFrameError( node.name, "@tags must be nested within another element.", ); } let previousSiblingIndex = currentBody.length; while (previousSiblingIndex) { let previousSibling = currentBody[--previousSiblingIndex]; if (!t.isMarkoComment(previousSibling)) { break; } currentTag.pushContainer("attributeTags", previousSibling.node); currentBody.get("body").get(previousSiblingIndex).remove(); } currentTag = currentTag.pushContainer("attributeTags", node)[0]; } else { currentTag = currentBody.pushContainer("body", node)[0]; } currentBody = currentTag.get("body"); onNext(node); }; const pushContent = (node) => { currentBody.node.body.push(node); onNext(node); }; const endAttr = () => { if (currentAttr) { currentAttr.loc = locationAt(currentAttr); currentAttr = undefined; } }; const parseTemplateString = ({ quasis, expressions }) => { switch (expressions.length) { case 0: { const [first] = quasis; return withLoc(t.stringLiteral(parser.read(first)), first); } case 1: { if (emptyRange(quasis[0]) && emptyRange(quasis[1])) { const [{ value }] = expressions; const result = parseExpression( file, parser.read(value), value.start, value.end, ); if (t.isStringLiteral(result)) { // convert to template literal just so that we don't mistake it for a native tag if this is a tag name. return withLoc( t.templateLiteral([templateElement(result.value, true)], []), value, ); } else { return result; } } } } const [{ start }] = quasis; const end = quasis[quasis.length - 1].end; return parseTemplateLiteral(file, parser.read({ start, end }), start, end); }; const parser = createParser({ onError(part) { const err = buildCodeFrameError( file.opts.filename, file.code, locationAt(part), part.message, ); if (!file.___hasParseErrors) { throw err; } const errors = []; t.traverseFast(file.path.node, (node) => { if (node.type === "MarkoParseError") { errors.push( buildCodeFrameError( file.opts.filename, file.code, node.errorLoc || node.loc, node.label, ), ); } }); errors.push(err); throwAggregateError(errors); }, onText(part) { const rawValue = parser.read(part); if (preservingWhitespaceUntil) { pushContent(withLoc(t.markoText(rawValue), part)); return; } if (/^(?:[\n\r]\s*)?(?:[\n\r]\s*)?$/.test(rawValue)) return; const { body } = currentBody.node; let prev; let prevIndex = body.length; // Find previous non-scriptlet or comment. while (prevIndex > 0) { prev = body[--prevIndex]; if (t.isMarkoScriptlet(prev) || t.isMarkoComment(prev)) { prev = undefined; } else { break; } } let value = rawValue; switch (prev?.type) { case "MarkoPlaceholder": break; case "MarkoText": if (/\s$/.test(prev.value)) { value = value.replace(/^\s+/, ""); } break; case "MarkoTag": if (isStatementTag(prev) || isAttrTag(prev)) { value = value.replace(/^[\n\r]\s*/, ""); } break; default: value = value.replace(/^[\n\r]\s*/, ""); break; } if (!value) return; const node = t.markoText(value); pushContent(node); onNext = (next) => { switch (next?.type) { case "MarkoScriptlet": case "MarkoComment": return; case "MarkoPlaceholder": break; case "MarkoText": if (/^\s/.test(next.value)) { value = value.replace(/\s+$/, ""); } break; case "MarkoTag": if (isStatementTag(next) || isAttrTag(next)) { value = value.replace(/[\n\r]\s*$/, ""); } break; default: value = value.replace(/[\n\r]\s*$/, ""); break; } node.value = value.replace(/\s+/g, " "); if (node.value) { const trimmedStart = part.start + rawValue.indexOf(value); withLoc(node, { start: trimmedStart, end: trimmedStart + rawValue.length, }); } else { body.splice(body.indexOf(node), 1); } onNext = noop; }; }, onCDATA(part) { pushContent(withLoc(t.markoCDATA(parser.read(part.value)), part)); }, onDoctype(part) { pushContent(withLoc(t.markoDocumentType(parser.read(part.value)), part)); }, onDeclaration(part) { pushContent(withLoc(t.markoDeclaration(parser.read(part.value)), part)); }, onComment(part) { pushContent(withLoc(t.markoComment(parser.read(part.value)), part)); }, onTagTypeArgs(part) { currentTag.node.typeArguments = parseTypeArgs( file, parser.read(part.value), part.value.start, part.value.end, ); }, onTagTypeParams(part) { currentBody.node.typeParameters = parseTypeParams( file, parser.read(part.value), part.value.start, part.value.end, ); }, onPlaceholder(part) { pushContent( withLoc( t.markoPlaceholder( parseExpression( file, parser.read(part.value), part.value.start, part.value.end, ), part.escape, ), part, ), ); }, onScriptlet(part) { pushContent( withLoc( t.markoScriptlet( parseStatements( file, parser.read(part.value), part.value.start, part.value.end, ), ), part, ), ); }, onOpenTagName(part) { const tagName = parseTemplateString(part); const node = t.markoTag(tagName, [], t.markoTagBody()); let parseType = TagType.html; node.start = part.start - (part.start && code[part.start - 1] === "<" ? 1 : 0); // Account for leading `<` in html mode. node.end = part.end; if (t.isStringLiteral(tagName)) { const literalTagName = tagName.value || (tagName.value = "div"); if (literalTagName === "%") { throw file.buildCodeFrameError( tagName, "<% scriptlets %> are no longer supported.", ); } const parseOptions = (node.tagDef = getTagDefForTagName( file, literalTagName, ))?.parseOptions; if (parseOptions) { if (parseOptions.preserveWhitespace) { preservingWhitespaceUntil = node; } if (parseOptions.statement) { parseType = TagType.statement; } else if (parseOptions.openTagOnly) { parseType = TagType.void; } else if (parseOptions.text) { parseType = TagType.text; } } } enterTag(node); return parseType; }, onTagShorthandId(part) { currentShorthandId = parseTemplateString(part); }, onTagShorthandClass(part) { if (currentShorthandClassNames) { currentShorthandClassNames.push(parseTemplateString(part)); } else { currentShorthandClassNames = [parseTemplateString(part)]; } }, onTagVar({ value }) { currentTag.node.var = parseVar( file, parser.read(value), value.start, value.end, ); }, onTagParams({ value }) { currentTag.node.body.params = parseParams( file, parser.read(value), value.start, value.end, ); }, onTagArgs({ value }) { currentTag.node.arguments = parseArgs( file, parser.read(value), value.start, value.end, ); }, onAttrName(part) { let name = parser.read(part); let modifier = null; const modifierIndex = name.lastIndexOf(":"); if (~modifierIndex) { modifier = name.slice(modifierIndex + 1); name = name.slice(0, modifierIndex); } endAttr(); currentTag.node.attributes.push( (currentAttr = t.markoAttribute( name || "value", t.booleanLiteral(true), modifier, undefined, !name, )), ); currentAttr.start = part.start; currentAttr.end = part.end; }, onAttrArgs({ value, end }) { currentAttr.arguments = parseArgs( file, parser.read(value), value.start, value.end, ); currentAttr.end = end; }, onAttrValue(part) { currentAttr.end = part.end; currentAttr.bound = part.bound; currentAttr.value = parseExpression( file, parser.read(part.value), part.value.start, ); }, onAttrMethod(part) { currentAttr.end = part.end; currentAttr.value = withLoc( t.functionExpression( undefined, parseParams( file, parser.read(part.params.value), part.params.value.start, part.params.value.end, ), t.blockStatement( parseStatements( file, parser.read(part.body.value), part.body.value.start, part.body.value.end, ), ), ), part, ); }, onAttrSpread(part) { endAttr(); currentTag.node.attributes.push( withLoc( t.markoSpreadAttribute( parseExpression(file, parser.read(part.value), part.value.start), ), part, ), ); }, onOpenTagEnd(part) { const { node } = currentTag; const { attributes } = node; const parseOptions = node.tagDef?.parseOptions; endAttr(); if (currentShorthandClassNames) { let foundClassAttr = false; const classShorthandValue = currentShorthandClassNames.length === 1 ? currentShorthandClassNames[0] : currentShorthandClassNames.every((expr) => t.isStringLiteral(expr), ) ? withLoc( t.stringLiteral( currentShorthandClassNames .map((node) => node.value) .join(" "), ), { start: currentShorthandClassNames[0].start, end: currentShorthandClassNames[ currentShorthandClassNames.length - 1 ].end, }, ) : t.arrayExpression(currentShorthandClassNames); for (const attr of attributes) { if (attr.name === "class") { foundClassAttr = true; if ( t.isStringLiteral(attr.value) && t.isStringLiteral(classShorthandValue) ) { attr.value = t.templateLiteral( [ templateElement("", false), templateElement(" ", false), templateElement("", true), ], [classShorthandValue, attr.value], ); } else { attr.value = t.arrayExpression( t.isArrayExpression(classShorthandValue) ? classShorthandValue.elements.concat( t.isArrayExpression(attr.value) ? attr.value.elements : attr.value, ) : t.isArrayExpression(attr.value) ? [classShorthandValue].concat(attr.value.elements) : [classShorthandValue, attr.value], ); } break; } } if (!foundClassAttr) { attributes.push(t.markoAttribute("class", classShorthandValue)); } currentShorthandClassNames = undefined; } if (currentShorthandId) { for (const attr of attributes) { if (attr.name === "id") { throw file.buildCodeFrameError( attr, "Cannot have shorthand id and id attribute.", ); } } attributes.push(t.markoAttribute("id", currentShorthandId)); currentShorthandId = undefined; } if (parseOptions) { if (parseOptions.rawOpenTag) { node.rawValue = parser.read({ start: node.name.start, end: part.start, }); } if ( part.selfClosed || parseOptions.statement || parseOptions.openTagOnly ) { this.onCloseTagEnd(part); } } else if (part.selfClosed) { this.onCloseTagEnd(part); } }, onCloseTagEnd(part) { const { node } = currentTag; const tagDef = node.tagDef; const parserPlugin = tagDef?.parser; if (preservingWhitespaceUntil === node) { preservingWhitespaceUntil = undefined; } node.end = part.end; node.loc = locationAt(node); if (parserPlugin) { const { hook } = parserPlugin; if (parserPlugin.path) watchFiles.push(parserPlugin.path); parseVisits.push(hook.default || hook, currentTag); } const parentTag = isAttrTag(node) ? currentTag.parentPath : currentTag.parentPath.parentPath; const { attributeTags } = node; if (attributeTags.length) { const isControlFlow = tagDef?.parseOptions?.controlFlow; if (node.body.body.length) { const body = []; // When we have a control flow with mixed body and attribute tag content // we move any scriptlets, comments or empty nested control flow. // This is because they initially ambiguous as to whether // they are part of the body or the attributeTags. // Otherwise we only move scriptlets. for (const child of node.body.body) { if ( t.isMarkoScriptlet(child) || (isControlFlow && t.isMarkoComment(child)) ) { attributeTags.push(child); } else if ( isControlFlow && child.tagDef?.controlFlow && !child.body.body.length ) { child.body.attributeTags = true; attributeTags.push(child); } else { body.push(child); } } if (isControlFlow) { if (body.length) { onNext(); throw file.buildCodeFrameError( body[0], "Cannot have attribute tags and body content under a control flow tag.", ); } node.attributeTags = body; node.body.body = attributeTags; node.body.attributeTags = true; } else { node.body.body = body; } attributeTags.sort(sortByStart); } else if (isControlFlow) { node.attributeTags = []; node.body.body = attributeTags; node.body.attributeTags = true; } if (isControlFlow) { currentTag.remove(); parentTag.pushContainer("attributeTags", node); } } if (parentTag) { currentTag = parentTag; currentBody = currentTag.get("body"); } else { currentTag = currentBody = file.path; } onNext(); }, }); parser.parse(code); onNext(); for (let i = 0; i < parseVisits.length; ) { parseVisits[i++](parseVisits[i++]); } const { ast } = file; const { program } = ast; ast.start = program.start = 0; ast.end = program.end = code.length - 1; ast.loc = program.loc = { start: { line: 1, column: 0 }, end: positionAt(ast.end), }; } function sortByStart(a, b) { return a.start - b.start; } function templateElement(value, tail) { return t.templateElement({ tail, raw: value, cooked: value, }); } ================================================ FILE: packages/compiler/src/babel-plugin/plugins/migrate.js ================================================ import { getTagDef, getTagDefForTagName } from "@marko/compiler/babel-utils"; import { types as t } from "@marko/compiler/internal/babel"; import { enter, exit } from "../util/plugin-hooks"; /** * Applies custom migrators on tags. */ export const visitor = { MarkoTag: { enter(path) { const migrators = getMigratorsForTag(path); const { node } = path; for (const migrator of migrators) { enter(migrator, path, t); if (path.node !== node) break; // Stop if node is replaced. } }, exit(path) { const migrators = getMigratorsForTag(path); const { node } = path; for (const migrator of migrators) { exit(migrator, path, t); if (path.node !== node) break; // Stop if node is replaced. } }, }, }; function getMigratorsForTag(path) { const { hub: { file }, } = path; const { watchFiles } = file.metadata.marko; const tagName = path.get("name.value").node || "*"; const MIGRATOR_CACHE = (file.MIGRATOR_CACHE = file.MIGRATOR_CACHE || Object.create(null)); let migrators = MIGRATOR_CACHE[tagName]; if (!migrators) { migrators = MIGRATOR_CACHE[tagName] = []; const addMigrators = (tagDef) => { if (tagDef && tagDef.migrators) { for (const migrator of tagDef.migrators) { if (migrator.path) { watchFiles.push(migrator.path); } migrators.push(migrator.hook.default || migrator.hook); } } }; addMigrators(getTagDef(path)); if (tagName !== "*") { addMigrators(getTagDefForTagName(file, "*")); } } return migrators; } ================================================ FILE: packages/compiler/src/babel-plugin/plugins/transform.js ================================================ import { getTagDef, getTagDefForTagName } from "@marko/compiler/babel-utils"; import { types as t } from "@marko/compiler/internal/babel"; import { enter, exit } from "../util/plugin-hooks"; /** * Applies custom transformers on tags. */ export const visitor = { MarkoTag: { enter(path) { const transformers = getTransformersForTag(path); const { node } = path; for (const transformer of transformers) { enter(transformer, path, t); if (path.node !== node) break; // Stop if node is replaced. } }, exit(path) { const transformers = getTransformersForTag(path); const { node } = path; for (const transformer of transformers) { exit(transformer, path, t); if (path.node !== node) break; // Stop if node is replaced. } }, }, }; function getTransformersForTag(path) { const { hub: { file }, } = path; const { watchFiles } = file.metadata.marko; const tagName = path.get("name.value").node || "*"; const TRANSFORMER_CACHE = (file.TRANSFORMER_CACHE = file.TRANSFORMER_CACHE || Object.create(null)); let transformers = TRANSFORMER_CACHE[tagName]; if (!transformers) { transformers = TRANSFORMER_CACHE[tagName] = []; const addTransformers = (tagDef) => { if (tagDef && tagDef.transformers) { for (const transformer of tagDef.transformers) { if (transformer.path) { watchFiles.push(transformer.path); } transformers.push(transformer.hook.default || transformer.hook); } } }; addTransformers(getTagDef(path)); if (tagName !== "*") { addTransformers(getTagDefForTagName(file, "*")); } } return transformers; } ================================================ FILE: packages/compiler/src/babel-plugin/util/plugin-hooks.js ================================================ // Utilities for executing multi step compiler hooks (migrators & transformers). export function enter(plugin, ...args) { const fn = (plugin && (plugin.enter || (plugin.default && plugin.default.enter) || plugin.default)) || plugin; if (typeof fn === "function") { fn(...args); } } export function exit(plugin, ...args) { const fn = plugin && (plugin.exit || (plugin.default ? plugin.default.exit : undefined)); if (typeof fn === "function") { fn(...args); } } ================================================ FILE: packages/compiler/src/babel-utils/assert.js ================================================ export function assertAllowedAttributes(path, allowed) { let i = 0; for (const attr of path.node.attributes) { if (attr.type === "MarkoSpreadAttribute") { throw path.hub.buildError( attr, `Tag does not support spread attributes.`, ); } else if (!allowed.includes(attr.name)) { throw path.hub.buildError( attr, `Tag does not support the \`${attr.name}\` attribute.`, ); } i++; } } export function assertNoAttributes(path) { const { attributes } = path.node; if (attributes.length) { const start = attributes[0].loc.start; const end = attributes[attributes.length - 1].loc.end; throw path.hub.buildError( { loc: { start, end } }, "Tag does not support attributes.", ); } } export function assertNoParams(path) { const { params } = path.node.body; if (params.length) { const start = params[0].loc.start; const end = params[params.length - 1].loc.end; throw path.hub.buildError( { loc: { start, end } }, "Tag does not support parameters.", ); } } export function assertNoAttributeTags(path) { if (path.node.attributeTags.length) { throw path.hub.buildError( path.node.attributeTags[0], "Tag not support nested attribute tags.", ); } } export function assertNoArgs(path) { const args = path.node.arguments; if (args && args.length) { const start = args[0].loc.start; const end = args[args.length - 1].loc.end; throw path.hub.buildError( { loc: { start, end } }, "Tag does not support arguments.", ); } } export function assertNoVar(path) { if (path.node.var) { throw path.hub.buildError( path.node.var, "Tag does not support a variable.", ); } } export function assertAttributesOrArgs(path) { const { node } = path; const args = node.arguments; if (args && args.length && (node.attributes.length > 0 || node.body.length)) { const start = args[0].loc.start; const end = args[args.length - 1].loc.end; throw path.hub.buildError( { loc: { start, end } }, "Tag does not support arguments when attributes or body present.", ); } } export function assertAttributesOrSingleArg(path) { assertAttributesOrArgs(path); const args = path.node.arguments; if (args && args.length > 1) { const start = args[1].loc.start; const end = args[args.length - 1].loc.end; throw path.hub.buildError( { loc: { start, end } }, "Tag does not support multiple arguments.", ); } } ================================================ FILE: packages/compiler/src/babel-utils/compute.js ================================================ /** * @param {import("@babel/types").Node} node */ export function computeNode(node) { switch (node.type) { case "StringLiteral": case "NumericLiteral": case "BooleanLiteral": return { value: node.value }; case "RegExpLiteral": return { value: new RegExp(node.pattern, node.flags) }; case "NullLiteral": return { value: null }; case "Identifier": switch (node.name) { case "undefined": return { value: undefined }; case "NaN": return { value: NaN }; case "Infinity": return { value: Infinity }; default: return; } case "BigIntLiteral": return { value: BigInt(node.value) }; case "ParenthesizedExpression": return computeNode(node.expression); case "BinaryExpression": { const left = computeNode(node.left); if (!left) return; const right = computeNode(node.right); if (!right) return; switch (node.operator) { case "+": return { value: left.value + right.value }; case "-": return { value: left.value - right.value }; case "*": return { value: left.value * right.value }; case "/": return { value: left.value / right.value }; case "%": return { value: left.value % right.value }; case "**": return { value: left.value ** right.value }; case "|": return { value: left.value | right.value }; case "&": return { value: left.value & right.value }; case "^": return { value: left.value ^ right.value }; case "<<": return { value: left.value << right.value }; case ">>": return { value: left.value >> right.value }; case ">>>": return { value: left.value >>> right.value }; case "==": return { value: left.value == right.value }; case "!=": return { value: left.value != right.value }; case "===": return { value: left.value === right.value }; case "!==": return { value: left.value !== right.value }; case "<": return { value: left.value < right.value }; case "<=": return { value: left.value <= right.value }; case ">": return { value: left.value > right.value }; case ">=": return { value: left.value >= right.value }; default: return; } } case "UnaryExpression": { const arg = computeNode(node.argument); if (!arg) return; switch (node.operator) { case "+": return { value: +arg.value }; case "-": return { value: -arg.value }; case "~": return { value: ~arg.value }; case "!": return { value: !arg.value }; case "typeof": return { value: typeof arg.value }; case "void": return { value: void arg.value }; default: return; } } case "LogicalExpression": { const left = computeNode(node.left); if (!left) return; const right = computeNode(node.right); if (!right) return; switch (node.operator) { case "&&": return { value: left.value && right.value }; case "||": return { value: left.value || right.value }; case "??": return { value: left.value ?? right.value }; default: return; } } case "ConditionalExpression": { const test = computeNode(node.test); if (!test) return; const consequent = computeNode(node.consequent); if (!consequent) return; const alternate = computeNode(node.alternate); if (!alternate) return; return { value: test.value ? consequent.value : alternate.value }; } case "TemplateLiteral": { let value = node.quasis[0].value.cooked; for (let i = 0; i < node.expressions.length; i++) { const expr = computeNode(node.expressions[i]); if (!expr) return; value += expr.value + node.quasis[i + 1].value.cooked; } return { value }; } case "ObjectExpression": { const value = {}; for (const prop of node.properties) { if (prop.decorators) return; switch (prop.type) { case "ObjectProperty": { let key; if (prop.computed) { const keyNode = computeNode(prop.key); if (!keyNode) return; key = keyNode.value + ""; } else { switch (prop.key.type) { case "Identifier": key = prop.key.name; break; case "StringLiteral": key = prop.key.value; break; default: return; } } const propValue = computeNode(prop.value); if (!propValue) return; value[key] = propValue.value; break; } case "SpreadElement": { const arg = computeNode(prop.argument); if (!arg) return; Object.assign(value, arg.value); break; } } } return { value }; } case "ArrayExpression": { const value = []; for (const elem of node.elements) { if (elem) { if (elem.type === "SpreadElement") { const arg = computeNode(elem.argument); if (typeof arg?.value?.[Symbol.iterator] !== "function") return; for (const item of arg.value) { value.push(item); } } else { const elemValue = computeNode(elem); if (!elemValue) return; value.push(elemValue.value); } } else { value.length++; } } return { value }; } } } ================================================ FILE: packages/compiler/src/babel-utils/diagnostics.js ================================================ export const DiagnosticType = { Error: "error", Warning: "warning", Deprecation: "deprecation", Suggestion: "suggestion", }; export function diagnosticError(path, options) { add(DiagnosticType.Error, path, options); } export function diagnosticWarn(path, options) { add(DiagnosticType.Warning, path, options); } export function diagnosticDeprecate(path, options) { add(DiagnosticType.Deprecation, path, options); } export function diagnosticSuggest(path, options) { add(DiagnosticType.Suggestion, path, options); } function add(type, path, options) { const { file } = path.hub; const { diagnostics } = file.metadata.marko; const { label, fix: rawFix, loc = path.node.loc } = options; let fix = false; if (rawFix) { switch (file.___compileStage) { case "parse": case "migrate": break; default: throw new Error( "Diagnostic fixes can only be registered up to and including the migrate stage.", ); } const { applyFixes } = file.markoOpts; let apply; if (typeof rawFix === "function") { apply = rawFix; fix = true; } else { // strip off the apply function. ({ apply, ...fix } = rawFix); } if (applyFixes) { const i = diagnostics.length; if (applyFixes.has(i)) { apply(applyFixes.get(i)); } } else { apply(undefined); } } diagnostics.push({ type, label, loc, fix }); } ================================================ FILE: packages/compiler/src/babel-utils/get-file.js ================================================ let currentFile; export function getFile() { if (currentFile) { return currentFile; } throw new Error("Unable to access Marko File outside of a compilation"); } export function getProgram() { if (currentFile) { return currentFile.path; } throw new Error("Unable to access Marko Program outside of a compilation"); } export function getFileInternal() { return currentFile; } export function setFileInternal(file) { return (currentFile = file); } ================================================ FILE: packages/compiler/src/babel-utils/imports.js ================================================ import { types as t } from "@marko/compiler"; import { cwd } from "@marko/compiler/modules"; import path from "path"; import { relativeImportPath } from "relative-import-path"; const IMPORTS_KEY = Symbol(); const FS_START = path.sep === "/" ? path.sep : /^(.*?:)/.exec(cwd)[1]; export function resolveRelativePath(file, request) { if (request.startsWith(FS_START)) { request = relativeImportPath(file.opts.filename, request); } if (file.markoOpts.optimize) { request = request.replace( /(^|\/node-modules\/)marko\/src\//, "$1marko/dist/", ); } return request; } export function importDefault(file, request, nameHint) { const imports = getImports(file); request = resolveRelativePath(file, request); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, (importDeclaration = file.path.pushContainer( "body", t.importDeclaration([], t.stringLiteral(request)), )[0]), ); } if (!nameHint) { return; } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find((specifier) => specifier.isImportDefaultSpecifier(), ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", t.importDefaultSpecifier(identifier), ); return identifier; } return t.identifier(specifier.node.local.name); } export function importNamed(file, request, name, nameHint = name) { request = resolveRelativePath(file, request); const imports = getImports(file); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, (importDeclaration = file.path.pushContainer( "body", t.importDeclaration([], t.stringLiteral(request)), )[0]), ); } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find( (specifier) => specifier.isImportSpecifier() && specifier.node.imported.name === name, ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", t.importSpecifier(identifier, t.identifier(name)), ); return identifier; } return t.identifier(specifier.node.local.name); } export function importStar(file, request, nameHint) { const imports = getImports(file); request = resolveRelativePath(file, request); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, (importDeclaration = file.path.pushContainer( "body", t.importDeclaration([], t.stringLiteral(request)), )[0]), ); } if (!nameHint) { return; } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find((specifier) => specifier.isImportNamespaceSpecifier(), ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", t.importNamespaceSpecifier(identifier), ); return identifier; } return t.identifier(specifier.node.local.name); } function getImports(file) { let imports = file.metadata.marko[IMPORTS_KEY]; if (!imports) { imports = file.metadata.marko[IMPORTS_KEY] = new Map(); } return imports; } ================================================ FILE: packages/compiler/src/babel-utils/index.js ================================================ export { assertAllowedAttributes, assertAttributesOrArgs, assertAttributesOrSingleArg, assertNoArgs, assertNoAttributes, assertNoAttributeTags, assertNoParams, assertNoVar, } from "./assert"; export { computeNode } from "./compute"; export { diagnosticDeprecate, diagnosticError, diagnosticSuggest, DiagnosticType, diagnosticWarn, } from "./diagnostics"; export { getFile, getProgram } from "./get-file"; export { importDefault, importNamed, importStar, resolveRelativePath, } from "./imports"; export { getEnd, getLoc, getLocRange, getStart, withLoc } from "./loc"; export { parseArgs, parseExpression, parseParams, parseStatements, parseTemplateLiteral, parseTypeArgs, parseTypeParams, parseVar, } from "./parse"; export { getTagDefForTagName, getTaglibLookup } from "./taglib"; export { findAttributeTags, findParentTag, getArgOrSequence, getFullyResolvedTagName, getMacroIdentifier, getMacroIdentifierForName, getTagDef, getTagTemplate, getTemplateId, hasMacro, isAttributeTag, isDynamicTag, isLoopTag, isMacroTag, isNativeTag, isTransparentTag, loadFileForImport, loadFileForTag, registerMacro, resolveTagImport, } from "./tags"; export { normalizeTemplateString } from "./template-string"; export function defineTag(tag) { return tag; } // just used for adding types for compiler plugins. ================================================ FILE: packages/compiler/src/babel-utils/loc.js ================================================ const LINE_INDEX_KEY = Symbol(); export function getLoc(file, index) { return findLoc(getLineIndexes(file), 0, index); } export function getLocRange(file, start, end) { const lineIndexes = getLineIndexes(file); const startLoc = findLoc(lineIndexes, 0, start); if (startLoc) { const endLoc = start === end ? startLoc : findLoc(lineIndexes, startLoc.line - 1, end); return { start: startLoc, end: endLoc, }; } } export function withLoc(file, node, start, end) { node.loc = getLocRange(file, start, end); node.start = start; node.end = end; return node; } export function getStart(file, node) { // Restore if merged: https://github.com/babel/babel/pull/16849 // if (node.start != null) { // return node.start; // } if (node.loc) { return locToIndex(file, node.loc.start); } return null; } export function getEnd(file, node) { // Restore if merged: https://github.com/babel/babel/pull/16849 // if (node.end != null) { // return node.end; // } if (node.loc) { return locToIndex(file, node.loc.end); } return null; } function locToIndex(file, loc) { const { line, column } = loc; return line === 1 ? column : getLineIndexes(file)[line - 1] + column + 1; } function getLineIndexes(file) { let lineIndexes = file.metadata.marko[LINE_INDEX_KEY]; if (!lineIndexes) { lineIndexes = [-1]; for (let i = 0; i < file.code.length; i++) { if (file.code[i] === "\n") { lineIndexes.push(i); } } file.metadata.marko[LINE_INDEX_KEY] = lineIndexes; } return lineIndexes; } function findLoc(lineIndexes, startLine, index) { if (index <= 0) { return { line: 1, column: 0, }; } const endLine = lineIndexes.length - 1; let max = endLine; let line = startLine; while (line < max) { const mid = (line + max) >>> 1; if (lineIndexes[mid] < index) { line = mid + 1; } else { max = mid; } } let lineIndex = lineIndexes[line]; if (lineIndex >= index) { lineIndex = lineIndexes[--line]; } if (line === 0) { return { line: 1, column: index, }; } return { line: line + 1, column: index - lineIndex - 1, }; } ================================================ FILE: packages/compiler/src/babel-utils/parse.js ================================================ import { types as t } from "@marko/compiler"; import { parse as babelParse, parseExpression as babelParseExpression, } from "@marko/compiler/internal/babel"; import { getLoc, getLocRange } from "./loc"; export function parseStatements( file, str, sourceStart, sourceEnd, sourceOffset, ) { return tryParse(file, false, str, sourceStart, sourceEnd, sourceOffset); } export function parseExpression( file, str, sourceStart, sourceEnd, sourceOffset, ) { return tryParse(file, true, str, sourceStart, sourceEnd, sourceOffset); } export function parseParams(file, str, sourceStart, sourceEnd) { const parsed = parseExpression( file, `(${str})=>{}`, sourceStart, sourceEnd, 1, ); if (parsed.type === "ArrowFunctionExpression") { return parsed.params; } return [ensureParseError(file, parsed, sourceStart, sourceEnd)]; } export function parseArgs(file, str, sourceStart, sourceEnd) { const parsed = parseExpression(file, `_(${str})`, sourceStart, sourceEnd, 2); if (parsed.type === "CallExpression") { return parsed.arguments; } return [ensureParseError(file, parsed, sourceStart, sourceEnd)]; } export function parseVar(file, str, sourceStart, sourceEnd) { const parsed = parseExpression( file, `(${str})=>{}`, sourceStart, sourceEnd, 1, ); if (parsed.type === "ArrowFunctionExpression" && parsed.params.length === 1) { return parsed.params[0]; } return ensureParseError(file, parsed, sourceStart, sourceEnd); } export function parseTemplateLiteral(file, str, sourceStart, sourceEnd) { const parsed = parseExpression( file, "`" + str + "`", sourceStart, sourceEnd, 1, ); if (parsed.type === "TemplateLiteral") { return t.templateLiteral(parsed.quasis, parsed.expressions); } return ensureParseError(file, parsed, sourceStart, sourceEnd); } export function parseTypeArgs(file, str, sourceStart, sourceEnd) { const parsed = parseExpression(file, `_<${str}>`, sourceStart, sourceEnd, 2); if (parsed.type === "TSInstantiationExpression") { // typeArguments is Flow only (not TS), we need to use typeParameters return parsed.typeParameters; } return [ensureParseError(file, parsed, sourceStart, sourceEnd)]; } export function parseTypeParams(file, str, sourceStart, sourceEnd) { const parsed = parseExpression( file, `<${str}>()=>{}`, sourceStart, sourceEnd, 1, ); if (parsed.type === "ArrowFunctionExpression") { return parsed.typeParameters; } return [ensureParseError(file, parsed, sourceStart, sourceEnd)]; } function tryParse( file, isExpression, code, sourceStart, sourceEnd, sourceOffset, ) { const { parserOpts } = file.opts; if (typeof sourceStart === "number") { const startLoc = getLoc(file, sourceStart); const startLine = startLoc.line; let startIndex = sourceStart; let startColumn = startLoc.column; if (sourceOffset) { startIndex -= sourceOffset; startColumn -= sourceOffset; } parserOpts.startLine = startLine; parserOpts.startIndex = startIndex; parserOpts.startColumn = startColumn; try { if (isExpression) { return babelParseExpression(code, parserOpts); } else { const { program } = babelParse(code, parserOpts); if (program.innerComments) { const lastNode = t.emptyStatement(); lastNode.trailingComments = program.innerComments; program.body.push(lastNode); } return program.body; } } catch (err) { const parseError = createParseError( file, sourceStart, sourceEnd, err.message, err.loc, ); if (isExpression) { return parseError; } else { return [parseError]; } } finally { parserOpts.startIndex = 0; parserOpts.startColumn = 0; parserOpts.startLine = 1; } } else { return isExpression ? t.cloneDeepWithoutLoc(babelParseExpression(code, parserOpts)) : babelParse(code, parserOpts).program.body.map((node) => t.cloneDeepWithoutLoc(node), ); } } function ensureParseError(file, node, sourceStart, sourceEnd) { if (node.type === "MarkoParseError") return node; return createParseError( file, sourceStart, sourceEnd, `Unexpected node of type ${node.type} returned while parsing.`, ); } function createParseError(file, sourceStart, sourceEnd, label, errorLoc) { file.___hasParseErrors = true; const loc = getLocRange(file, sourceStart, sourceEnd); return { type: "MarkoParseError", source: file.code.slice(sourceStart, sourceEnd), label: label.replace(/ *\(\d+:\d+\)$/, ""), errorLoc: errorLoc && getBoundedRange(loc, errorLoc), loc, start: sourceStart, end: sourceEnd, }; } function getBoundedRange(range, loc) { if (loc && typeof loc.line === "number") { const { start, end } = range; // If start is out of bounds return the source. if ( loc.line < start.line || (loc.line === start.line && loc.column < start.column) || loc.line > end.line || (loc.line === end.line && loc.column > end.column) ) { return range; } return { start: loc, end: loc }; } } ================================================ FILE: packages/compiler/src/babel-utils/taglib.js ================================================ const SEEN_TAGS_KEY = Symbol(); export function getTaglibLookup(file) { return file.___taglibLookup; } export function getTagDefForTagName(file, tagName) { const tagDef = getTaglibLookup(file).getTag(tagName); if (tagDef) { let seen = file.metadata.marko[SEEN_TAGS_KEY]; if (!seen) { seen = file.metadata.marko[SEEN_TAGS_KEY] = new Set(); } if (!seen.has(tagDef)) { seen.add(tagName); const { filePath } = tagDef; const len = filePath.length; if (filePath[len - 14] === "m" && filePath.endsWith("marko-tag.json")) { file.metadata.marko.watchFiles.push(filePath); } } } return tagDef; } ================================================ FILE: packages/compiler/src/babel-utils/tags.js ================================================ import { types as t } from "@marko/compiler"; import markoModules from "@marko/compiler/modules"; import { basename, dirname, join, relative, resolve } from "path"; import { Hash } from "../util/quick-hash"; import { diagnosticWarn } from "./diagnostics"; import { resolveRelativePath } from "./imports"; import { getTagDefForTagName } from "./taglib"; const { cwd, root } = markoModules; const MACRO_IDS_KEY = Symbol(); const MACRO_NAMES_KEY = "__marko_macro_names__"; // must be a string literal since it is used across compiler stages. const TRANSPARENT_TAGS = new Set([ "for", "while", "if", "else", "else-if", "_no-update", ]); export function isNativeTag(path) { if (path.node._isDynamicString) { return true; } const tagDef = getTagDef(path); return ( tagDef && tagDef.html && (tagDef.htmlType === "custom-element" || (!tagDef.template && !tagDef.renderer)) ); } export function isDynamicTag(path) { return !t.isStringLiteral(path.node.name); } export function isAttributeTag(path) { const { node: { name }, } = path; return t.isStringLiteral(name) && name.value[0] === "@"; } export function isTransparentTag(path) { const { node: { name }, } = path; return t.isStringLiteral(name) && TRANSPARENT_TAGS.has(name.value); } export function registerMacro(path, name) { const { file } = path.hub; const markoMeta = file.metadata.marko; const macroNames = markoMeta[MACRO_NAMES_KEY]; if (macroNames) { if (macroNames[name]) { diagnosticWarn(path, { label: `A macro with the name "${name}" already exists.`, fix() { findParentTag(path).remove(); }, }); } macroNames[name] = true; } else { markoMeta[MACRO_NAMES_KEY] = { [name]: true }; } } export function hasMacro(path, name) { const macroNames = path.hub.file.metadata.marko[MACRO_NAMES_KEY]; return !!(macroNames && macroNames[name]); } export function isMacroTag(path) { const { name } = path.node; return t.isStringLiteral(name) && hasMacro(path, name.value); } export function getMacroIdentifierForName(path, name) { const { file } = path.hub; if (file.___compileStage !== "translate") { throw new Error( "getMacroIdentifierForName can only be called during the translate phase of the compiler.", ); } const markoMeta = file.metadata.marko; let macroIds = markoMeta[MACRO_IDS_KEY]; if (!macroIds) { macroIds = markoMeta[MACRO_IDS_KEY] = {}; for (const macroName in markoMeta[MACRO_NAMES_KEY]) { macroIds[macroName] = file.path.scope.generateUid(macroName); } } const id = macroIds[name]; if (!id) { throw new Error( " was added programmatically, but was not registered via the 'registerMacro' api in @marko/compiler/babel-utils.", ); } return t.identifier(id); } export function getMacroIdentifier(path) { const { file } = path.hub; if (file.___compileStage !== "translate") { throw new Error( "getMacroIdentifier can only be called during the translate phase of the compiler.", ); } if (!isMacroTag(path)) { throw path.buildCodeFrameError( "getMacroIdentifier called on non macro referencing tag.", ); } return getMacroIdentifierForName(path, path.node.name.value); } export function getTagTemplate(tag) { const { node, hub: { file }, } = tag; if (node.extra?.tagNameImported) { return join(file.opts.filename, node.extra.tagNameImported); } return getTagDef(tag)?.template; } export function getTagDef(path) { const { node, hub: { file }, } = path; if (node.tagDef === undefined) { if (isDynamicTag(path) || isMacroTag(path)) { node.tagDef = null; } else { node.tagDef = getTagDefForTagName( file, isAttributeTag(path) ? getFullyResolvedTagName(path) : node.name.value, ) || null; } } return node.tagDef; } export function getFullyResolvedTagName(path) { const parts = []; let cur; do { cur = path.node.name.value; if (isAttributeTag(path)) { parts.push(cur.slice(1)); } else { parts.push(cur || "*"); break; } } while ((path = findParentTag(path))); return parts.reverse().join(":"); } export function findParentTag(path) { let cur = path.parentPath; while (cur.node) { if (cur.isMarkoTagBody()) { cur = cur.parentPath; continue; } if (!cur.isMarkoTag()) { break; } if (isTransparentTag(cur)) { cur = cur.parentPath; continue; } return cur; } } export function findAttributeTags(path, attributeTags = []) { const attrTags = path.node.body.attributeTags ? path.get("body").get("body") : path.get("attributeTags"); attrTags.forEach((child) => { if (isAttributeTag(child)) { attributeTags.push(child); } else if (isTransparentTag(child)) { findAttributeTags(child, attributeTags); } }); return attributeTags; } export function getArgOrSequence(path) { const { node: { arguments: args }, } = path; const len = args && args.length; if (len) { if (len > 1) { return t.sequenceExpression(args); } else { return args[0]; } } } export function isLoopTag(path) { if (!path.isMarkoTag()) { return false; } const tagName = path.node.name.value; return tagName === "while" || tagName === "for"; } export function loadFileForTag(tag) { const { file } = tag.hub; if (tag.node.extra?.tagNameImported) { return loadFileForImport(file, tag.node.extra?.tagNameImported); } const def = getTagDef(tag); const filename = def && def.template; if (filename) { return resolveMarkoFile(file, filename); } } export function loadFileForImport(file, request) { const relativeRequest = resolveTagImport(file.path, request); if (relativeRequest) { const filename = relativeRequest[0] === "." ? resolve(file.opts.filename, "..", relativeRequest) : markoModules.resolve(relativeRequest, dirname(file.opts.filename)); return resolveMarkoFile(file, filename); } } function resolveMarkoFile(file, filename) { if (filename === file.opts.filename) { if (file.___compileStage === "analyze") { return file; } return file.___getMarkoFile(file.code, file.opts, file.markoOpts); } try { const childFile = file.___getMarkoFile( file.markoOpts.fileSystem.readFileSync(filename).toString("utf-8"), createNewFileOpts(file.opts, filename), file.markoOpts, ); (file.metadata.marko.analyzedTags ||= new Set()).add(filename); return childFile; } catch (_) { // ignore } } const idCache = new WeakMap(); const templateIdHashOpts = { outputLength: 5 }; export function getTemplateId(opts, request, child) { if (!child && opts.getTemplateId) return opts.getTemplateId(request); const id = relative(root, request).replace(/[^a-zA-Z0-9_$./-]/g, "/"); if (opts.optimize) { const optimizeKnownTemplates = typeof opts === "object" && opts.optimizeKnownTemplates; const knownTemplatesSize = optimizeKnownTemplates?.length || 0; if (knownTemplatesSize) { let lookup = idCache.get(optimizeKnownTemplates); if (!lookup) { lookup = new Map(); idCache.set(optimizeKnownTemplates, lookup); for (let i = 0; i < knownTemplatesSize; i++) { lookup.set(optimizeKnownTemplates[i], { id: encodeTemplateId(i), children: new Map(), }); } } let registered = lookup.get(request); if (registered) { if (child) { let childId = registered.children.get(child); if (childId === undefined) { childId = registered.children.size; registered.children.set(child, childId); } return registered.id + childId; } return registered.id; } } const hash = new Hash().update(id); if (child) { hash.update(child); } return encodeTemplateId(hash.digest()); } return id + (child ? `_${child}` : ""); } export function resolveTagImport(path, request) { const { hub: { file }, } = path; if (request[0] === "<") { const tagName = request.slice(1, -1); const tagDef = getTagDefForTagName(file, tagName); const tagEntry = tagDef && (tagDef.renderer || tagDef.template); const relativePath = tagEntry && resolveRelativePath(file, tagEntry); if (!relativePath) { throw path.buildCodeFrameError( `Unable to find entry point for custom tag <${tagName}>.`, ); } return relativePath; } if (request.endsWith(".marko")) { return resolveRelativePath(file, request); } } function createNewFileOpts(opts, filename) { const sourceFileName = basename(filename); const sourceRoot = dirname(filename); const filenameRelative = relative(cwd, filename); return { ...opts, filename, sourceRoot, sourceFileName, filenameRelative, parserOpts: { ...opts.parserOpts, sourceFileName, }, generatorOpts: { ...opts.generatorOpts, filename, sourceRoot, sourceFileName, }, }; } function encodeTemplateId(id) { const c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789"; let n = id; let r = c[n % 53]; // Avoids chars that cannot start a property name and _ (reserved). n = Math.floor(n / 53); // ensure at most 7 characters. for (let i = 6; n > 0 && i--; n = Math.floor(n / 64)) { r += c[n & 63]; } return r; } ================================================ FILE: packages/compiler/src/babel-utils/template-string.js ================================================ import { types as t } from "@marko/compiler"; import jsesc from "jsesc"; export function normalizeTemplateString(quasis, ...expressions) { quasis = quasis.map((q) => (t.isTemplateElement(q) ? q.value.cooked : q)); for (let i = expressions.length; i--; ) { let v = expressions[i]; if (t.isTemplateLiteral(v)) { quasis[i] += v.quasis[0].value.cooked; quasis[i + 1] = v.quasis[v.quasis.length - 1].value.cooked + (quasis[i + 1] || ""); quasis.splice( i + 1, 0, ...v.quasis.slice(1, -1).map((q) => q.value.cooked), ); expressions.splice(i, 1, ...v.expressions); i += v.expressions.length; } else if (t.isStringLiteral(v) || typeof v === "string") { const value = t.isStringLiteral(v) ? v.value : v; quasis[i] += value + quasis[i + 1]; expressions.splice(i, 1); quasis.splice(i + 1, 1); } } if (!expressions.length) { // No expression, just return a literal or empty. const literal = quasis.join(""); return literal === "" ? undefined : t.stringLiteral(literal); } if ( expressions.length === 1 && quasis.length === 2 && quasis.every(isEmptyString) ) { // Only expression `${expr}` just return the expr. return expressions[0]; } // Do it. return t.templateLiteral(quasis.map(getTemplateElement), expressions); } function getTemplateElement(s = "") { return t.templateElement({ cooked: s, raw: jsesc(s, { quotes: "backtick" }), }); } function isEmptyString(s = "") { return s === ""; } ================================================ FILE: packages/compiler/src/config.js ================================================ import { pkg } from "@marko/compiler/modules"; import fs from "fs"; const config = { // The default output mode for compiled templates output: "html", // Override the runtimeid used when calling `marko/components.init` in the `hydrate` output. runtimeId: null, /** * Remove all typescript types from the output. * By default, the compiler will remove types from the output if the * `output` option is not `source` or `migrate`. */ stripTypes: undefined, // Have Marko provide the final AST in the compile result. ast: false, // Set the false to have Marko not generate the final code string, useful if just reading metadata or AST. code: true, /** * Whether the version should be written to the template as a comment e.g. * // Compiled using marko@x.x.x - DO NOT EDIT */ writeVersionComment: true, /** * Whether unrecognized tags should be ignored or not. This flag will * be enabled by default when compiling XML. */ ignoreUnrecognizedTags: false, /** * Whether source maps should be output with the compiled templates. * When `true` a `map` property will be available on the compile result. * When `"inline"` the sourcemap will be inlined as a comment in the output code. * When `"both"` both of the above will be used. */ sourceMaps: false, /** * This option inlines all of the meta data in the template. * You can also access this metadata via `compile(...).meta`. * This API is sticking around for compatibility purposes. */ meta: false, /** * Allows configuring Marko to compile to different runtimes. */ translator: (() => { const translatorReg = /^(?:@marko\/|marko-)runtime-/; const translatorInterop = "@marko/translator-interop-class-tags"; let translator; if (pkg) { if ( pkg.dependencies?.[translatorInterop] || pkg.devDependencies?.[translatorInterop] ) { return translatorInterop; } for (const name in pkg.dependencies) { if (translatorReg.test(name)) { if (translator && translator !== name) { return; } translator = name; } } for (const name in pkg.peerDependencies) { if (translatorReg.test(name)) { if (translator && translator !== name) { return; } translator = name; } } for (const name in pkg.devDependencies) { if (translatorReg.test(name)) { if (translator && translator !== name) { return; } translator = name; } } } if (translator) { translator += "/translator"; } return translator || "marko/translator"; })(), /** * Use a different file system object, eg webpacks CachedInputFileSystem or lasso-caching-fs */ fileSystem: fs, /** * By default Marko 5 outputs esm, you can optionally specify commonjs. * * Valid options: esm | cjs */ modules: "esm", /** * Enables production mode optimizations if true, or not if false. * If left as undefined checks for env === "production". */ optimize: undefined, /** * If `optimize` is enabled you can provide an array of template paths which the compiler will * use to generate shorter registry/template ids using incrementing ids. This can only be used * if the same `optimizeKnownTemplates` are used for both server and client compilations. */ optimizeKnownTemplates: undefined, /** * This option should be set if `hydrate` output is specified. * Maps a virtual dependency to a resolved file which can be implemented * for specific bundlers. */ resolveVirtualDependency: null, /** * Compiling a Marko template may require other (used) Marko templates to compile. * To prevent compiling templates more than once, most of the compilation is cached. */ cache: new Map(), /** * A regexp or function that receives an import path that matches file types known to be client side assets. */ hydrateIncludeImports: /\.(css|less|s[ac]ss|styl|png|jpe?g|gif|svg|ico|webp|avif|mp4|webm|ogg|mp3|wav|flac|aac|woff2?|eot|ttf|otf)$/, /** * When compiling in hydrate mode, this option will cause the compiler to * call the `marko/components.init` function to begin hydrating components. */ hydrateInit: true, /** * Set to true in order to bring in the hot module replacement runtime. */ hot: false, /** * Wether error diagnostics should be thrown as errors * before the compile result is returned. * * Note that the compiler can still throw errors even when true. * When the errorRecovery is true, any recoverable errors will be * returned in the `meta.diagnostics` property of the compile result. */ errorRecovery: false, // When supplied, any diagnostics which have a fix specified in the lookup will be applied to the source code. applyFixes: undefined, }; if ( typeof process === "object" && typeof process.env === "object" && process.env.MARKO_CONFIG ) { Object.assign(config, JSON.parse(process.env.MARKO_CONFIG)); } export default config; import taglibConfig from "./taglib/config"; taglibConfig.fs = config.fileSystem; ================================================ FILE: packages/compiler/src/index.js ================================================ import { DiagnosticType } from "@marko/compiler/babel-utils"; import { loadPartialConfig, loadPartialConfigAsync, pluginTransformModulesCommonjs, transformAsync, transformSync, types, } from "@marko/compiler/internal/babel"; import markoModules from "@marko/compiler/modules"; import path from "path"; import corePlugin from "./babel-plugin"; import defaultConfig from "./config"; import * as taglib from "./taglib"; import { buildCodeFrameError } from "./util/build-code-frame"; import throwAggregateError from "./util/merge-errors"; import shouldOptimize from "./util/should-optimize"; import tryLoadTranslator from "./util/try-load-translator"; export { taglib, types }; const hasBabel = !!( markoModules.pkg && (markoModules.pkg.dependencies?.["@babel/core"] || markoModules.pkg.devDependencies?.["@babel/core"]) ); export let globalConfig = { ...defaultConfig }; export function configure(newConfig) { globalConfig = { ...defaultConfig, ...newConfig }; } export async function compile(src, filename, config) { const markoConfig = loadMarkoConfig(config); const babelConfig = await loadBabelConfig(filename, markoConfig); const babelResult = await transformAsync(src, babelConfig); return buildResult(src, filename, markoConfig.errorRecovery, babelResult); } export function compileSync(src, filename, config) { const markoConfig = loadMarkoConfig(config); const babelConfig = loadBabelConfigSync(filename, markoConfig); const babelResult = transformSync(src, babelConfig); return buildResult(src, filename, markoConfig.errorRecovery, babelResult); } export async function compileFile(filename, config) { return new Promise((resolve, reject) => { getFs(config).readFile(filename, "utf-8", (err, src) => { if (err) { return reject(err); } return resolve(compile(src, filename, config)); }); }); } export function compileFileSync(filename, config) { const src = getFs(config).readFileSync(filename, "utf-8"); return compileSync(src, filename, config); } export function getRuntimeEntryFiles(output, requestedTranslator) { const translator = tryLoadTranslator(requestedTranslator); if (translator && translator.getRuntimeEntryFiles) { return translator.getRuntimeEntryFiles(output, shouldOptimize()); } return []; } function loadMarkoConfig(config) { const markoConfig = { ...globalConfig, ...config }; if (markoConfig.stripTypes === undefined) { markoConfig.stripTypes = isTranslatedOutput(markoConfig.output); } return markoConfig; } async function loadBabelConfig(filename, config) { const baseBabelConfig = getBaseBabelConfig(filename, config); return shouldResolveBabelConfig(config) ? (await loadPartialConfigAsync(baseBabelConfig)).options : baseBabelConfig; } function loadBabelConfigSync(filename, config) { const baseBabelConfig = getBaseBabelConfig(filename, config); return shouldResolveBabelConfig(config) ? loadPartialConfig(baseBabelConfig).options : baseBabelConfig; } function shouldResolveBabelConfig(config) { return !!( config.babelrc || config.configFile || config.browserslistConfigFile ); } function getBaseBabelConfig(filename, { babelConfig, ...markoConfig }) { const isTranslated = isTranslatedOutput(markoConfig.output); const loadConfig = isTranslated && hasBabel; const requiredPlugins = [[corePlugin, markoConfig]]; const baseBabelConfig = { filenameRelative: filename ? path.relative(markoModules.cwd, filename) : undefined, sourceRoot: filename ? path.dirname(filename) : undefined, sourceFileName: filename ? path.basename(filename) : undefined, babelrc: loadConfig, configFile: loadConfig, browserslistConfigFile: loadConfig, ...babelConfig, filename, sourceType: "module", sourceMaps: markoConfig.sourceMaps, code: markoConfig.code, ast: markoConfig.ast, plugins: babelConfig && babelConfig.plugins ? requiredPlugins.concat(babelConfig.plugins) : requiredPlugins, }; if (isTranslated) { if (markoConfig.modules === "cjs") { baseBabelConfig.plugins.push([ pluginTransformModulesCommonjs, { loose: true }, ]); } } return baseBabelConfig; } function buildResult(src, filename, errorRecovery, babelResult) { const { ast, map, code, metadata: { marko: meta }, } = babelResult; if (!errorRecovery) { const errors = []; for (const diag of meta.diagnostics) { if (diag.type === DiagnosticType.Error) { errors.push(buildCodeFrameError(filename, src, diag.loc, diag.label)); } } throwAggregateError(errors); } return { ast, map, code, meta }; } export function _clearDefaults() { globalConfig.cache.clear(); } function getFs(config) { return config.fileSystem || globalConfig.fileSystem; } function isTranslatedOutput(output) { return output !== "source" && output !== "migrate"; } ================================================ FILE: packages/compiler/src/register.js ================================================ "use strict"; const shouldOptimize = require("./util/should-optimize").default; const compiler = require("."); const requiredOptions = { modules: "cjs" }; const isDev = !shouldOptimize(); let setSourceMap = (filename, map) => { const sourceMaps = new Map([[filename, map]]); require("source-map-support").install({ handleUncaughtExceptions: false, environment: "node", retrieveSourceMap(source) { const map = sourceMaps.get(source); if (map) { return { url: null, map }; } return null; }, }); setSourceMap = (filename, map) => { sourceMaps.set(filename, map); }; }; module.exports = register; register(); function register({ extensions = require.extensions, ...options } = {}) { extensions[".marko"] = (module, filename) => { const compiled = compiler.compileFileSync( filename, Object.assign( { meta: true, hot: process.env.BROWSER_REFRESH_URL !== undefined, sourceMaps: isDev ? "both" : false, }, options, requiredOptions, ), ); if (compiled.map) { setSourceMap(filename, compiled.map); } return module._compile(compiled.code, filename); }; return extensions; } ================================================ FILE: packages/compiler/src/taglib/config.js ================================================ module.exports = { fs: undefined, onError: (err) => { throw err; }, }; ================================================ FILE: packages/compiler/src/taglib/finder/index.js ================================================ "use strict"; var nodePath = require("path"); var lassoPackageRoot = require("lasso-package-root"); var markoModules = require("@marko/compiler/modules"); var taglibConfig = require("../config"); var taglibLoader = require("../loader"); var findCache = {}; var excludedDirs = {}; var excludedPackages = {}; /** * Reset all internal state to the default state. This * was added for testing purposes. */ function reset() { clearCache(); excludedDirs = {}; excludedPackages = {}; } function getModuleRootPackage(dirname) { try { return lassoPackageRoot.getRootPackage(dirname); } catch (e) { return undefined; } } function getAllDependencyNames(pkg) { var map = {}; if (pkg.dependencies) { Object.keys(pkg.dependencies).forEach((name) => { map[name] = true; }); } if (pkg.peerDependencies) { Object.keys(pkg.peerDependencies).forEach((name) => { map[name] = true; }); } if (pkg.devDependencies) { Object.keys(pkg.devDependencies).forEach((name) => { map[name] = true; }); } return Object.keys(map); } function find(dirname, registeredTaglibs, tagDiscoveryDirs) { var cached = findCache[dirname]; if (cached) { return cached.taglibs; } var taglibs = []; var added = new Set(); var rootDirname = markoModules.cwd; // Don't search up past this directory var rootPkg = getModuleRootPackage(dirname); if (rootPkg) { rootDirname = rootPkg.__dirname; // Use the package's root directory as the top-level directory } // First walk up the directory tree looking for marko.json files or components/ directories let curDirname = dirname; // exclusiveTagDiscoveryDirs is used for the interop to detect if `tags` directories are used exclusively when finding tags let exclusiveTagDiscoveryDirs = undefined; while (true) { if (!excludedDirs[curDirname]) { let taglibPath = nodePath.join(curDirname, "marko.json"); let taglib; let manualTagsDir; if (existsSync(taglibPath)) { taglib = taglibLoader.loadTaglibFromFile(taglibPath); manualTagsDir = taglib.tagsDir; addTaglib(taglib); } if (manualTagsDir === undefined) { for (const tagDiscoveryDir of tagDiscoveryDirs) { const componentsPath = nodePath.join(curDirname, tagDiscoveryDir); if (existsSync(componentsPath) && !excludedDirs[componentsPath]) { if (exclusiveTagDiscoveryDirs !== false) { if (exclusiveTagDiscoveryDirs === undefined) { exclusiveTagDiscoveryDirs = tagDiscoveryDir; } else if (exclusiveTagDiscoveryDirs !== tagDiscoveryDir) { exclusiveTagDiscoveryDirs = false; } } addTaglib( taglibLoader.loadTaglibFromDir(curDirname, tagDiscoveryDir), ); } } } else if (manualTagsDir) { exclusiveTagDiscoveryDirs = false; } } if (curDirname === rootDirname) { break; } let parentDirname = nodePath.dirname(curDirname); if (!parentDirname || parentDirname === curDirname) { break; } curDirname = parentDirname; } if (rootPkg) { // Now look for `marko.json` from installed packages getAllDependencyNames(rootPkg).forEach((name) => { if (!excludedPackages[name]) { let taglibPath = markoModules.tryResolve( name + "/marko.json", rootPkg.__dirname, ); if (taglibPath) { var taglib = taglibLoader.loadTaglibFromFile(taglibPath, true); addTaglib(taglib); } } }); } for (let i = registeredTaglibs.length; i--; ) { addTaglib(registeredTaglibs[i]); } findCache[dirname] = { exclusiveTagDiscoveryDirs, taglibs }; return taglibs; function addTaglib(taglib) { if (!added.has(taglib.id)) { added.add(taglib.id); taglibs.push(taglib); } } } find._withMeta = function findWithMeta( dirname, registeredTaglibs, tagDiscoveryDirs, ) { find(dirname, registeredTaglibs, tagDiscoveryDirs); return findCache[dirname]; }; function clearCache() { findCache = {}; } function excludeDir(dir) { excludedDirs[dir] = true; } function excludePackage(name) { excludedPackages[name] = true; } function existsSync(file) { try { taglibConfig.fs.statSync(file); return true; } catch (_) { return false; } } exports.reset = reset; exports.find = find; exports.clearCache = clearCache; exports.excludeDir = excludeDir; exports.excludePackage = excludePackage; ================================================ FILE: packages/compiler/src/taglib/index.js ================================================ import markoModules from "@marko/compiler/modules"; import path from "path"; import tryLoadTranslator from "../util/try-load-translator"; import taglibConfig from "./config"; import finder from "./finder"; import loader from "./loader"; import Lookup from "./lookup"; export const excludeDir = finder.excludeDir; export const excludePackage = finder.excludePackage; import markoHTMLTaglib from "./marko-html.json"; import markoMathTaglib from "./marko-math.json"; import markoSVGTaglib from "./marko-svg.json"; const registeredTaglibs = []; const loadedTranslatorsTaglibs = new Map(); let lookupCache = Object.create(null); register(markoHTMLTaglib["taglib-id"], markoHTMLTaglib); register(markoSVGTaglib["taglib-id"], markoSVGTaglib); register(markoMathTaglib["taglib-id"], markoMathTaglib); export function buildLookup(dirname, requestedTranslator, onError) { const translator = tryLoadTranslator(requestedTranslator); if (!translator || !Array.isArray(translator.taglibs)) { throw new Error( "@marko/compiler: Invalid translator provided to buildLookup(dir, translator)", ); } let taglibsForDir = loadedTranslatorsTaglibs.get(translator); let exclusiveTagDiscoveryDirs = undefined; if (!taglibsForDir) { loadedTranslatorsTaglibs.set( translator, (taglibsForDir = registeredTaglibs.concat( resolveOptionalTaglibs(translator.optionalTaglibs || [], onError) .concat(translator.taglibs) .map(([id, props]) => loadTaglib(id, props)), )), ); } runAndCatchErrors(() => { const foundMeta = finder.find._withMeta( dirname, taglibsForDir, translator.tagDiscoveryDirs, ); taglibsForDir = foundMeta.taglibs; exclusiveTagDiscoveryDirs = foundMeta.exclusiveTagDiscoveryDirs; }, onError); const cacheKey = taglibsForDir .map((it) => it.id) .sort() .join(); let lookup = lookupCache[cacheKey]; if (!lookup) { lookup = lookupCache[cacheKey] = new Lookup(); lookup.exclusiveTagDiscoveryDirs = exclusiveTagDiscoveryDirs; for (let i = taglibsForDir.length; i--; ) { const taglib = taglibsForDir[i]; lookup.addTaglib(taglib); if (taglib.imports) { for (const importedTaglib of taglib.imports) { if (!lookup.hasTaglib(importedTaglib)) { lookup.addTaglib(importedTaglib); } } } } } return lookup; } export function register(id, props) { if (typeof props === "undefined") { [id, props] = resolveTaglib(id); } registeredTaglibs.push(loadTaglib(id, props)); } export function clearCaches() { loader.clearCache(); finder.clearCache(); lookupCache = Object.create(null); } export function resolveOptionalTaglibs(taglibIds, onError) { const resolvedTaglibs = []; for (const id of taglibIds) { if (hasRootDependency(id)) { runAndCatchErrors(() => { resolvedTaglibs.push(resolveTaglib(id)); }, onError); } } return resolvedTaglibs; } // Used by legacy compiler api. export const _loader = loader; export const _finder = finder; function runAndCatchErrors(fn, onError) { if (onError) { const prevOnError = taglibConfig.onError; taglibConfig.onError = onError; try { fn(); } catch (err) { taglibConfig.onError(err); } finally { taglibConfig.onError = prevOnError; } } else { fn(); } } function loadTaglib(id, props) { return loader.loadTaglibFromProps(loader.createTaglib(id), props); } function resolveTaglib(id) { switch (id[0]) { case ".": case "/": case "\\": break; default: if (!id.endsWith(".json")) { id = path.join(id, "marko.json"); } break; } const resolved = markoModules.resolve(id); return [resolved, markoModules.require(resolved)]; } function hasRootDependency(id) { return !!( markoModules.pkg && (markoModules.pkg.dependencies?.[id] || markoModules.pkg.devDependencies?.[id]) ); } ================================================ FILE: packages/compiler/src/taglib/loader/Attribute.js ================================================ "use strict"; class Attribute { constructor(name) { this.name = name; this.type = null; this.required = false; this.type = null; this.allowExpressions = true; this.setFlag = null; this.pattern = null; } } module.exports = Attribute; ================================================ FILE: packages/compiler/src/taglib/loader/DependencyChain.js ================================================ "use strict"; class DependencyChain { constructor(array) { this.array = array || []; } append(str) { return new DependencyChain(this.array.concat(str)); } toString() { return "[" + this.array.join(" → ") + "]"; } } module.exports = DependencyChain; ================================================ FILE: packages/compiler/src/taglib/loader/Property.js ================================================ "use strict"; class Property { constructor() { this.name = null; this.type = "string"; this.value = undefined; } } module.exports = Property; ================================================ FILE: packages/compiler/src/taglib/loader/Tag.js ================================================ "use strict"; var ok = require("assert").ok; var path = require("path"); var hasOwnProperty = Object.prototype.hasOwnProperty; class Tag { constructor(filePath) { this.filePath = filePath; if (filePath) { this.dir = path.dirname(filePath); } this.migrators = []; this.attributes = {}; this.transformers = []; this.patternAttributes = []; } addAttribute(attr) { attr.filePath = this.filePath; if (attr.pattern) { this.patternAttributes.push(attr); } else { if (attr.name === "*") { attr.dynamicAttribute = true; if (attr.targetProperty === undefined || attr.targetProperty === "") { attr.targetProperty = null; } } this.attributes[attr.name] = attr; } } toString() { return "[Tag: <" + this.name + "@" + this.taglibId + ">]"; } forEachAttribute(callback, thisObj) { for (var attrName in this.attributes) { if (hasOwnProperty.call(this.attributes, attrName)) { callback.call(thisObj, this.attributes[attrName]); } } } getAttribute(attrName) { var attributes = this.attributes; // try by exact match first var attribute = attributes[attrName] || attributes["*"]; if (attribute === undefined && this.patternAttributes) { // try searching by pattern for (var i = 0, len = this.patternAttributes.length; i < len; i++) { var patternAttribute = this.patternAttributes[i]; if (patternAttribute.pattern.test(attrName)) { attribute = patternAttribute; break; } } } return attribute; } hasAttribute(attrName) { return hasOwnProperty.call(this.attributes, attrName); } addNestedTag(nestedTag) { ok(nestedTag.name, '"nestedTag.name" is required'); if (!this.nestedTags) { this.nestedTags = {}; } nestedTag.isNestedTag = true; if (!nestedTag.targetProperty) { nestedTag.targetProperty = nestedTag.name; } this.nestedTags[nestedTag.name] = nestedTag; } hasNestedTags() { return this.nestedTags != null; } toJSON() { return this; } setTaglib(taglib) { this.taglibId = taglib ? taglib.id : null; this.taglibPath = taglib ? taglib.path : null; } } module.exports = Tag; ================================================ FILE: packages/compiler/src/taglib/loader/Taglib.js ================================================ "use strict"; var ok = require("assert").ok; var path = require("path"); var loaders = require("./loaders"); var hasOwnProperty = Object.prototype.hasOwnProperty; function handleImport(taglib, importedTaglib) { var importsLookup = taglib.importsLookup || (taglib.importsLookup = {}); if (hasOwnProperty.call(importsLookup, importedTaglib.path)) { return; } importsLookup[importedTaglib.path] = importedTaglib; if (!taglib.imports) { taglib.imports = []; } taglib.imports.push(importedTaglib); if (importedTaglib.imports) { importedTaglib.imports.forEach(function (nestedImportedTaglib) { handleImport(taglib, nestedImportedTaglib); }); } } class Taglib { constructor(filePath, isFromPackageJson) { ok(filePath, '"filePath" expected'); this.filePath = this.path /* deprecated */ = this.id = filePath; this.isFromPackageJson = isFromPackageJson === true; this.dirname = path.dirname(this.filePath); this.scriptLang = undefined; this.tags = {}; this.migrators = []; this.transformers = []; this.attributes = {}; this.patternAttributes = []; this.imports = null; this.importsLookup = null; this.tagsDir = undefined; } addAttribute(attribute) { ok(attribute.key, '"key" is required for global attributes'); attribute.filePath = this.filePath; if (!attribute.pattern && !attribute.name) { throw new Error("Invalid attribute: " + JSON.stringify(attribute)); } this.attributes[attribute.key] = attribute; } getAttribute(name) { var attribute = this.attributes[name]; if (!attribute) { for (var i = 0, len = this.patternAttributes.length; i < len; i++) { var patternAttribute = this.patternAttributes[i]; if (patternAttribute.pattern.test(name)) { attribute = patternAttribute; } } } return attribute; } addTag(tag) { ok(arguments.length === 1, "Invalid args"); if (!tag.name) { throw new Error('"tag.name" is required: ' + JSON.stringify(tag)); } this.tags[tag.name] = tag; tag.taglibId = this.id || this.path; } addImport(path) { var importedTaglib = loaders.loadTaglibFromFile(path); handleImport(this, importedTaglib); } toJSON() { return { path: this.path, tags: this.tags, attributes: this.attributes, patternAttributes: this.patternAttributes, imports: this.imports, }; } } module.exports = Taglib; ================================================ FILE: packages/compiler/src/taglib/loader/Transformer.js ================================================ "use strict"; var nextTransformerId = 0; class Transformer { constructor() { this.id = nextTransformerId++; this.name = null; this.tag = null; this.path = null; this._func = null; } toString() { return "[Taglib.Transformer: " + this.path + "]"; } } module.exports = Transformer; ================================================ FILE: packages/compiler/src/taglib/loader/cache.js ================================================ var cache = {}; function get(key) { return cache[key]; } function put(key, value) { cache[key] = value; } function clear() { cache = {}; } exports.get = get; exports.put = put; exports.clear = clear; ================================================ FILE: packages/compiler/src/taglib/loader/index.js ================================================ var cache = require("./cache"); var DependencyChain = require("./DependencyChain"); var loaders = require("./loaders"); var types = require("./types"); function loadTaglibFromProps(taglib, taglibProps) { return loaders.loadTaglibFromProps(taglib, taglibProps); } function loadTaglibFromFile(filePath, isFromPackageJson) { return loaders.loadTaglibFromFile(filePath, isFromPackageJson); } function loadTaglibFromDir(filePath, tagDiscoveryDir) { return loaders.loadTaglibFromDir(filePath, tagDiscoveryDir); } function clearCache() { cache.clear(); } function createTaglib(filePath) { return new types.Taglib(filePath); } function loadTag(tagProps, filePath) { var tag = new types.Tag(filePath); loaders.loadTagFromProps( tag, tagProps, new DependencyChain(filePath ? [filePath] : []), ); return tag; } exports.clearCache = clearCache; exports.createTaglib = createTaglib; exports.loadTaglibFromProps = loadTaglibFromProps; exports.loadTaglibFromFile = loadTaglibFromFile; exports.loadTaglibFromDir = loadTaglibFromDir; exports.loadTag = loadTag; ================================================ FILE: packages/compiler/src/taglib/loader/json-file-reader.js ================================================ var stripJsonComments = require("@luxass/strip-json-comments").strip; var taglibConfig = require("../config"); var fsReadOptions = { encoding: "utf8" }; exports.readFileSync = function (path) { var json = String(taglibConfig.fs.readFileSync(path, fsReadOptions)); try { var taglibProps = JSON.parse(stripJsonComments(json)); return taglibProps; } catch (cause) { throw new Error('Unable to parse JSON file at path "' + path + '".', { cause, }); } }; ================================================ FILE: packages/compiler/src/taglib/loader/loadAttributeFromProps.js ================================================ "use strict"; var assert = require("assert"); var raptorRegexp = require("raptor-regexp"); var createError = require("raptor-util/createError"); var propertyHandlers = require("./property-handlers"); var types = require("./types"); var hasOwnProperty = Object.prototype.hasOwnProperty; class AttrLoader { constructor(attr, dependencyChain) { assert.ok(attr, '"attr" is required'); assert.ok(dependencyChain, '"dependencyChain" is required'); this.attr = attr; this.dependencyChain = dependencyChain; } load(attrProps) { assert.ok(arguments.length === 1); if (attrProps == null) { attrProps = {}; } else if (typeof attrProps === "string") { attrProps = { type: attrProps, }; } else { assert.ok(typeof attrProps === "object", 'Invalid "attrProps"'); } propertyHandlers(attrProps, this, this.dependencyChain.toString()); } /** * The attribute type. One of the following: * - string (the default) * - expression (a JavaScript expression) * - number * - integer * - int * - boolean * - float * - double * - object * - array * */ type(value) { var attr = this.attr; if (value.charAt(0) === "#") { attr.ref = value.substring(1); } else { attr.type = value; } } /** * The name of the target property to use when mapping * the attribute to a property on the target object. */ targetProperty(value) { var attr = this.attr; attr.targetProperty = value; } /** * The "default-value" property allows a default value * to be provided when the attribute is not declared * on the custom tag. */ defaultValue(value) { var attr = this.attr; attr.defaultValue = value; } /** * The "pattern" property allows the attribute * to be matched based on a simplified regular expression. * * Example: * * "pattern": "prefix-*" */ pattern(value) { var attr = this.attr; if (value === true) { var patternRegExp = raptorRegexp.simple(attr.name); attr.pattern = patternRegExp; } } /** * If "allow-expressions" is set to true (the default) then * the the attribute value will be parsed to find any dynamic * parts. */ allowExpressions(value) { var attr = this.attr; attr.allowExpressions = value; } /** * By default, the Marko compiler maps an attribute * to a property by removing all dashes from the attribute * name and converting each character after a dash to * an uppercase character (e.g. "my-attr" --> "myAttr"). * * Setting "preserve-name" to true will prevent this from * happening for the attribute. */ preserveName(value) { var attr = this.attr; attr.preserveName = value; } /** * Declares an attribute as required. Currently, this is * not enforced and is only used for documentation purposes. * * Example: * "required": true */ required(value) { var attr = this.attr; attr.required = value === true; } /** * This is the opposite of "preserve-name" and will result * in dashes being removed from the attribute if set to true. */ removeDashes(value) { var attr = this.attr; attr.removeDashes = value === true; } /** * The description of the attribute. Only used for documentation. */ description(value) { this.attr.description = value; } /** * The "set-flag" property allows a "flag" to be added to a Node instance * at compile time if the attribute is found on the node. This is helpful * if an attribute uses a pattern and a transformer wants to have a simple * check to see if the Node has an attribute that matched the pattern. * * Example: * * "set-flag": "myCustomFlag" * * A Node instance can be checked if it has a flag set as shown below: * * if (node.hasFlag('myCustomFlag')) { ... } * * */ setFlag(value) { var attr = this.attr; attr.setFlag = value; } /** * The "set-context-flag" property allows a "flag" to be added to the CompilerContext instance * at compile time if the attribute is found on the node. This is helpful * if an attribute uses a pattern and a transformer wants to have a simple * check to see if any Node in the template has an attribute that matched the pattern. * * Example: * * "set-context-flag": "myCustomFlag" * * A Node instance can be checked if it has a flag set as shown below: * * if (context.isFlagSet('myCustomFlag')) { ... } * * */ setContextFlag(value) { var attr = this.attr; attr.setContextFlag = value; } /** * An attribute can be marked for ignore. Ignored attributes * will be ignored during compilation. */ ignore(value) { var attr = this.attr; if (value === true) { attr.ignore = true; } } autocomplete(value) { this.attr.autocomplete = value; } enum(value) { this.attr.enum = value; } deprecated(value) { this.attr.deprecated = value; } name(value) { this.attr.name = value; } html(value) { this.attr.html = value === true; } } function loadAttributeFromProps(attrName, attrProps, dependencyChain) { assert.ok(typeof attrName === "string"); assert.ok(dependencyChain, '"dependencyChain" is required'); var attr = new types.Attribute(attrName); var attrLoader = new AttrLoader(attr, dependencyChain); try { attrLoader.load(attrProps); } catch (err) { throw createError( 'Unable to load attribute "' + attrName + '" (' + dependencyChain + "): " + err, err, ); } return attr; } loadAttributeFromProps.isSupportedProperty = function (name) { return hasOwnProperty.call(AttrLoader.prototype, name); }; module.exports = loadAttributeFromProps; ================================================ FILE: packages/compiler/src/taglib/loader/loadAttributes.js ================================================ var ok = require("assert").ok; var loaders = require("./loaders"); module.exports = function loadAttributes(value, parent, dependencyChain) { ok(parent); ok(dependencyChain); for (const attrName in value) { const attrProps = value[attrName]; var attr = loaders.loadAttributeFromProps( attrName, attrProps, dependencyChain.append("@" + attrName), ); parent.addAttribute(attr); } }; ================================================ FILE: packages/compiler/src/taglib/loader/loadTagFromFile.js ================================================ var ok = require("assert").ok; var cache = require("./cache"); var jsonFileReader = require("./json-file-reader"); var loaders = require("./loaders"); var types = require("./types"); function loadTagFromFile(filePath) { ok(filePath, '"filePath" is required'); var tag = cache.get(filePath); // Only load a tag once by caching the loaded tags using the file // system file path as the key if (!tag) { tag = new types.Tag(filePath); cache.put(filePath, tag); var tagProps = jsonFileReader.readFileSync(filePath); loaders.loadTagFromProps(tag, tagProps); } return tag; } module.exports = loadTagFromFile; ================================================ FILE: packages/compiler/src/taglib/loader/loadTagFromProps.js ================================================ "use strict"; var ok = require("assert").ok; var nodePath = require("path"); var createError = require("raptor-util/createError"); var isObjectEmpty = require("raptor-util/isObjectEmpty"); var markoModules = require("@marko/compiler/modules"); var taglibConfig = require("../config"); var loaders = require("./loaders"); var propertyHandlers = require("./property-handlers"); var types = require("./types"); var hasOwnProperty = Object.prototype.hasOwnProperty; function resolveRelative(dirname, value) { return value[0] === "." ? markoModules.tryResolve(value, dirname) || value : value; } function resolveWithMarkoExt(dirname, value) { if (value[0] !== ".") return value; if ( markoModules.require.extensions && !(".marko" in markoModules.require.extensions) ) { markoModules.require.extensions[".marko"] = undefined; try { return markoModules.tryResolve(value, dirname) || value; } finally { delete markoModules.require.extensions[".marko"]; } } return markoModules.tryResolve(value, dirname) || value; } function removeDashes(str) { return str.replace(/-([a-z])/g, function (match, lower) { return lower.toUpperCase(); }); } function hasAttributes(tagProps) { if (tagProps.attributes != null) { return true; } for (var name in tagProps) { if (hasOwnProperty.call(tagProps, name) && name.startsWith("@")) { return true; } } return false; } function normalizeHook(dirname, value) { if (typeof value === "string") { value = resolveRelative(dirname, value); return { path: value, get hook() { return markoModules.require(value); }, }; } return { hook: value }; } /** * We load tag definition using this class. Properties in the taglib * definition (which is just a JavaScript object with properties) * are mapped to handler methods in an instance of this type. * * @param {Tag} tag The initially empty Tag instance that we populate * @param {String} dirname The full file system path associated with the tag being loaded * @param {String} path An informational path associated with this tag (used for error reporting) */ class TagLoader { constructor(tag, dependencyChain) { this.tag = tag; this.dependencyChain = dependencyChain; this.filePath = tag.filePath; this.dirname = tag.dir || tag.dirname; } load(tagProps) { if (!hasAttributes(tagProps)) { // allow any attributes if no attributes are declared tagProps.attributes = { "*": { type: "string", targetProperty: null, preserveName: false, }, }; } propertyHandlers(tagProps, this, this.dependencyChain.toString()); } _handleVar(value, dependencyChain) { var tag = this.tag; var nestedVariable; if (typeof value === "string") { nestedVariable = { name: value, }; } else { nestedVariable = {}; propertyHandlers( value, { name: function (value) { nestedVariable.name = value; }, nameFromAttribute: function (value) { nestedVariable.nameFromAttribute = value; }, }, dependencyChain.toString(), ); if (!nestedVariable.name && !nestedVariable.nameFromAttribute) { throw new Error( 'The "name" or "name-from-attribute" attribute is required for a nested variable (' + dependencyChain + ")", ); } } tag.addNestedVariable(nestedVariable); } /** * This is handler is for any properties that didn't match * one of the default property handlers. This is used to * match properties in the form of "@attr_name" or * "" */ "*"(name, value) { var tag = this.tag; var dependencyChain = this.dependencyChain; var parts = name.split(/\s+|\s+[,]\s+/); var i; var part; var hasNestedTag = false; var hasAttr = false; var nestedTagTargetProperty = null; // We do one pass to figure out if there is an // attribute or nested tag or both for (i = 0; i < parts.length; i++) { part = parts[i]; if (part.startsWith("@")) { hasAttr = true; if (i === 0) { // Use the first attribute value as the name of the target property nestedTagTargetProperty = part.substring(1); } } else if (part.startsWith("<")) { hasNestedTag = true; } else { // Unmatched property that is not an attribute or a // nested tag return false; } } var attrProps = {}; var tagProps = {}; var k; if (value != null && typeof value === "object") { for (k in value) { if (hasOwnProperty.call(value, k)) { if (k.startsWith("@") || k.startsWith("<")) { // Move over all of the attributes and nested tags // to the tag definition. tagProps[k] = value[k]; delete value[k]; } else { // The property is not a shorthand attribute or shorthand // tag so move it over to either the tag definition // or the attribute definition or both the tag definition // and attribute definition. var propNameDashes = removeDashes(k); if ( isSupportedProperty(propNameDashes) && loaders.isSupportedAttributeProperty(propNameDashes) ) { // Move over all of the properties that are associated with a tag // and attribute tagProps[k] = value[k]; attrProps[k] = value[k]; delete value[k]; } else if (isSupportedProperty(propNameDashes)) { // Move over all of the properties that are associated with a tag tagProps[k] = value[k]; delete value[k]; } else if (loaders.isSupportedAttributeProperty(propNameDashes)) { // Move over all of the properties that are associated with an attr attrProps[k] = value[k]; delete value[k]; } } } } // If there are any left over properties then something is wrong // with the user's taglib. if (!isObjectEmpty(value)) { throw new Error( "Unsupported properties of [" + Object.keys(value).join(", ") + "]", ); } var type = attrProps.type; if (!type && hasAttr && hasNestedTag) { // If we have an attribute and a nested tag then default // the attribute type to "expression" attrProps.type = "expression"; } } else if (typeof value === "string") { if (hasNestedTag && hasAttr) { tagProps = attrProps = { type: value, }; } else if (hasNestedTag) { tagProps = { type: value, }; } else { attrProps = { type: value, }; } } // Now that we have separated out attribute properties and tag properties // we need to create the actual attributes and nested tags for (i = 0; i < parts.length; i++) { part = parts[i]; if (part.startsWith("@")) { // This is a shorthand attribute var attrName = part.substring(1); var attr = loaders.loadAttributeFromProps( attrName, attrProps, dependencyChain.append(part), ); tag.addAttribute(attr); } else if (part.startsWith("<")) { // This is a shorthand nested tag let nestedTag = new types.Tag(this.filePath); loadTagFromProps(nestedTag, tagProps, dependencyChain.append(part)); // We use the '[]' suffix to indicate that a nested tag // can be repeated var isNestedTagRepeated = false; if (part.endsWith("[]")) { isNestedTagRepeated = true; part = part.slice(0, -2); } var nestedTagName = part.substring(1, part.length - 1); nestedTag.name = nestedTagName; nestedTag.isRepeated = nestedTag.isRepeated || isNestedTagRepeated; // Use the name of the attribute as the target property unless // this target property was explicitly provided nestedTag.targetProperty = attrProps.targetProperty || nestedTagTargetProperty; tag.addNestedTag(nestedTag); if (!nestedTag.isRepeated) { let attr = loaders.loadAttributeFromProps( nestedTag.targetProperty, { type: "object" }, dependencyChain.append(part), ); tag.addAttribute(attr); } } else { return false; } } } /** * The tag name * @param {String} value The tag name */ name(value) { var tag = this.tag; tag.name = value; } /** * The path to the renderer JS module to use for this tag. * * NOTE: We use the equivalent of require.resolve to resolve the JS module * and use the tag directory as the "from". * * @param {String} value The renderer path */ renderer(value) { this.tag.renderer = resolveWithMarkoExt(this.dirname, value); } /** * A tag can use a renderer or a template to do the rendering. If * a template is provided then the value should be the path to the * template to use to render the custom tag. */ template(value) { var tag = this.tag; var dirname = this.dirname; var path = nodePath.resolve(dirname, value); try { taglibConfig.fs.statSync(path); tag.template = path; } catch (_) { // eslint-disable-next-line preserve-caught-error throw new Error('Template at path "' + path + '" does not exist.'); } } /** * This property is used by @marko/language-tools (editor tooling) * to override the Marko file used when generating the tags exposed * typescript / jsdoc types. */ types(value) { this.tag.types = value[0] === "." ? nodePath.resolve(this.dirname, value) : value; } /** * An Object where each property maps to an attribute definition. * The property key will be the attribute name and the property value * will be the attribute definition. Example: * { * "attributes": { * "foo": "string", * "bar": "expression" * } * } */ attributes(value) { var tag = this.tag; loaders.loadAttributes( value, tag, this.dependencyChain.append("attributes"), ); } /** * Deprecated */ migrator(value) { this.migrate(value); } /** * A custom tag can be mapped to module that is used * migrate deprecated features to modern features. */ migrate(value) { if (Array.isArray(value)) { value.forEach(this.migrate, this); } else { this.tag.migrators.push(normalizeHook(this.dirname, value)); } } /** * Deprecated */ codeGenerator(value) { this.translate(value); } /** * A custom tag can be mapped to module that is is used * to generate compile-time code for the custom tag. A * node type is created based on the methods and methods * exported by the code codegen module. */ translate(value) { this.tag.translator = normalizeHook(this.dirname, value); } /** * Deprecated */ nodeFactory(value) { this.parse(value); } /** * A custom tag can be mapped to a compile-time Node that gets * added to the parsed Abstract Syntax Tree (AST). The Node can * then generate custom JS code at compile time. The value * should be a path to a JS module that gets resolved using the * equivalent of require.resolve(path) */ parse(value) { this.tag.parser = normalizeHook(this.dirname, value); } /** * Deprecated */ transformer(value) { this.transform(value); } /** * If a custom tag has an associated transformer then the transformer * will be called on the compile-time Node. The transformer can manipulate * the AST using the DOM-like API to change how the code gets generated. */ transform(value) { if (Array.isArray(value)) { value.forEach(this.transform, this); } else { this.tag.transformers.push(normalizeHook(this.dirname, value)); } } /** * A custom tag can be mapped to module that is is used * to analyze code and cache the result in memory. * This analysis data should be read by translate hooks. */ analyze(value) { this.tag.analyzer = normalizeHook(this.dirname, value); } /** * The tag type. */ type(value) { var tag = this.tag; tag.type = value; } isRepeated(value) { var tag = this.tag; tag.isRepeated = value; } targetProperty(value) { var tag = this.tag; tag.targetProperty = value; } /** * Declare a nested tag. * * Example: * { * ... * "nested-tags": { * "tab": { * "target-property": "tabs", * "is-repeated": true * } * } * } */ nestedTags(value) { var filePath = this.filePath; var tag = this.tag; for (const nestedTagName in value) { const nestedTagDef = value[nestedTagName]; var dependencyChain = this.dependencyChain.append( `nestedTags["${nestedTagName}"]`, ); var nestedTag = new types.Tag(filePath); loadTagFromProps(nestedTag, nestedTagDef, dependencyChain); nestedTag.name = nestedTagName; tag.addNestedTag(nestedTag); tag.addAttribute( loaders.loadAttributeFromProps( nestedTag.targetProperty, { type: "expression" }, dependencyChain, ), ); } } openTagOnly(value) { this.tag.openTagOnly = value; } /** * The description of the tag. Only used for documentation. */ description(value) { this.tag.description = value; } autocomplete(value) { this.tag.autocomplete = value; } parseOptions(value) { this.tag.parseOptions = value; } deprecated(value) { this.tag.deprecated = value; } attributeGroups(value) { if (!value) { return; } var attributeGroups = this.tag.attributeGroups || (this.tag.attributeGroups = []); this.tag.attributeGroups = attributeGroups.concat(value); } html(value) { this.tag.html = value === true; } htmlType(value) { this.tag.htmlType = value; } featureFlags(value) { this.tag.featureFlags = value; } } function isSupportedProperty(name) { return hasOwnProperty.call(TagLoader.prototype, name); } function loadTagFromProps(tag, tagProps, dependencyChain) { ok(typeof tagProps === "object", 'Invalid "tagProps"'); ok(dependencyChain, '"dependencyChain" is required'); var tagLoader = new TagLoader(tag, dependencyChain); try { tagLoader.load(tagProps); } catch (err) { throw createError( "Unable to load tag (" + dependencyChain + "): " + err, err, ); } return tag; } module.exports = loadTagFromProps; loadTagFromProps.isSupportedProperty = isSupportedProperty; ================================================ FILE: packages/compiler/src/taglib/loader/loadTaglibFromDir.js ================================================ var ok = require("assert").ok; var nodePath = require("path"); var cache = require("./cache"); var DependencyChain = require("./DependencyChain"); var scanTagsDir = require("./scanTagsDir"); var types = require("./types"); function loadFromDir(dir, tagDiscoveryDir) { ok(dir, '"dir" is required'); var componentsPath = nodePath.join(dir, tagDiscoveryDir); var taglib = cache.get(componentsPath); // Only load a taglib once by caching the loaded taglibs using the file // system file path as the key if (!taglib) { taglib = new types.Taglib(componentsPath); cache.put(componentsPath, taglib); scanTagsDir( componentsPath, dir, tagDiscoveryDir, taglib, new DependencyChain([componentsPath]), ); } return taglib; } module.exports = loadFromDir; ================================================ FILE: packages/compiler/src/taglib/loader/loadTaglibFromFile.js ================================================ var ok = require("assert").ok; var cache = require("./cache"); var jsonFileReader = require("./json-file-reader"); var loaders = require("./loaders"); var types = require("./types"); function loadFromFile(filePath, isFromPackageJson) { ok(filePath, '"filePath" is required'); var taglib = cache.get(filePath); // Only load a taglib once by caching the loaded taglibs using the file // system file path as the key if (!taglib) { taglib = new types.Taglib(filePath, isFromPackageJson); cache.put(filePath, taglib); var taglibProps = jsonFileReader.readFileSync(filePath); loaders.loadTaglibFromProps(taglib, taglibProps); } return taglib; } module.exports = loadFromFile; ================================================ FILE: packages/compiler/src/taglib/loader/loadTaglibFromProps.js ================================================ "use strict"; var ok = require("assert").ok; var nodePath = require("path"); var createError = require("raptor-util/createError"); var markoModules = require("@marko/compiler/modules"); var taglibFS = require("../config"); var DependencyChain = require("./DependencyChain"); var jsonFileReader = require("./json-file-reader"); var loaders = require("./loaders"); var propertyHandlers = require("./property-handlers"); var scanTagsDir = require("./scanTagsDir"); var types = require("./types"); var hasOwnProperty = Object.prototype.hasOwnProperty; function resolveRelative(dirname, value) { return value[0] === "." ? markoModules.tryResolve(value, dirname) || value : value; } function normalizeHook(dirname, value) { if (typeof value === "string") { value = resolveRelative(dirname, value); return { path: value, get hook() { return markoModules.require(value); }, }; } return { hook: value }; } /** * We load a taglib definition using this class. Properties in the taglib * definition (which is just a JavaScript object with properties) * are mapped to handler methods in an instance of this type. * * * @param {Taglib} taglib The initially empty Taglib instance that we will populate * @param {String} path The file system path to the taglib that we are loading */ class TaglibLoader { constructor(taglib, dependencyChain) { ok( dependencyChain instanceof DependencyChain, '"dependencyChain" is not valid', ); this.dependencyChain = dependencyChain; this.taglib = taglib; this.filePath = taglib.filePath; this.dirname = taglib.dirname; } load(taglibProps) { var taglib = this.taglib; propertyHandlers(taglibProps, this, this.dependencyChain.toString()); if (!taglib.id) { // Fixes #73 // See if there is a package.json in the same directory as the taglib file. // If so, and if that package.json file has a "name" property then we will // use the the name as the "taglib ID". The taglib ID is used to uniquely // identity a taglib (ignoring version) and it is used to prevent the same // taglib from being loaded multiple times. // // Using the file path as the taglib ID doesn't work so well since we might find // the same taglib multiple times in the Node.js module search path with // different paths. var filePath = this.filePath; var dirname = this.dirname; var packageJsonPath = nodePath.join(dirname, "package.json"); try { var pkg = jsonFileReader.readFileSync(packageJsonPath); taglib.id = pkg.name; } catch (e) { /* ignore error */ } if (!taglib.id) { taglib.id = filePath; } } } _handleTag(tagName, value, dependencyChain) { var tagProps; var tag; if (typeof value === "string") { var tagFilePath = nodePath.resolve(this.dirname, value); try { taglibFS.fs.statSync(tagFilePath); } catch (_) { // eslint-disable-next-line preserve-caught-error throw new Error( 'Tag at path "' + tagFilePath + '" does not exist. (' + dependencyChain + ")", ); } tag = new types.Tag(tagFilePath); tagProps = jsonFileReader.readFileSync(tagFilePath); dependencyChain = dependencyChain.append(tagFilePath); } else { tag = new types.Tag(this.filePath); tagProps = value; } loaders.loadTagFromProps(tag, tagProps, dependencyChain); if (tag.name === undefined) { tag.name = tagName; } this.taglib.addTag(tag); } // We register a wildcard handler to handle "@my-attr" and "" // properties (shorthand syntax) "*"(name, value) { var taglib = this.taglib; var filePath = this.filePath; if (name.startsWith("<")) { let tagName = name.slice(1, -1); this._handleTag(tagName, value, this.dependencyChain.append(name)); } else if (name.startsWith("@")) { var attrKey = name.substring(1); var attr = loaders.loadAttributeFromProps( attrKey, value, this.dependencyChain.append("@" + attrKey), ); attr.filePath = filePath; attr.key = attrKey; taglib.addAttribute(attr); } else { return false; } } attributes(value) { // The value of the "attributes" property will be an object // where each property maps to an attribute definition. Since these // attributes are on the taglib they will be "global" attribute // definitions. // // The property key will be the attribute name and the property value // will be the attribute definition. Example: // { // "attributes": { // "foo": "string", // "bar": "expression" // } // } var taglib = this.taglib; Object.keys(value).forEach((attrName) => { var attrDef = value[attrName]; var attr = loaders.loadAttributeFromProps( attrName, attrDef, this.dependencyChain.append("@" + attrName), ); attr.key = attrName; taglib.addAttribute(attr); }); } tags(tags) { // The value of the "tags" property will be an object // where each property maps to an attribute definition. The property // key will be the tag name and the property value // will be the tag definition. Example: // { // "tags": { // "foo": { // "attributes": { ... } // }, // "bar": { // "attributes": { ... } // }, // } // } for (var tagName in tags) { if (hasOwnProperty.call(tags, tagName)) { this._handleTag( tagName, tags[tagName], this.dependencyChain.append("tags." + tagName), ); } } } scriptLang(lang) { // The "script-lang" property is used to specify the language of embedded scripts (either "js" or "ts"). // The language tools will prefer the language specified by the "script-lang" if specified. // If unspecified the language tools will check for a tsconfig, if one is found then "ts", otherwise we use "js". this.taglib.scriptLang = lang; } tagsDir(dir) { // The "tags-dir" property is used to supporting scanning // of a directory to discover custom tags. Scanning a directory // is a much simpler way for a developer to create custom tags. // Only one tag is allowed per directory and the directory name // corresponds to the tag name. We only search for directories // one level deep. var taglib = this.taglib; var path = this.filePath; var dirname = this.dirname; taglib.tagsDir = dir; if (dir != null) { if (Array.isArray(dir)) { for (var i = 0; i < dir.length; i++) { scanTagsDir( path, dirname, dir[i], taglib, this.dependencyChain.append(`tags-dir[${i}]`), ); } } else { scanTagsDir( path, dirname, dir, taglib, this.dependencyChain.append(`tags-dir`), ); } } } exports(dir) { var taglib = this.taglib; var path = this.filePath; var dirname = this.dirname; if (taglib.isFromPackageJson || /[\\/]node_modules[\\/]/.test(path)) { taglib.tagsDir = false; scanTagsDir( path, dirname, dir, taglib, this.dependencyChain.append(`exports`), ); } } taglibImports(imports) { // The "taglib-imports" property allows another taglib to be imported // into this taglib so that the tags defined in the imported taglib // will be part of this taglib. // // NOTE: If a taglib import refers to a package.json file then we read // the package.json file and automatically import *all* of the // taglibs from the installed modules found in the "dependencies" // section var taglib = this.taglib; var dirname = this.dirname; var importPath; if (imports && Array.isArray(imports)) { for (var i = 0; i < imports.length; i++) { var curImport = imports[i]; if (typeof curImport === "string") { var basename = nodePath.basename(curImport); if (basename === "package.json") { var packagePath = markoModules.tryResolve(curImport, dirname); var packageDir = nodePath.dirname(packagePath); var pkg = jsonFileReader.readFileSync(packagePath); var dependencies = pkg.dependencies; if (dependencies) { var dependencyNames = Object.keys(dependencies); for (var j = 0; j < dependencyNames.length; j++) { var dependencyName = dependencyNames[j]; importPath = markoModules.tryResolve( nodePath.join(dependencyName, "marko.json"), packageDir, ); if (importPath) { taglib.addImport(importPath); } } } } else { importPath = markoModules.tryResolve(curImport, dirname); if (importPath) { taglib.addImport(importPath); } else { throw new Error( "Import not found: " + curImport + " (from " + dirname + ")", ); } } } } } } /** * Deprecated */ migrator(value) { this.migrate(value); } /** * A taglib can be mapped to module that is used * migrate deprecated features to modern features across the entire template. */ migrate(value) { if (Array.isArray(value)) { value.forEach(this.migrate, this); } else { this.taglib.migrators.push(normalizeHook(this.dirname, value)); } } /** * Exposes a babel visitor to perform additional translations on the entire ast. */ translate(value) { this.taglib.translator = normalizeHook(this.dirname, value); } /** * Allows an ID to be explicitly assigned to a taglib. * The taglib ID is used to prevent the same taglib (even if different versions) * from being loaded multiple times. * * NOTE: Introduced as part of fix for #73 * * @param {String} value The taglib ID */ taglibId(value) { var taglib = this.taglib; taglib.id = value; } /** * Deprecated */ transformer(value) { this.transform(value); } /** * If a custom tag has an associated transformer then the transformer * will be called on the compile-time Node. The transformer can manipulate * the AST using the DOM-like API to change how the code gets generated. */ transform(value) { if (Array.isArray(value)) { value.forEach(this.transform, this); } else { this.taglib.transformers.push(normalizeHook(this.dirname, value)); } } attributeGroups(value) { let taglib = this.taglib; let attributeGroups = taglib.attributeGroups || (taglib.attributeGroups = {}); let dependencyChain = this.dependencyChain.append("attribute-groups"); Object.keys(value).forEach((attrGroupName) => { let attrGroup = (attributeGroups[attrGroupName] = {}); let attrGroupDependencyChain = dependencyChain.append(attrGroupName); let rawAttrGroup = value[attrGroupName]; Object.keys(rawAttrGroup).forEach((attrName) => { var rawAttrDef = rawAttrGroup[attrName]; let attr = loaders.loadAttributeFromProps( attrName, rawAttrDef, attrGroupDependencyChain.append("@" + attrName), ); attrGroup[attrName] = attr; }); }); } } function loadTaglibFromProps(taglib, taglibProps, dependencyChain) { ok(taglib, '"taglib" is required'); ok(taglibProps, '"taglibProps" is required'); ok(taglib.filePath, '"taglib.filePath" is required'); if (!dependencyChain) { dependencyChain = new DependencyChain([taglib.filePath]); } var taglibLoader = new TaglibLoader(taglib, dependencyChain); try { taglibLoader.load(taglibProps); } catch (err) { throw createError( "Unable to load taglib (" + dependencyChain + "): " + err, err, ); } return taglib; } module.exports = loadTaglibFromProps; ================================================ FILE: packages/compiler/src/taglib/loader/loaders.js ================================================ var types = require("./types"); function isSupportedAttributeProperty(propertyName) { return exports.loadAttributeFromProps.isSupportedProperty(propertyName); } function isSupportedTagProperty(propertyName) { return exports.loadTagFromProps.isSupportedProperty(propertyName); } function createTaglib(taglibPath) { return new types.Taglib(taglibPath); } exports.createTaglib = createTaglib; exports.loadAttributeFromProps = require("./loadAttributeFromProps"); exports.loadTagFromProps = require("./loadTagFromProps"); exports.loadTagFromFile = require("./loadTagFromFile"); exports.loadTaglibFromProps = require("./loadTaglibFromProps"); exports.loadTaglibFromFile = require("./loadTaglibFromFile"); exports.loadTaglibFromDir = require("./loadTaglibFromDir"); exports.loadAttributes = require("./loadAttributes"); exports.isSupportedAttributeProperty = isSupportedAttributeProperty; exports.isSupportedTagProperty = isSupportedTagProperty; ================================================ FILE: packages/compiler/src/taglib/loader/property-handlers.js ================================================ "use strict"; const { hasOwnProperty } = Object.prototype; const taglibConfig = require("../config"); function removeDashes(str) { return str.replace(/-([a-z])/g, function (match, lower) { return lower.toUpperCase(); }); } module.exports = function invokeHandlers(config, handlers, path) { function error(message, cause) { if (cause) { if (cause.__propertyHandlers) { throw cause; } message += ". Cause: " + (cause.stack || cause); } if (path) { message += " (" + path + ")"; } var e = new Error(message); e.__propertyHandlers = true; taglibConfig.onError(e); } if (!config) { error('"config" argument is required'); } if (typeof config !== "object") { error("object expected"); } for (var k in config) { if (hasOwnProperty.call(config, k)) { var value = config[k]; var keyNoDashes = removeDashes(k); var handler = handlers[keyNoDashes]; var isDefaultHandler = false; if (!handler) { handler = handlers["*"]; isDefaultHandler = true; } if (!handler) { var badProperty = JSON.stringify(k); if (k !== keyNoDashes) { badProperty += "/" + JSON.stringify(keyNoDashes); } error( "Invalid option of " + badProperty + ". Allowed: " + Object.keys(handlers).join(", "), ); } try { if (isDefaultHandler) { if (handler.call(handlers, k, value) === false) { error("Invalid option: " + k); } } else { handler.call(handlers, value); } } catch (e) { error('Error while applying option of "' + k + '"', e); } } } if (handlers._end) { try { handlers._end(); } catch (e) { error("Error after applying properties", e); } } }; ================================================ FILE: packages/compiler/src/taglib/loader/scanTagsDir.js ================================================ "use strict"; const nodePath = require("path"); const taglibConfig = require("../config"); const jsonFileReader = require("./json-file-reader"); const loaders = require("./loaders"); const types = require("./types"); const tagFileTypes = [ "template", "renderer", "migrate", "transform", "transformer", "code-generator", "translate", "node-factory", "parse", ]; const searchFiles = [ { name: "index.marko", type: "template" }, { name: "renderer", type: "renderer" }, { name: "index", type: "renderer" }, { name: "template.marko", type: "template" }, { name: "template.html", type: "template" }, { name: "migrate", type: "migrate" }, { name: "code-generator", type: "translate" }, { name: "translate", type: "translate" }, { name: "node-factory", type: "parse" }, { name: "parse", type: "parse" }, { name: "transformer", type: "transform" }, { name: "transform", type: "transform" }, ]; function createDefaultTagDef() { return { attributes: { "*": { type: "string", targetProperty: null, preserveName: false, }, }, }; } function getFileMap(dirname) { let fileMap = {}; let files = taglibConfig.fs.readdirSync(dirname); files.forEach((file) => { let extName = nodePath.extname(file); let baseName = file.slice(0, -1 * extName.length); let fullPath = nodePath.join(dirname, file); fileMap[baseName] = fileMap[baseName] || {}; fileMap[baseName][extName] = fullPath; fileMap[file] = fileMap[file] || {}; fileMap[file].__path = fullPath; }); return fileMap; } function getPath(filename, fileMap) { let file = fileMap[filename]; if (!file) return; if (file.__path) return file.__path; if (file.js) return file[".js"]; for (let key in file) { return file[key]; } } function findAndSetFile(tagDef, tagDirname) { try { if (!taglibConfig.fs.statSync(tagDirname).isDirectory()) { return; } } catch (_) { return; } let tagName = nodePath.basename(tagDirname); let fileMap = getFileMap(tagDirname); for (let i = 0; i < searchFiles.length; i++) { let name = searchFiles[i].name; let type = searchFiles[i].type; let repeatedName = tagName + "." + name.replace("index.", ""); let path = getPath(name, fileMap) || getPath(repeatedName, fileMap); if (path) { tagDef[type] = path; return true; } } } function hasFile(tagDef) { for (let i = 0; i < tagFileTypes.length; i++) { if (tagDef[tagFileTypes[i]]) return true; } return false; } /** * @param {String} tagsConfigPath path to tag definition file * @param {String} tagsConfigDirname path to directory of tags config file (should be path.dirname(tagsConfigPath)) * @param {String|Object} dir the path to directory to scan * @param {String} taglib the taglib that is being loaded */ module.exports = function scanTagsDir( tagsConfigPath, tagsConfigDirname, dir, taglib, dependencyChain, ) { let prefix; if (typeof dir === "object") { prefix = dir.prefix; dir = dir.path; } if (prefix == null) { // no prefix by default prefix = ""; } dir = nodePath.resolve(tagsConfigDirname, dir); let children = taglibConfig.fs.readdirSync(dir); for (let i = 0, len = children.length; i < len; i++) { let childFilename = children[i]; if (childFilename === "node_modules") { continue; } let tagName; let tagDef; let tagDirname; let tagJsonPath; let ext = nodePath.extname(childFilename); if (ext === ".marko") { tagName = childFilename.slice(0, 0 - ext.length); tagDirname = dir; tagDef = createDefaultTagDef(); tagDef.template = nodePath.join(dir, childFilename); } else { tagName = prefix + childFilename; tagDirname = nodePath.join(dir, childFilename); tagJsonPath = nodePath.join(tagDirname, "marko-tag.json"); let hasTagJson = false; try { taglibConfig.fs.statSync(tagJsonPath); hasTagJson = true; // eslint-disable-next-line no-empty } catch (_) {} if (hasTagJson) { // marko-tag.json exists in the directory, use that as the tag definition tagDef = jsonFileReader.readFileSync(tagJsonPath); } else { tagJsonPath = null; tagDef = createDefaultTagDef(); } if (!hasFile(tagDef)) { let fileWasSet = findAndSetFile(tagDef, tagDirname); if (!fileWasSet) { if (hasTagJson) { throw new Error( "Invalid tag file: " + tagJsonPath + ". Neither a renderer or a template was found for tag. " + JSON.stringify(tagDef, null, 2), ); } else { // Skip this directory... there doesn't appear to be anything in it continue; } } } } let tagDependencyChain; if (tagJsonPath) { tagDependencyChain = dependencyChain.append(tagJsonPath); } else { tagDependencyChain = dependencyChain.append(tagDirname); } let tag = new types.Tag(tagJsonPath || tagDirname); loaders.loadTagFromProps(tag, tagDef, tagDependencyChain); tag.name = tag.name || tagName; taglib.addTag(tag); } }; ================================================ FILE: packages/compiler/src/taglib/loader/types.js ================================================ exports.Taglib = require("./Taglib"); exports.Tag = require("./Tag"); exports.Attribute = require("./Attribute"); exports.Property = require("./Property"); exports.Transformer = require("./Transformer"); ================================================ FILE: packages/compiler/src/taglib/lookup/index.js ================================================ "use strict"; var nodePath = require("path"); var ok = require("assert").ok; var extend = require("raptor-util/extend"); var taglibTypes = require("../loader/types"); var hasOwnProperty = Object.prototype.hasOwnProperty; function TAG_COMPARATOR(a, b) { return a.name.localeCompare(b.name); } function merge(target, source) { const descs = Object.getOwnPropertyDescriptors(source); for (const key in descs) { const desc = descs[key]; if (desc.writable) { const sourceVal = desc.value; if (sourceVal == null) continue; const targetVal = target[key]; if ( typeof sourceVal === "object" && targetVal && typeof targetVal === "object" ) { target[key] = Array.isArray(targetVal) ? targetVal.concat(sourceVal) : Array.isArray(sourceVal) ? [targetVal].concat(sourceVal) : merge(merge(new targetVal.constructor(), targetVal), sourceVal); continue; } } Object.defineProperty(target, key, desc); } return target; } /** * A taglib lookup merges in multiple taglibs so there is a single and fast lookup * for custom tags and custom attributes. */ class TaglibLookup { constructor() { this.merged = { attributeGroups: {}, }; this.taglibsById = {}; this._sortedTags = undefined; this.exclusiveTagDiscoveryDirs = undefined; this.manualTagsDirs = undefined; } hasTaglib(taglib) { return hasOwnProperty.call(this.taglibsById, taglib.id); } _mergeNestedTags(taglib) { var Tag = taglibTypes.Tag; // Loop over all of the nested tags and register a new custom tag // with the fully qualified name var merged = this.merged; function handleNestedTags(tag, parentTagName) { for (const key in tag.nestedTags) { const nestedTag = tag.nestedTags[key]; var fullyQualifiedName = parentTagName + ":" + nestedTag.name; // Create a clone of the nested tag since we need to add some new // properties var clonedNestedTag = new Tag(); extend(clonedNestedTag, nestedTag); // Record the fully qualified name of the parent tag that this // custom tag is associated with. clonedNestedTag.parentTagName = parentTagName; clonedNestedTag.name = fullyQualifiedName; merged.tags[fullyQualifiedName] = clonedNestedTag; handleNestedTags(clonedNestedTag, fullyQualifiedName); } } for (const key in taglib.tags) { const tag = taglib.tags[key]; handleNestedTags(tag, tag.name); } } addTaglib(taglib) { ok(taglib, '"taglib" is required'); ok(taglib.id, '"taglib.id" expected'); if (hasOwnProperty.call(this.taglibsById, taglib.id)) { return; } if ( taglib.dirname && typeof taglib.tagsDir === "string" && /[/\\]tags[/\\]?$/.test(taglib.tagsDir) ) { (this.manualTagsDirs || (this.manualTagsDirs = new Set())).add( nodePath.resolve(taglib.dirname, taglib.tagsDir), ); } // console.log("TAGLIB:", taglib); this._sortedTags = undefined; this.taglibsById[taglib.id] = taglib; merge(this.merged, { tags: taglib.tags, attributes: taglib.attributes, patternAttributes: taglib.patternAttributes, attributeGroups: taglib.attributeGroups || {}, }); this._mergeNestedTags(taglib); } getTagsSorted() { var sortedTags = this._sortedTags; if (sortedTags === undefined) { sortedTags = this._sortedTags = []; var tags = this.merged.tags; for (var tagName in tags) { sortedTags.push(tags[tagName]); } sortedTags.sort(TAG_COMPARATOR); } return sortedTags; } forEachAttribute(tagName, callback) { var tags = this.merged.tags; if (!tags) { return; } var globalAttributes = this.merged.attributes; var taglibAttributeGroups = this.merged.attributeGroups; function findAttributesForTagName(tagName) { var tag = tags[tagName]; if (!tag) { return; } function handleAttr(attrDef) { if (attrDef.ref) { attrDef = globalAttributes[attrDef.ref]; } callback(attrDef, tag); } var attributes = tag.attributes; if (!attributes) { return; } for (var attrName in attributes) { if (hasOwnProperty.call(attributes, attrName)) { handleAttr(attributes[attrName], tag); } } if (tag.attributeGroups) { for (let i = 0; i < tag.attributeGroups.length; i++) { let attributeGroupName = tag.attributeGroups[i]; let attributeGroup = taglibAttributeGroups[attributeGroupName]; if (attributeGroup) { for (let attrName in attributeGroup) { handleAttr(attributeGroup[attrName]); } } } } if (tag.patternAttributes) { tag.patternAttributes.forEach(handleAttr); } } findAttributesForTagName(tagName); // Look for an exact match at the tag level findAttributesForTagName("*"); // Including attributes that apply to all tags } getTag(element) { var tags = this.merged.tags; if (!tags) { return; } return tags[element.tagName || element]; } getAttribute(element, attr) { if (typeof element === "string") { element = { tagName: element, }; } if (typeof attr === "string") { attr = { name: attr, }; } var tags = this.merged.tags; if (!tags) { return; } var taglibAttributeGroups = this.merged.attributeGroups; var tagName = element.tagName; var attrName = attr.name; function findAttributeForTag(tag, attributes, attrName) { // try by exact match first var attribute = attributes[attrName]; if (attribute === undefined) { if (tag.attributeGroups) { for (let i = 0; i < tag.attributeGroups.length; i++) { let attributeGroupName = tag.attributeGroups[i]; let attributeGroup = taglibAttributeGroups[attributeGroupName]; if (attributeGroup) { attribute = attributeGroup[attrName]; if (attribute !== undefined) { break; } } } } } if (attribute === undefined && attrName !== "*") { if (tag.patternAttributes) { // try searching by pattern for (var i = 0, len = tag.patternAttributes.length; i < len; i++) { var patternAttribute = tag.patternAttributes[i]; if (patternAttribute.pattern.test(attrName)) { attribute = patternAttribute; break; } } } } return attribute; } var globalAttributes = this.merged.attributes; function tryAttribute(tagName, attrName) { var tag = tags[tagName]; if (!tag) { return undefined; } return findAttributeForTag(tag, tag.attributes, attrName); } var attrDef = tryAttribute(tagName, attrName) || // Look for an exact match at the tag level tryAttribute("*", attrName) || // If not there, see if there is a exact match on the attribute name for attributes that apply to all tags tryAttribute(tagName, "*"); // Otherwise, see if there is a splat attribute for the tag if (attrDef && attrDef.ref) { attrDef = globalAttributes[attrDef.ref]; } return attrDef; } toString() { return "lookup: " + Object.keys(this.taglibsById).join(", "); } } module.exports = TaglibLookup; ================================================ FILE: packages/compiler/src/taglib/marko-html.json ================================================ { "taglib-id": "marko-html", "": { "@download": "#html-download", "@href": "#html-href", "@hreflang": "#html-hreflang", "@media": "#html-media", "@ping": "#html-ping", "@referrerpolicy": "#html-referrerpolicy", "@rel": "#html-rel", "@target": "#html-target", "html": true, "autocomplete": [ {}, { "displayText": "a href=\"\"", "snippet": "a href=\"${1:https://}\"" }, { "displayText": "a href=\"mailto:\"", "snippet": "a href=\"mailto:${1:joe@example.com}?subject=${2:feedback}\"" } ], "attribute-groups": ["html-attributes"] }, "": { "html": true, "autocomplete": [ {}, { "snippet": "abbr title=\"$1\"" } ], "attribute-groups": ["html-attributes"] }, "

    ": { "html": true, "attribute-groups": ["html-attributes"] }, "": { "@alt": "#html-alt", "@coords": "#html-coords", "@download": "#html-download", "@href": "#html-href", "@hreflang": "#html-hreflang", "@media": "#html-media", "@ping": "#html-ping", "@referrerpolicy": "#html-referrerpolicy", "@rel": "#html-rel", "@shape": "#html-shape", "@target": "#html-target", "html": true, "autocomplete": [ {}, { "displayText": "area shape=\"\" coords=\"\" href=\"\"", "snippet": "area ${1:shape=\"${2:default}\"} coords=\"$3\" ${4:href=\"${5:https://}\"}" } ], "attribute-groups": ["html-attributes"], "parse-options": { "openTagOnly": true } }, "
    ": { "html": true, "attribute-groups": ["html-attributes"] }, "