vue3-core/packages/compiler-vapor/src/utils.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

68 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-02-09 02:40:01 +08:00
import type { NumericLiteral, StringLiteral } from '@babel/types'
import { isGloballyAllowed } from '@vue/shared'
import {
type AttributeNode,
type ElementNode,
NodeTypes,
type SimpleExpressionNode,
findDir as _findDir,
findProp as _findProp,
createSimpleExpression,
isLiteralWhitelisted,
} from '@vue/compiler-dom'
import type { VaporDirectiveNode } from './ir'
2024-02-09 02:40:01 +08:00
import { EMPTY_EXPRESSION } from './transforms/utils'
export const findProp = _findProp as (
node: ElementNode,
name: string,
dynamicOnly?: boolean,
allowEmpty?: boolean,
) => AttributeNode | VaporDirectiveNode | undefined
/** find directive */
export const findDir = _findDir as (
node: ElementNode,
name: string | RegExp,
allowEmpty?: boolean,
) => VaporDirectiveNode | undefined
export function propToExpression(prop: AttributeNode | VaporDirectiveNode) {
return prop.type === NodeTypes.ATTRIBUTE
? prop.value
? createSimpleExpression(prop.value.content, true, prop.value.loc)
: EMPTY_EXPRESSION
: prop.exp
}
export function isConstantExpression(exp: SimpleExpressionNode) {
return (
isLiteralWhitelisted(exp.content) ||
isGloballyAllowed(exp.content) ||
getLiteralExpressionValue(exp) !== null
)
}
export function resolveExpression(exp: SimpleExpressionNode) {
if (!exp.isStatic) {
const value = getLiteralExpressionValue(exp)
if (value !== null) {
return createSimpleExpression('' + value, true, exp.loc)
}
}
return exp
}
export function getLiteralExpressionValue(
exp: SimpleExpressionNode,
): number | string | null {
if (
!__BROWSER__ &&
exp.ast &&
['StringLiteral', 'NumericLiteral'].includes(exp.ast.type)
) {
return (exp.ast as StringLiteral | NumericLiteral).value
}
return exp.isStatic ? exp.content : null
}