73 lines
1.8 KiB
TypeScript
73 lines
1.8 KiB
TypeScript
import {
|
|
NodeTypes,
|
|
ElementNode,
|
|
locStub,
|
|
Namespaces,
|
|
ElementTypes,
|
|
ElementCodegenNode
|
|
} from '../src'
|
|
import { CREATE_VNODE } from '../src/runtimeHelpers'
|
|
import { isString, PatchFlags, PatchFlagNames, isArray } from '@vue/shared'
|
|
|
|
const leadingBracketRE = /^\[/
|
|
const bracketsRE = /^\[|\]$/g
|
|
|
|
// Create a matcher for an object
|
|
// where non-static expressions should be wrapped in []
|
|
// e.g.
|
|
// - createObjectMatcher({ 'foo': '[bar]' }) matches { foo: bar }
|
|
// - createObjectMatcher({ '[foo]': 'bar' }) matches { [foo]: "bar" }
|
|
export function createObjectMatcher(obj: any) {
|
|
return {
|
|
type: NodeTypes.JS_OBJECT_EXPRESSION,
|
|
properties: Object.keys(obj).map(key => ({
|
|
type: NodeTypes.JS_PROPERTY,
|
|
key: {
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
content: key.replace(bracketsRE, ''),
|
|
isStatic: !leadingBracketRE.test(key)
|
|
},
|
|
value: isString(obj[key])
|
|
? {
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
content: obj[key].replace(bracketsRE, ''),
|
|
isStatic: !leadingBracketRE.test(obj[key])
|
|
}
|
|
: obj[key]
|
|
}))
|
|
}
|
|
}
|
|
|
|
export function createElementWithCodegen(
|
|
args: ElementCodegenNode['arguments']
|
|
): ElementNode {
|
|
return {
|
|
type: NodeTypes.ELEMENT,
|
|
loc: locStub,
|
|
ns: Namespaces.HTML,
|
|
tag: 'div',
|
|
tagType: ElementTypes.ELEMENT,
|
|
isSelfClosing: false,
|
|
props: [],
|
|
children: [],
|
|
codegenNode: {
|
|
type: NodeTypes.JS_CALL_EXPRESSION,
|
|
loc: locStub,
|
|
callee: CREATE_VNODE,
|
|
arguments: args
|
|
}
|
|
}
|
|
}
|
|
|
|
export function genFlagText(flag: PatchFlags | PatchFlags[]) {
|
|
if (isArray(flag)) {
|
|
let f = 0
|
|
flag.forEach(ff => {
|
|
f |= ff
|
|
})
|
|
return `${f} /* ${flag.map(f => PatchFlagNames[f]).join(', ')} */`
|
|
} else {
|
|
return `${flag} /* ${PatchFlagNames[flag]} */`
|
|
}
|
|
}
|