Skip to content

Commit

Permalink
refactor(ssr): share node types in traversal (#4987)
Browse files Browse the repository at this point in the history
Co-authored-by: Will Harney <[email protected]>
  • Loading branch information
nolanlawson and wjhsf authored Dec 3, 2024
1 parent 91bcaf2 commit 7f44840
Showing 1 changed file with 23 additions and 24 deletions.
47 changes: 23 additions & 24 deletions packages/@lwc/ssr-compiler/src/transmogrify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,32 +42,31 @@ const isWithinFn = (pattern: RegExp, nodePath: NodePath): boolean => {
return false;
};

function transformFunction(
path: NodePath<FunctionDeclaration | FunctionExpression, EstreeToolkitNode>,
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)
const visitors: Visitors = {
// @ts-expect-error types for `traverse` do not support sharing a visitor between node types:
// https://github.com/sarsamurmu/estree-toolkit/issues/20
'FunctionDeclaration|FunctionExpression'(
path: NodePath<FunctionDeclaration | FunctionExpression, EstreeToolkitNode>,
state: TransmogrificationState
) {
return;
}
node.generator = false;
node.async = state.mode === 'async';
node.params.unshift(EMIT_IDENT);
}
const { node } = path;
if (!node?.async || !node?.generator) {
return;
}

const visitors: Visitors = {
FunctionDeclaration: transformFunction,
FunctionExpression: transformFunction,
// 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) {
Expand Down

0 comments on commit 7f44840

Please sign in to comment.