Skip to content

Commit d52ffaa

Browse files
committed
refactor(compiler-ssr): extract portal processing + emit errors
1 parent d8ed0e7 commit d52ffaa

File tree

2 files changed

+48
-29
lines changed

2 files changed

+48
-29
lines changed

packages/compiler-ssr/src/ssrCodegenTransform.ts

+5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ function createSSRTransformContext(
6060
body,
6161
helpers,
6262
withSlotScopeId,
63+
onError:
64+
options.onError ||
65+
(e => {
66+
throw e
67+
}),
6368
helper<T extends symbol>(name: T): T {
6469
helpers.add(name)
6570
return name

packages/compiler-ssr/src/transforms/ssrTransformComponent.ts

+43-29
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
processChildrenAsStatement
4343
} from '../ssrCodegenTransform'
4444
import { isSymbol, isObject, isArray } from '@vue/shared'
45+
import { createSSRCompilerError, SSRErrorCodes } from '../errors'
4546

4647
// We need to construct the slot functions in the 1st pass to ensure proper
4748
// scope tracking, but the children of each slot cannot be processed until
@@ -136,35 +137,7 @@ export function ssrProcessComponent(
136137
const component = componentTypeMap.get(node)!
137138

138139
if (component === PORTAL) {
139-
const targetProp = findProp(node, 'target')
140-
if (!targetProp) return
141-
142-
let target: JSChildNode
143-
if (targetProp.type === NodeTypes.ATTRIBUTE && targetProp.value) {
144-
target = createSimpleExpression(targetProp.value.content, true)
145-
} else if (targetProp.type === NodeTypes.DIRECTIVE && targetProp.exp) {
146-
target = targetProp.exp
147-
} else {
148-
return
149-
}
150-
151-
const contentRenderFn = createFunctionExpression(
152-
[`_push`],
153-
undefined, // Body is added later
154-
true, // newline
155-
false, // isSlot
156-
node.loc
157-
)
158-
contentRenderFn.body = processChildrenAsStatement(node.children, context)
159-
context.pushStatement(
160-
createCallExpression(context.helper(SSR_RENDER_PORTAL), [
161-
contentRenderFn,
162-
target,
163-
`_parent`
164-
])
165-
)
166-
167-
return
140+
return ssrProcessPortal(node, context)
168141
}
169142

170143
const needFragmentWrapper =
@@ -194,6 +167,47 @@ export function ssrProcessComponent(
194167
}
195168
}
196169

170+
function ssrProcessPortal(node: ComponentNode, context: SSRTransformContext) {
171+
const targetProp = findProp(node, 'target')
172+
if (!targetProp) {
173+
context.onError(
174+
createSSRCompilerError(SSRErrorCodes.X_SSR_NO_PORTAL_TARGET, node.loc)
175+
)
176+
return
177+
}
178+
179+
let target: JSChildNode
180+
if (targetProp.type === NodeTypes.ATTRIBUTE && targetProp.value) {
181+
target = createSimpleExpression(targetProp.value.content, true)
182+
} else if (targetProp.type === NodeTypes.DIRECTIVE && targetProp.exp) {
183+
target = targetProp.exp
184+
} else {
185+
context.onError(
186+
createSSRCompilerError(
187+
SSRErrorCodes.X_SSR_NO_PORTAL_TARGET,
188+
targetProp.loc
189+
)
190+
)
191+
return
192+
}
193+
194+
const contentRenderFn = createFunctionExpression(
195+
[`_push`],
196+
undefined, // Body is added later
197+
true, // newline
198+
false, // isSlot
199+
node.loc
200+
)
201+
contentRenderFn.body = processChildrenAsStatement(node.children, context)
202+
context.pushStatement(
203+
createCallExpression(context.helper(SSR_RENDER_PORTAL), [
204+
contentRenderFn,
205+
target,
206+
`_parent`
207+
])
208+
)
209+
}
210+
197211
export const rawOptionsMap = new WeakMap<RootNode, CompilerOptions>()
198212

199213
const [baseNodeTransforms, baseDirectiveTransforms] = getBaseTransformPreset(

0 commit comments

Comments
 (0)