From 4610748e33237abb9359ecbcc2d26908c96ec130 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Mon, 2 Dec 2024 13:35:02 -0800 Subject: [PATCH] refactor(ssr): share node types in traversal --- .../@lwc/ssr-compiler/src/transmogrify.ts | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/packages/@lwc/ssr-compiler/src/transmogrify.ts b/packages/@lwc/ssr-compiler/src/transmogrify.ts index 952095992c..c049845970 100644 --- a/packages/@lwc/ssr-compiler/src/transmogrify.ts +++ b/packages/@lwc/ssr-compiler/src/transmogrify.ts @@ -42,32 +42,31 @@ const isWithinFn = (pattern: RegExp, nodePath: NodePath): boolean => { return false; }; -function transformFunction( - path: NodePath, - state: TransmogrificationState -): undefined { - const { node } = path; - if (!node?.async || !node?.generator) { - return; - } - - // Component authors might conceivably use async generator functions in their own code. Therefore, - // when traversing & transforming written+generated code, we need to disambiguate generated async - // generator functions from those that were written by the component author. - if ( - !isWithinFn(GEN_MARKUP_OR_GEN_SLOTTED_CONTENT_PATTERN, path) && - !isWithinFn(TMPL_FN_PATTERN, path) - ) { - return; - } - node.generator = false; - node.async = state.mode === 'async'; - node.params.unshift(EMIT_IDENT); -} - const visitors: Visitors = { - FunctionDeclaration: transformFunction, - FunctionExpression: transformFunction, + // @ts-expect-error types for `traverse` do not support sharing a visitor between node types: + // https://estree-toolkit.netlify.app/traversal#sharing-a-visitor-function-between-two-node-types + 'FunctionDeclaration|FunctionExpression': ( + path: NodePath, + state: TransmogrificationState + ) => { + const { node } = path; + if (!node?.async || !node?.generator) { + return; + } + + // Component authors might conceivably use async generator functions in their own code. Therefore, + // when traversing & transforming written+generated code, we need to disambiguate generated async + // generator functions from those that were written by the component author. + if ( + !isWithinFn(GEN_MARKUP_OR_GEN_SLOTTED_CONTENT_PATTERN, path) && + !isWithinFn(TMPL_FN_PATTERN, path) + ) { + return; + } + node.generator = false; + node.async = state.mode === 'async'; + node.params.unshift(EMIT_IDENT); + }, YieldExpression(path, state) { const { node } = path; if (!node) {