diff --git a/.changeset/old-badgers-pretend.md b/.changeset/old-badgers-pretend.md new file mode 100644 index 0000000000..2ebd24f444 --- /dev/null +++ b/.changeset/old-badgers-pretend.md @@ -0,0 +1,5 @@ +--- +"@marko/translator-tags": patch +--- + +XML Declarations are now a compile error (like cdata). diff --git a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.error.txt b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.error.txt new file mode 100644 index 0000000000..3b0c3fcab8 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.error.txt @@ -0,0 +1,7 @@ + + at packages/translator-tags/src/__tests__/fixtures/declaration/template.marko:1:1 + > 1 | + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ XML declarations sections are not supported in Marko. + 2 | + 3 | Hello World + 4 | \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.js deleted file mode 100644 index a12a2a965a..0000000000 --- a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/dom.expected/template.js +++ /dev/null @@ -1,5 +0,0 @@ -export const _template_ = "Hello World"; -export const _walks_ = /* over(1) */"Db"; -export const _setup_ = () => {}; -import { createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/dom"; -export default /* @__PURE__ */_createTemplate(/* @__PURE__ */_createRenderer(_template_, _walks_, _setup_), "packages/translator-tags/src/__tests__/fixtures/declaration/template.marko"); \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.error.txt b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.error.txt new file mode 100644 index 0000000000..3b0c3fcab8 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.error.txt @@ -0,0 +1,7 @@ + + at packages/translator-tags/src/__tests__/fixtures/declaration/template.marko:1:1 + > 1 | + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ XML declarations sections are not supported in Marko. + 2 | + 3 | Hello World + 4 | \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.js deleted file mode 100644 index e40dca9d94..0000000000 --- a/packages/translator-tags/src/__tests__/fixtures/declaration/__snapshots__/html.expected/template.js +++ /dev/null @@ -1,6 +0,0 @@ -import { write as _write, nextScopeId as _nextScopeId, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; -const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { - const _scope0_id = _nextScopeId(); - _write("Hello World"); -}); -export default /* @__PURE__ */_createTemplate(_renderer, "packages/translator-tags/src/__tests__/fixtures/declaration/template.marko"); \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/declaration/test.ts b/packages/translator-tags/src/__tests__/fixtures/declaration/test.ts index b81d90e10b..e4595ef7d0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/declaration/test.ts +++ b/packages/translator-tags/src/__tests__/fixtures/declaration/test.ts @@ -1,2 +1 @@ -export const skip_csr = true; -export const skip_ssr = true; +export const error_compiler = true; diff --git a/packages/translator-tags/src/index.ts b/packages/translator-tags/src/index.ts index 862d74988d..7092ff6850 100644 --- a/packages/translator-tags/src/index.ts +++ b/packages/translator-tags/src/index.ts @@ -1,6 +1,7 @@ -import type { Config, types as t } from "@marko/compiler"; +import type { Config } from "@marko/compiler"; import coreTagLib from "./core"; +import { extractVisitors } from "./util/visitors"; import AssignmentExpression from "./visitors/assignment-expression"; import MarkoCDATA from "./visitors/cdata"; import MarkoComment from "./visitors/comment"; @@ -16,7 +17,7 @@ import MarkoTag from "./visitors/tag"; import MarkoText from "./visitors/text"; import UpdateExpression from "./visitors/update-expression"; -const visitors = { +const visitors = extractVisitors({ Program, Function, AssignmentExpression, @@ -31,29 +32,16 @@ const visitors = { MarkoPlaceholder, MarkoScriptlet, MarkoComment, -}; - -const getVisitorOfType = ( - typename: "migrate" | "transform" | "analyze" | "translate", -): t.Visitor => - Object.entries(visitors).reduce((visitor, [name, value]) => { - if (typename in value) { - visitor[name as any] = (value as any)[typename]; - } - return visitor; - }, {} as t.Visitor); +}); export { default as internalEntryBuilder } from "./util/entry-builder"; - -export const transform = getVisitorOfType("transform"); -export const analyze = getVisitorOfType("analyze"); -export const translate = getVisitorOfType("translate"); +export const { transform, analyze, translate } = visitors; export const taglibs = [ [ __dirname, { ...coreTagLib, - migrate: getVisitorOfType("migrate"), + migrate: visitors.migrate, }, ], ]; diff --git a/packages/translator-tags/src/util/visitors.ts b/packages/translator-tags/src/util/visitors.ts new file mode 100644 index 0000000000..11a175e230 --- /dev/null +++ b/packages/translator-tags/src/util/visitors.ts @@ -0,0 +1,27 @@ +import type { types as t } from "@marko/compiler"; + +export type VisitorType = "migrate" | "transform" | "analyze" | "translate"; +export type TemplateVisitor = Partial< + Record> +>; + +export function extractVisitors< + Visitors extends Partial>>, +>(visitors: Visitors) { + const result: Record = { + migrate: {}, + transform: {}, + analyze: {}, + translate: {}, + }; + + for (const _name in visitors) { + const name = _name as any; + const value = visitors[name]!; + if (value.migrate) result.migrate[name] = value.migrate; + if (value.transform) result.transform[name] = value.transform; + if (value.analyze) result.analyze[name] = value.analyze; + if (value.translate) result.translate[name] = value.translate; + } + return result; +} diff --git a/packages/translator-tags/src/visitors/assignment-expression.ts b/packages/translator-tags/src/visitors/assignment-expression.ts index ad2859bae6..24cab787e2 100644 --- a/packages/translator-tags/src/visitors/assignment-expression.ts +++ b/packages/translator-tags/src/visitors/assignment-expression.ts @@ -2,17 +2,18 @@ import { types as t } from "@marko/compiler"; import { isOutputDOM } from "../util/marko-config"; import { getSection } from "../util/sections"; +import type { TemplateVisitor } from "../util/visitors"; import { currentProgramPath } from "./program"; export default { translate: { - exit(assignment: t.NodePath) { + exit(assignment) { if (isOutputDOM()) { handleDestructure(assignment, assignment.node.left); } }, }, -}; +} satisfies TemplateVisitor; function handleDestructure( assignment: t.NodePath, diff --git a/packages/translator-tags/src/visitors/cdata.ts b/packages/translator-tags/src/visitors/cdata.ts index 443532c8b1..a3ad224d65 100644 --- a/packages/translator-tags/src/visitors/cdata.ts +++ b/packages/translator-tags/src/visitors/cdata.ts @@ -1,11 +1,13 @@ import type { types as t } from "@marko/compiler"; +import type { TemplateVisitor } from "../util/visitors"; + export default { translate: { - enter(path: t.NodePath) { - throw path.buildCodeFrameError( + enter(cdata) { + throw cdata.buildCodeFrameError( "CDATA sections are not supported in Marko.", ); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/comment.ts b/packages/translator-tags/src/visitors/comment.ts index 1b81ac21d1..969abeb907 100644 --- a/packages/translator-tags/src/visitors/comment.ts +++ b/packages/translator-tags/src/visitors/comment.ts @@ -1,9 +1,11 @@ import type { types as t } from "@marko/compiler"; +import type { TemplateVisitor } from "../util/visitors"; + export default { translate: { - exit(comment: t.NodePath) { + exit(comment) { comment.remove(); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/declaration.ts b/packages/translator-tags/src/visitors/declaration.ts index 13d342c69f..05e2dc9479 100644 --- a/packages/translator-tags/src/visitors/declaration.ts +++ b/packages/translator-tags/src/visitors/declaration.ts @@ -1,16 +1,13 @@ import type { types as t } from "@marko/compiler"; -import { isOutputHTML } from "../util/marko-config"; -import * as writer from "../util/writer"; +import type { TemplateVisitor } from "../util/visitors"; export default { translate: { - exit(declaration: t.NodePath) { - if (isOutputHTML()) { - writer.writeTo(declaration)``; - } - - declaration.remove(); + enter(decl) { + throw decl.buildCodeFrameError( + "XML declarations sections are not supported in Marko.", + ); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/document-type.ts b/packages/translator-tags/src/visitors/document-type.ts index 2a18579df5..7a3825e92b 100644 --- a/packages/translator-tags/src/visitors/document-type.ts +++ b/packages/translator-tags/src/visitors/document-type.ts @@ -1,15 +1,16 @@ import type { types as t } from "@marko/compiler"; import { isOutputHTML } from "../util/marko-config"; +import type { TemplateVisitor } from "../util/visitors"; import * as writer from "../util/writer"; export default { translate: { - exit(documentType: t.NodePath) { + exit(documentType) { if (isOutputHTML()) { writer.writeTo(documentType)``; } documentType.remove(); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/function.ts b/packages/translator-tags/src/visitors/function.ts index e4ff3e1ce4..b0c3fee4ad 100644 --- a/packages/translator-tags/src/visitors/function.ts +++ b/packages/translator-tags/src/visitors/function.ts @@ -14,6 +14,7 @@ import { type Section, } from "../util/sections"; import { getSerializedScopeProperties } from "../util/signals"; +import type { TemplateVisitor } from "../util/visitors"; import { currentProgramPath, scopeIdentifier } from "./program"; const functionIdsBySection = new WeakMap>(); const registeredFunctions = new WeakSet(); @@ -36,7 +37,7 @@ declare module "@marko/compiler/dist/types" { } export default { - analyze(fn: t.NodePath) { + analyze(fn) { const markoRoot = getMarkoRoot(fn); const isStatic = !markoRoot || markoRoot.isMarkoScriptlet({ static: true }); if (!isFunction(fn, isStatic)) return; @@ -103,7 +104,7 @@ export default { ); }, translate: { - exit(fn: t.NodePath) { + exit(fn) { const markoRoot = getMarkoRoot(fn); const isStatic = !markoRoot || markoRoot.isMarkoScriptlet({ static: true }); @@ -226,7 +227,7 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; function isFunction( fn: t.NodePath, diff --git a/packages/translator-tags/src/visitors/import-declaration.ts b/packages/translator-tags/src/visitors/import-declaration.ts index 6c2ba914f3..8047b4e70f 100644 --- a/packages/translator-tags/src/visitors/import-declaration.ts +++ b/packages/translator-tags/src/visitors/import-declaration.ts @@ -1,8 +1,10 @@ import { resolveTagImport } from "@marko/babel-utils"; import type { types as t } from "@marko/compiler"; +import type { TemplateVisitor } from "../util/visitors"; + export default { - analyze(importDecl: t.NodePath) { + analyze(importDecl) { const { node } = importDecl; const { source } = node; const { value } = source; @@ -18,7 +20,7 @@ export default { } }, translate: { - exit(importDecl: t.NodePath) { + exit(importDecl) { const { node } = importDecl; const { extra } = node; const tagImport = extra?.tagImport as string | undefined; @@ -27,4 +29,4 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/placeholder.ts b/packages/translator-tags/src/visitors/placeholder.ts index 08f4c47092..c2f5868569 100644 --- a/packages/translator-tags/src/visitors/placeholder.ts +++ b/packages/translator-tags/src/visitors/placeholder.ts @@ -19,6 +19,7 @@ import { getSection, } from "../util/sections"; import { addStatement } from "../util/signals"; +import type { TemplateVisitor } from "../util/visitors"; import * as walks from "../util/walks"; import * as writer from "../util/writer"; import { scopeIdentifier } from "./program"; @@ -46,7 +47,7 @@ type HTMLMethod = "escapeScript" | "escapeStyle" | "escapeXML" | "toString"; type DOMMethod = "html" | "data"; export default { - analyze(placeholder: t.NodePath) { + analyze(placeholder) { const { node } = placeholder; const { confident, computed } = evaluate(placeholder); @@ -62,7 +63,7 @@ export default { } }, translate: { - exit(placeholder: t.NodePath) { + exit(placeholder) { const isHTML = isOutputHTML(); const write = writer.writeTo(placeholder); const { node } = placeholder; @@ -132,7 +133,7 @@ export default { placeholder.remove(); }, }, -}; +} satisfies TemplateVisitor; function getParentTagName({ parentPath }: t.NodePath) { return ( diff --git a/packages/translator-tags/src/visitors/program/dom.ts b/packages/translator-tags/src/visitors/program/dom.ts index e19c87ad09..019ad5bc7b 100644 --- a/packages/translator-tags/src/visitors/program/dom.ts +++ b/packages/translator-tags/src/visitors/program/dom.ts @@ -17,12 +17,13 @@ import { replaceAssignments, writeSignals, } from "../../util/signals"; +import type { TemplateVisitor } from "../../util/visitors"; import { visit } from "../../util/walks"; import * as writer from "../../util/writer"; export default { translate: { - exit(program: t.NodePath) { + exit(program) { visit(program); const section = getSection(program); const { walks, writes, setup } = writer.getSectionMeta(section); @@ -150,4 +151,4 @@ export default { ); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/program/html.ts b/packages/translator-tags/src/visitors/program/html.ts index 1f9c566c89..0b8169e3ba 100644 --- a/packages/translator-tags/src/visitors/program/html.ts +++ b/packages/translator-tags/src/visitors/program/html.ts @@ -5,11 +5,12 @@ import isStatic from "../../util/is-static"; import { callRuntime } from "../../util/runtime"; import { getSection } from "../../util/sections"; import { renameBindings, writeHTMLResumeStatements } from "../../util/signals"; +import type { TemplateVisitor } from "../../util/visitors"; import { flushInto } from "../../util/writer"; export default { translate: { - exit(program: t.NodePath) { + exit(program) { const section = getSection(program); const tagVarIdentifier = program.scope.generateUidIdentifier("tagVar"); @@ -62,4 +63,4 @@ export default { ]); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/program/index.ts b/packages/translator-tags/src/visitors/program/index.ts index 6da6f13d9f..5dddf4e779 100644 --- a/packages/translator-tags/src/visitors/program/index.ts +++ b/packages/translator-tags/src/visitors/program/index.ts @@ -16,6 +16,7 @@ import { trackParamsReferences, } from "../../util/references"; import { startSection } from "../../util/sections"; +import type { TemplateVisitor } from "../../util/visitors"; import programDOM from "./dom"; import programHTML from "./html"; @@ -46,7 +47,7 @@ declare module "@marko/compiler/dist/types" { export default { migrate: { - enter(program: t.NodePath) { + enter(program) { previousProgramPath.set(program, currentProgramPath); program.node.params = [t.identifier("input")]; currentProgramPath = program; @@ -57,7 +58,7 @@ export default { }, }, analyze: { - enter(program: t.NodePath) { + enter(program) { previousProgramPath.set(program, currentProgramPath); currentProgramPath = program; startSection(program); @@ -73,7 +74,7 @@ export default { }; }, - exit(program: t.NodePath) { + exit(program) { finalizeReferences(); const { scope, @@ -90,7 +91,7 @@ export default { }, }, translate: { - enter(program: t.NodePath) { + enter(program) { previousProgramPath.set(program, currentProgramPath); currentProgramPath = program; scopeIdentifier = isOutputDOM() @@ -121,7 +122,7 @@ export default { return; } }, - exit(program: t.NodePath) { + exit(program) { if (isOutputHTML()) { programHTML.translate.exit(program); } else { @@ -130,7 +131,7 @@ export default { currentProgramPath = previousProgramPath.get(currentProgramPath)!; }, }, -}; +} satisfies TemplateVisitor; function resolveRelativeToEntry( entryFile: t.BabelFile, diff --git a/packages/translator-tags/src/visitors/referenced-identifier.ts b/packages/translator-tags/src/visitors/referenced-identifier.ts index 132cf1ee3a..b612751e50 100644 --- a/packages/translator-tags/src/visitors/referenced-identifier.ts +++ b/packages/translator-tags/src/visitors/referenced-identifier.ts @@ -9,6 +9,7 @@ import { type Section, } from "../util/sections"; import { addStatement } from "../util/signals"; +import type { TemplateVisitor } from "../util/visitors"; import * as writer from "../util/writer"; import { scopeIdentifier } from "./program"; @@ -18,7 +19,7 @@ const abortIdsByExpressionForSection = new WeakMap< >(); export default { - migrate(identifier: t.NodePath) { + migrate(identifier) { const { name } = identifier.node; if (identifier.scope.hasBinding(name)) return; switch (name) { @@ -37,7 +38,7 @@ export default { break; } }, - translate(identifier: t.NodePath) { + translate(identifier) { const { name } = identifier.node; if (identifier.scope.hasBinding(name)) return; switch (name) { @@ -119,4 +120,4 @@ export default { } } }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/scriptlet.ts b/packages/translator-tags/src/visitors/scriptlet.ts index 719301ad71..d23e9b7ff2 100644 --- a/packages/translator-tags/src/visitors/scriptlet.ts +++ b/packages/translator-tags/src/visitors/scriptlet.ts @@ -4,13 +4,14 @@ import { isOutputHTML } from "../util/marko-config"; import { mergeReferences } from "../util/references"; import { getSection } from "../util/sections"; import { addStatement } from "../util/signals"; +import type { TemplateVisitor } from "../util/visitors"; export default { - analyze(scriptlet: t.NodePath) { + analyze(scriptlet) { mergeReferences(scriptlet, scriptlet.node.body); }, translate: { - exit(scriptlet: t.NodePath) { + exit(scriptlet) { const { node } = scriptlet; if (isOutputHTML()) { if (node.static) return; // handled in program exit for html currently. @@ -32,4 +33,4 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/tag/attribute-tag.ts b/packages/translator-tags/src/visitors/tag/attribute-tag.ts index 2488e7d015..7e0466849a 100644 --- a/packages/translator-tags/src/visitors/tag/attribute-tag.ts +++ b/packages/translator-tags/src/visitors/tag/attribute-tag.ts @@ -5,12 +5,13 @@ import attrsToObject from "../../util/attrs-to-object"; import { isOutputHTML } from "../../util/marko-config"; import { getSection, startSection } from "../../util/sections"; import { TagNameType } from "../../util/tag-name-type"; +import type { TemplateVisitor } from "../../util/visitors"; import * as writer from "../../util/writer"; import { scopeIdentifier } from "../program"; export default { analyze: { - enter(tag: t.NodePath) { + enter(tag) { assertNoVar(tag); assertNoArgs(tag); @@ -18,7 +19,7 @@ export default { }, }, translate: { - exit(tag: t.NodePath) { + exit(tag) { const parentTag = findParentTag(tag); if (!parentTag) { @@ -107,4 +108,4 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/tag/custom-tag.ts b/packages/translator-tags/src/visitors/tag/custom-tag.ts index ab5ca2e5e1..cd3b149206 100644 --- a/packages/translator-tags/src/visitors/tag/custom-tag.ts +++ b/packages/translator-tags/src/visitors/tag/custom-tag.ts @@ -37,6 +37,7 @@ import { writeHTMLResumeStatements, } from "../../util/signals"; import translateVar from "../../util/translate-var"; +import type { TemplateVisitor } from "../../util/visitors"; import * as walks from "../../util/walks"; import * as writer from "../../util/writer"; import { currentProgramPath, scopeIdentifier } from "../program"; @@ -51,7 +52,7 @@ declare module "@marko/compiler/dist/types" { export default { analyze: { - enter(tag: t.NodePath) { + enter(tag) { const section = getOrCreateSection(tag); const tagBody = tag.get("body"); @@ -94,14 +95,14 @@ export default { }, }, translate: { - enter(tag: t.NodePath) { + enter(tag) { assertAttributesOrSingleArg(tag); walks.visit(tag); if (isOutputHTML()) { writer.flushBefore(tag); } }, - exit(tag: t.NodePath) { + exit(tag) { if (isOutputHTML()) { translateHTML(tag); } else { @@ -109,7 +110,7 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; function translateHTML(tag: t.NodePath) { const tagBody = tag.get("body"); diff --git a/packages/translator-tags/src/visitors/tag/dynamic-tag.ts b/packages/translator-tags/src/visitors/tag/dynamic-tag.ts index 8d38f3e9ee..a6ed75ed0a 100644 --- a/packages/translator-tags/src/visitors/tag/dynamic-tag.ts +++ b/packages/translator-tags/src/visitors/tag/dynamic-tag.ts @@ -39,6 +39,7 @@ import { } from "../../util/signals"; import toFirstExpressionOrBlock from "../../util/to-first-expression-or-block"; import translateVar from "../../util/translate-var"; +import type { TemplateVisitor } from "../../util/visitors"; import * as walks from "../../util/walks"; import * as writer from "../../util/writer"; import { currentProgramPath, scopeIdentifier } from "../program"; @@ -54,7 +55,7 @@ declare module "@marko/compiler/dist/types" { export default { analyze: { - enter(tag: t.NodePath) { + enter(tag) { const section = getOrCreateSection(tag); const tagExtra = (tag.node.extra ??= {}); const tagBody = tag.get("body"); @@ -86,7 +87,7 @@ export default { }, }, translate: { - enter(tag: t.NodePath) { + enter(tag) { walks.visit(tag, WalkCode.Replace); assertAttributesOrArgs(tag); @@ -96,7 +97,7 @@ export default { writer.flushBefore(tag); } }, - exit(tag: t.NodePath) { + exit(tag) { const { node } = tag; const extra = node.extra!; const nodeRef = extra[kDOMBinding]!; @@ -349,4 +350,4 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/tag/index.ts b/packages/translator-tags/src/visitors/tag/index.ts index e5d668e6f7..af804f1ed4 100644 --- a/packages/translator-tags/src/visitors/tag/index.ts +++ b/packages/translator-tags/src/visitors/tag/index.ts @@ -5,6 +5,7 @@ import { isOutputHTML } from "../../util/marko-config"; import analyzeAttributeTags from "../../util/nested-attribute-tags"; import * as hooks from "../../util/plugin-hooks"; import analyzeTagNameType, { TagNameType } from "../../util/tag-name-type"; +import type { TemplateVisitor } from "../../util/visitors"; import AttributeTag from "./attribute-tag"; import CustomTag from "./custom-tag"; import DynamicTag from "./dynamic-tag"; @@ -12,7 +13,7 @@ import NativeTag from "./native-tag"; export default { transform: { - enter(tag: t.NodePath) { + enter(tag) { const attrs = tag.get("attributes"); for (let i = 0; i < attrs.length; i++) { @@ -38,7 +39,7 @@ export default { }, }, analyze: { - enter(tag: t.NodePath) { + enter(tag) { const tagDef = getTagDef(tag); const type = analyzeTagNameType(tag); const hook = tagDef?.analyzer?.hook as Plugin; @@ -67,7 +68,7 @@ export default { break; } }, - exit(tag: t.NodePath) { + exit(tag) { const hook = getTagDef(tag)?.analyzer?.hook as Plugin; if (hook) { @@ -92,7 +93,7 @@ export default { }, }, translate: { - enter(tag: t.NodePath) { + enter(tag) { const tagDef = getTagDef(tag); const extra = tag.node.extra!; @@ -157,7 +158,7 @@ export default { } }, - exit(tag: t.NodePath) { + exit(tag) { const translator = getTagDef(tag)?.translator; if (translator) { @@ -181,7 +182,7 @@ export default { } }, }, -}; +} satisfies TemplateVisitor; function getChangeHandler( tag: t.NodePath, diff --git a/packages/translator-tags/src/visitors/tag/native-tag.ts b/packages/translator-tags/src/visitors/tag/native-tag.ts index 2da0216426..56480ace59 100644 --- a/packages/translator-tags/src/visitors/tag/native-tag.ts +++ b/packages/translator-tags/src/visitors/tag/native-tag.ts @@ -30,6 +30,7 @@ import { getSerializedScopeProperties, } from "../../util/signals"; import translateVar from "../../util/translate-var"; +import type { TemplateVisitor } from "../../util/visitors"; import * as walks from "../../util/walks"; import * as writer from "../../util/writer"; import { currentProgramPath, scopeIdentifier } from "../program"; @@ -48,7 +49,7 @@ declare module "@marko/compiler/dist/types" { export default { analyze: { - enter(tag: t.NodePath) { + enter(tag) { const { node } = tag; const attrs = tag.get("attributes"); const tagVar = tag.node.var; @@ -108,7 +109,7 @@ export default { }, }, translate: { - enter(tag: t.NodePath) { + enter(tag) { assertNoArgs(tag); const extra = tag.node.extra!; @@ -332,7 +333,7 @@ export default { walks.enter(tag); }, - exit(tag: t.NodePath) { + exit(tag) { const extra = tag.node.extra!; const nodeRef = extra[kNativeTagBinding]; const isHTML = isOutputHTML(); @@ -371,7 +372,7 @@ export default { tag.remove(); }, }, -}; +} satisfies TemplateVisitor; function isSpreadAttr( attr: t.NodePath, diff --git a/packages/translator-tags/src/visitors/text.ts b/packages/translator-tags/src/visitors/text.ts index f492a9fd7e..caae994cb0 100644 --- a/packages/translator-tags/src/visitors/text.ts +++ b/packages/translator-tags/src/visitors/text.ts @@ -1,14 +1,15 @@ import { types as t } from "@marko/compiler"; +import type { TemplateVisitor } from "../util/visitors"; import * as walks from "../util/walks"; import * as writer from "../util/writer"; export default { translate: { - exit(text: t.NodePath) { + exit(text) { writer.writeTo(text)`${text.node.value}`; walks.enterShallow(text); text.remove(); }, }, -}; +} satisfies TemplateVisitor; diff --git a/packages/translator-tags/src/visitors/update-expression.ts b/packages/translator-tags/src/visitors/update-expression.ts index cc10d15794..397e468aba 100644 --- a/packages/translator-tags/src/visitors/update-expression.ts +++ b/packages/translator-tags/src/visitors/update-expression.ts @@ -2,21 +2,22 @@ import { types as t } from "@marko/compiler"; import { isOutputDOM } from "../util/marko-config"; import { getSection } from "../util/sections"; +import type { TemplateVisitor } from "../util/visitors"; import { currentProgramPath } from "./program"; export default { translate: { - exit(assignment: t.NodePath) { + exit(expr) { if (isOutputDOM()) { - const source = assignment.node.argument.extra?.source; + const source = expr.node.argument.extra?.source; if (source) { - const section = getSection(assignment); + const section = getSection(expr); (currentProgramPath.node.extra.assignments ??= []).push([ section, - assignment, + expr, ]); } } }, }, -}; +} satisfies TemplateVisitor;