vue3-yuanma/packages/compiler-core/__tests__/testUtils.ts

93 lines
2.1 KiB
TypeScript
Raw Normal View History

import {
NodeTypes,
ElementNode,
locStub,
Namespaces,
ElementTypes,
2020-02-12 07:40:21 +08:00
VNodeCall
} from '../src'
import {
isString,
PatchFlags,
PatchFlagNames,
isArray,
ShapeFlags
} 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" }
2019-10-16 22:31:40 +08:00
export function createObjectMatcher(obj: Record<string, 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(
2020-02-12 07:40:21 +08:00
tag: VNodeCall['tag'],
props?: VNodeCall['props'],
children?: VNodeCall['children'],
patchFlag?: VNodeCall['patchFlag'],
dynamicProps?: VNodeCall['dynamicProps']
): ElementNode {
return {
type: NodeTypes.ELEMENT,
loc: locStub,
ns: Namespaces.HTML,
tag: 'div',
tagType: ElementTypes.ELEMENT,
isSelfClosing: false,
props: [],
children: [],
codegenNode: {
2020-02-12 07:40:21 +08:00
type: NodeTypes.VNODE_CALL,
tag,
props,
children,
patchFlag,
dynamicProps,
directives: undefined,
isBlock: false,
disableTracking: false,
isComponent: false,
2020-02-12 07:40:21 +08:00
loc: locStub
}
}
}
2019-10-08 05:12:22 +08:00
type Flags = PatchFlags | ShapeFlags
export function genFlagText(
flag: Flags | Flags[],
names: { [k: number]: string } = PatchFlagNames
) {
2019-10-08 05:12:22 +08:00
if (isArray(flag)) {
let f = 0
flag.forEach(ff => {
f |= ff
})
return `${f} /* ${flag.map(f => names[f]).join(', ')} */`
2019-10-08 05:12:22 +08:00
} else {
return `${flag} /* ${names[flag]} */`
2019-10-08 05:12:22 +08:00
}
}