提交 bc7b9fbd 编写于 作者: fxy060608's avatar fxy060608

wip(app): nvue

上级 b1207592
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`app-nvue: compiler <video></video> 1`] = `
"import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\"
export function render(_ctx, _cache) {
return (_openBlock(), _createElementBlock(\\"u-video\\"))
}"
`;
exports[`app-nvue: compiler <video><view></view></video> 1`] = `
"import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\"
const _hoisted_1 = /*#__PURE__*/_createElementVNode(\\"u-scalable\\", { style: {position:\\"absolute\\",left:\\"0\\",right:\\"0\\",top:\\"0\\",bottom:\\"0\\"} }, [
/*#__PURE__*/_createElementVNode(\\"view\\")
], -1 /* HOISTED */)
const _hoisted_2 = [
_hoisted_1
]
export function render(_ctx, _cache) {
return (_openBlock(), _createElementBlock(\\"u-video\\", null, _hoisted_2))
}"
`;
exports[`app-nvue: compiler <view>hello</view> 1`] = `
"import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\"
const _hoisted_1 = [\\"appendAsTree\\"]
export function render(_ctx, _cache) {
return (_openBlock(), _createElementBlock(\\"view\\", null, [
_createElementVNode(\\"u-text\\", { appendAsTree: true }, \\"hello\\", 8 /* PROPS */, _hoisted_1)
]))
}"
`;
...@@ -19,9 +19,29 @@ function compile(source: string) { ...@@ -19,9 +19,29 @@ function compile(source: string) {
compilerOptions: { compilerOptions: {
...compilerOptions, ...compilerOptions,
}, },
}).ast!.children[0] as ElementNode })
}
function genAst(source: string) {
return compile(source).ast!.children[0] as ElementNode
} }
function genCode(source: string) {
return compile(source).code
}
const codes = [
`<view>hello</view>`,
`<video></video>`,
`<video><view></view></video>`,
]
describe('app-nvue: compiler', () => { describe('app-nvue: compiler', () => {
codes.forEach((code) => {
test(code, () => {
expect(genCode(code)).toMatchSnapshot()
})
})
test('u-tags', () => { test('u-tags', () => {
;[ ;[
'text', 'text',
...@@ -32,24 +52,19 @@ describe('app-nvue: compiler', () => { ...@@ -32,24 +52,19 @@ describe('app-nvue: compiler', () => {
'web-view', 'web-view',
'slider', 'slider',
].forEach((tag) => { ].forEach((tag) => {
expect(compile(`<${tag}></${tag}>`).tag).toBe(`u-${tag}`) expect(genAst(`<${tag}></${tag}>`).tag).toBe(`u-${tag}`)
}) })
}) })
test('video', () => {
expect(compile(`<video></video>`).children.length).toBe(0)
expect(
(compile(`<video><view></view></video>`).children[0] as ElementNode).tag
).toBe('u-scalable')
})
test('scroll-view', () => { test('scroll-view', () => {
compile(`<view></view>`) genAst(`<view></view>`)
}) })
test('render-whole', () => { test('render-whole', () => {
expect( expect(
( (
( (
findProp( findProp(
compile(`<view :render-whole="true">hello</view>`), genAst(`<view :render-whole="true">hello</view>`),
'appendAsTree', 'appendAsTree',
true, true,
false false
...@@ -60,13 +75,13 @@ describe('app-nvue: compiler', () => { ...@@ -60,13 +75,13 @@ describe('app-nvue: compiler', () => {
}) })
test('unitary tag', () => { test('unitary tag', () => {
expect( expect(
findProp(compile(`<text>hello</text>`), 'appendAsTree', true, false) findProp(genAst(`<text>hello</text>`), 'appendAsTree', true, false)
).toBeTruthy() ).toBeTruthy()
}) })
test('tap=>click', () => { test('tap=>click', () => {
expect( expect(
( (
findDir(compile(`<view @tap="click"></view>`), 'on')! findDir(genAst(`<view @tap="click"></view>`), 'on')!
.arg as SimpleExpressionNode .arg as SimpleExpressionNode
).content ).content
).toBe('click') ).toBe('click')
......
...@@ -13,6 +13,7 @@ import { nvueOutDir } from '../../utils' ...@@ -13,6 +13,7 @@ import { nvueOutDir } from '../../utils'
import { transformRenderWhole } from './transforms/transformRenderWhole' import { transformRenderWhole } from './transforms/transformRenderWhole'
import { transformAppendAsTree } from './transforms/transformAppendAsTree' import { transformAppendAsTree } from './transforms/transformAppendAsTree'
import { transformVideo } from './transforms/transformVideo' import { transformVideo } from './transforms/transformVideo'
import { transformText } from './transforms/transformText'
const uTags = { const uTags = {
text: 'u-text', text: 'u-text',
image: 'u-image', image: 'u-image',
...@@ -27,6 +28,7 @@ export function initNVueNodeTransforms() { ...@@ -27,6 +28,7 @@ export function initNVueNodeTransforms() {
// 优先级必须确保 renderWhole > appendAsTree // 优先级必须确保 renderWhole > appendAsTree
return [ return [
createTransformTag(uTags), createTransformTag(uTags),
transformText,
transformVideo, transformVideo,
transformRenderWhole, transformRenderWhole,
transformAppendAsTree, transformAppendAsTree,
......
...@@ -5,7 +5,6 @@ export const transformRenderWhole: NodeTransform = (node, _) => { ...@@ -5,7 +5,6 @@ export const transformRenderWhole: NodeTransform = (node, _) => {
if (!isElementNode(node)) { if (!isElementNode(node)) {
return return
} }
debugger
const prop = findProp(node, 'render-whole') const prop = findProp(node, 'render-whole')
if (!prop) { if (!prop) {
return return
......
import { isElementNode } from '@dcloudio/uni-cli-shared'
import {
CompoundExpressionNode,
ElementNode,
ElementTypes,
InterpolationNode,
NodeTransform,
NodeTypes,
TemplateChildNode,
TextCallNode,
TextNode,
} from '@vue/compiler-core'
function isTextNode({ tag }: ElementNode) {
return tag === 'text' || tag === 'u-text' || tag === 'button'
}
function isText(
node: TemplateChildNode
): node is
| TextNode
| TextCallNode
| InterpolationNode
| CompoundExpressionNode {
const { type } = node
return (
type === NodeTypes.TEXT ||
type === NodeTypes.TEXT_CALL ||
type === NodeTypes.INTERPOLATION ||
type === NodeTypes.COMPOUND_EXPRESSION
)
}
export const transformText: NodeTransform = (node, _) => {
if (!isElementNode(node)) {
return
}
if (isTextNode(node)) {
return
}
const { children } = node
if (!children.length) {
return
}
children.forEach((child, index) => {
if (isText(child)) {
children.splice(index, 1, createText(node, child))
}
})
}
function createText(
parent: ElementNode,
node: TextNode | TextCallNode | InterpolationNode | CompoundExpressionNode
): ElementNode {
return {
tag: 'u-text',
type: NodeTypes.ELEMENT,
tagType: ElementTypes.ELEMENT,
props: [],
isSelfClosing: false,
children: [node],
codegenNode: undefined,
ns: parent.ns,
loc: node.loc,
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册