39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
// SFC scoped style ID management.
|
|
// These are only used in esm-bundler builds, but since exports cannot be
|
|
// conditional, we can only drop inner implementations in non-bundler builds.
|
|
|
|
import { ComponentInternalInstance } from '../component'
|
|
import { withCtx } from './withRenderContext'
|
|
|
|
export let currentScopeId: string | null = null
|
|
const scopeIdStack: string[] = []
|
|
|
|
export function pushScopeId(id: string) {
|
|
if (__BUNDLER__) {
|
|
scopeIdStack.push((currentScopeId = id))
|
|
}
|
|
}
|
|
|
|
export function popScopeId() {
|
|
if (__BUNDLER__) {
|
|
scopeIdStack.pop()
|
|
currentScopeId = scopeIdStack[scopeIdStack.length - 1] || null
|
|
}
|
|
}
|
|
|
|
export function withScopeId(id: string): <T extends Function>(fn: T) => T {
|
|
if (__BUNDLER__) {
|
|
return ((fn: Function, ctx?: ComponentInternalInstance) => {
|
|
function renderWithId(this: any) {
|
|
pushScopeId(id)
|
|
const res = fn.apply(this, arguments)
|
|
popScopeId()
|
|
return res
|
|
}
|
|
return ctx ? withCtx(renderWithId, ctx) : renderWithId
|
|
}) as any
|
|
} else {
|
|
return undefined as any
|
|
}
|
|
}
|