Skip to content

Commit 3badf50

Browse files
authored
fix(runtime-vapor): avoid exposing built-in components internals via template ref (#14448)
1 parent 0c1e4a0 commit 3badf50

File tree

6 files changed

+24
-5
lines changed

6 files changed

+24
-5
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"test-unit": "vitest --project unit*",
2121
"test-e2e": "node scripts/build.js vue -f global+esm-browser-vapor -d && vitest --project e2e",
2222
"test-e2e-vapor": "pnpm run prepare-e2e-vapor && vitest --project e2e-vapor",
23-
"prepare-e2e-vapor": "node scripts/build.js -f cjs+esm-bundler+esm-bundler-runtime && pnpm run -C packages-private/vapor-e2e-test build",
23+
"prepare-e2e-vapor": "__TEST__=true node scripts/build.js -f cjs+esm-bundler+esm-bundler-runtime && pnpm run -C packages-private/vapor-e2e-test build",
2424
"test-dts": "run-s build-dts test-dts-only",
2525
"test-dts-only": "tsc -p packages-private/dts-built-test/tsconfig.json && tsc -p ./packages-private/dts-test/tsconfig.test.json && tsc -p ./packages-private/dts-test/vapor/tsconfig.json",
2626
"test-coverage": "vitest --ui --project unit* --coverage.enabled=true",

packages-private/vapor-e2e-test/transition/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ const UnmountBranch = defineVaporComponent({
146146
})
147147
const keepAliveUnmountRef = ref(null)
148148
window.getKeepAliveUnmountStorageContainer = () =>
149-
keepAliveUnmountRef.value?.ctx?.getStorageContainer?.() ?? null
149+
keepAliveUnmountRef.value.getStorageContainer()
150150
const unmountIncludeRef = ref(['UnmountBranch'])
151151
const unmountToggle = ref(true)
152152
const unmountClick = () => {

packages/runtime-vapor/src/apiTemplateRef.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
isString,
2626
remove,
2727
} from '@vue/shared'
28+
import { isTeleportFragment } from './components/Teleport'
2829
import {
2930
type DynamicFragment,
3031
type VaporFragment,
@@ -249,6 +250,8 @@ function setRef(
249250
const getRefValue = (el: RefEl) => {
250251
if (isVaporComponent(el)) {
251252
return getExposed(el) || el
253+
} else if (isTeleportFragment(el)) {
254+
return null
252255
} else if (isDynamicFragment(el)) {
253256
if (isArray(el.nodes)) return null
254257
return getRefValue(el.nodes as RefEl)

packages/runtime-vapor/src/components/KeepAlive.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,16 @@ const VaporKeepAliveImpl = defineVaporComponent({
117117
exclude: [String, RegExp, Array],
118118
max: [String, Number],
119119
},
120-
setup(props: KeepAliveProps, { slots }) {
120+
setup(props: KeepAliveProps, { slots, expose }) {
121+
let exposed!: Record<string, any>
122+
// for e2e test
123+
if (__BROWSER__ && __TEST__) {
124+
exposed = {
125+
getStorageContainer: () => storageContainer,
126+
}
127+
}
128+
expose(exposed)
129+
121130
if (!slots.default) {
122131
return undefined
123132
}
@@ -141,6 +150,7 @@ const VaporKeepAliveImpl = defineVaporComponent({
141150
if (__DEV__) {
142151
const rerender = keepAliveInstance.hmrRerender
143152
keepAliveInstance.hmrRerender = () => {
153+
keepAliveInstance.exposed = null
144154
cache.forEach(cached => resetCachedShapeFlag(cached))
145155
cache.clear()
146156
keys.clear()

packages/runtime-vapor/src/components/Transition.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ const decorate = (t: typeof VaporTransition) => {
8888
}
8989

9090
export const VaporTransition: FunctionalVaporComponent<TransitionProps> =
91-
/*@__PURE__*/ decorate((props, { slots }) => {
91+
/*@__PURE__*/ decorate((props, { slots, expose }) => {
92+
// @ts-expect-error
93+
expose()
94+
9295
// Register transition hooks on first use
9396
ensureTransitionHooksRegistered()
9497

packages/runtime-vapor/src/components/TransitionGroup.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ const VaporTransitionGroupImpl = defineVaporComponent({
5757
moveClass: String,
5858
}),
5959

60-
setup(props: TransitionGroupProps, { slots }) {
60+
setup(props: TransitionGroupProps, { slots, expose }) {
61+
// @ts-expect-error
62+
expose()
63+
6164
// Register transition hooks on first use
6265
ensureTransitionHooksRegistered()
6366

0 commit comments

Comments
 (0)