import { type BlockStatement, type CallExpression, type CompilerError, type CompilerOptions, ElementTypes, type IfStatement, type JSChildNode, NodeTypes, type RootNode, type TemplateChildNode, type TemplateLiteral, createBlockStatement, createCallExpression, createCompoundExpression, createRoot, createSimpleExpression, createTemplateLiteral, createTransformContext, isText, processExpression, } from '@vue/compiler-dom' import { escapeHtml, isString } from '@vue/shared' import { SSR_INTERPOLATE, ssrHelpers } from './runtimeHelpers' import { ssrProcessIf } from './transforms/ssrVIf' import { ssrProcessFor } from './transforms/ssrVFor' import { ssrProcessSlotOutlet } from './transforms/ssrTransformSlotOutlet' import { ssrProcessComponent } from './transforms/ssrTransformComponent' import { ssrProcessElement } from './transforms/ssrTransformElement' import { SSRErrorCodes, createSSRCompilerError } from './errors' // Because SSR codegen output is completely different from client-side output // (e.g. multiple elements can be concatenated into a single template literal // instead of each getting a corresponding call), we need to apply an extra // transform pass to convert the template AST into a fresh JS AST before // passing it to codegen. export function ssrCodegenTransform( ast: RootNode, options: CompilerOptions, ): void { const context = createSSRTransformContext(ast, options) // inject SFC