2019-09-25 03:49:02 +08:00
|
|
|
import {
|
|
|
|
generate,
|
|
|
|
NodeTypes,
|
|
|
|
RootNode,
|
|
|
|
SourceLocation,
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression,
|
2019-09-25 03:49:02 +08:00
|
|
|
Namespaces,
|
|
|
|
ElementTypes,
|
2019-09-25 04:35:01 +08:00
|
|
|
CallExpression,
|
2019-09-25 03:49:02 +08:00
|
|
|
createObjectExpression,
|
|
|
|
createObjectProperty,
|
2019-09-25 04:35:01 +08:00
|
|
|
createArrayExpression,
|
2019-09-27 23:42:02 +08:00
|
|
|
ElementNode,
|
|
|
|
createCompoundExpression,
|
|
|
|
createInterpolation
|
2019-09-25 03:49:02 +08:00
|
|
|
} from '../src'
|
2019-09-26 07:17:45 +08:00
|
|
|
import {
|
|
|
|
CREATE_VNODE,
|
|
|
|
COMMENT,
|
|
|
|
TO_STRING,
|
|
|
|
RENDER_LIST
|
|
|
|
} from '../src/runtimeConstants'
|
2019-09-25 03:49:02 +08:00
|
|
|
|
|
|
|
const mockLoc: SourceLocation = {
|
|
|
|
source: ``,
|
|
|
|
start: {
|
|
|
|
offset: 0,
|
|
|
|
line: 1,
|
|
|
|
column: 1
|
|
|
|
},
|
|
|
|
end: {
|
|
|
|
offset: 3,
|
|
|
|
line: 1,
|
|
|
|
column: 4
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function createRoot(options: Partial<RootNode> = {}): RootNode {
|
|
|
|
return {
|
|
|
|
type: NodeTypes.ROOT,
|
|
|
|
children: [],
|
|
|
|
imports: [],
|
|
|
|
statements: [],
|
2019-09-26 02:13:33 +08:00
|
|
|
hoists: [],
|
2019-09-25 03:49:02 +08:00
|
|
|
loc: mockLoc,
|
|
|
|
...options
|
|
|
|
}
|
|
|
|
}
|
2019-09-20 11:05:51 +08:00
|
|
|
|
|
|
|
describe('compiler: codegen', () => {
|
2019-09-25 03:49:02 +08:00
|
|
|
test('module mode preamble', () => {
|
|
|
|
const root = createRoot({
|
|
|
|
imports: [`helperOne`, `helperTwo`]
|
|
|
|
})
|
|
|
|
const { code } = generate(root, { mode: 'module' })
|
2019-09-26 10:29:37 +08:00
|
|
|
expect(code).toMatch(`import { helperOne, helperTwo } from "vue"`)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('function mode preamble', () => {
|
|
|
|
const root = createRoot({
|
|
|
|
imports: [`helperOne`, `helperTwo`]
|
|
|
|
})
|
|
|
|
const { code } = generate(root, { mode: 'function' })
|
2019-09-26 03:09:58 +08:00
|
|
|
expect(code).toMatch(`const _Vue = Vue`)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(
|
|
|
|
`const { helperOne: _helperOne, helperTwo: _helperTwo } = _Vue`
|
|
|
|
)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('function mode preamble w/ prefixIdentifiers: true', () => {
|
|
|
|
const root = createRoot({
|
|
|
|
imports: [`helperOne`, `helperTwo`]
|
|
|
|
})
|
|
|
|
const { code } = generate(root, {
|
|
|
|
mode: 'function',
|
|
|
|
prefixIdentifiers: true
|
|
|
|
})
|
|
|
|
expect(code).not.toMatch(`const _Vue = Vue`)
|
|
|
|
expect(code).toMatch(`const { helperOne, helperTwo } = Vue`)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-26 02:13:33 +08:00
|
|
|
test('statements', () => {
|
2019-09-25 03:49:02 +08:00
|
|
|
const root = createRoot({
|
|
|
|
statements: [`const a = 1`, `const b = 2`]
|
|
|
|
})
|
|
|
|
const { code } = generate(root, { mode: 'function' })
|
|
|
|
expect(code).toMatch(`const a = 1\n`)
|
|
|
|
expect(code).toMatch(`const b = 2\n`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-26 02:13:33 +08:00
|
|
|
test('hoists', () => {
|
|
|
|
const root = createRoot({
|
|
|
|
hoists: [
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`hello`, false, mockLoc),
|
2019-09-26 02:13:33 +08:00
|
|
|
createObjectExpression(
|
|
|
|
[
|
|
|
|
createObjectProperty(
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`id`, true, mockLoc),
|
|
|
|
createSimpleExpression(`foo`, true, mockLoc),
|
2019-09-26 02:13:33 +08:00
|
|
|
mockLoc
|
|
|
|
)
|
|
|
|
],
|
|
|
|
mockLoc
|
|
|
|
)
|
|
|
|
]
|
|
|
|
})
|
|
|
|
const { code } = generate(root)
|
|
|
|
expect(code).toMatch(`const _hoisted_1 = hello`)
|
|
|
|
expect(code).toMatch(`const _hoisted_2 = { id: "foo" }`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 03:49:02 +08:00
|
|
|
test('prefixIdentifiers: true should inject _ctx statement', () => {
|
|
|
|
const { code } = generate(createRoot(), { prefixIdentifiers: true })
|
|
|
|
expect(code).toMatch(`const _ctx = this\n`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('static text', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.TEXT,
|
|
|
|
content: 'hello',
|
|
|
|
isEmpty: false,
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`return "hello"`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('interpolation', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
2019-09-27 23:42:02 +08:00
|
|
|
children: [createInterpolation(`hello`, mockLoc)]
|
2019-09-25 03:49:02 +08:00
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(`return _${TO_STRING}(hello)`)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('comment', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.COMMENT,
|
|
|
|
content: 'foo',
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(`return _${CREATE_VNODE}(_${COMMENT}, 0, "foo")`)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('text + comment + interpolation', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.TEXT,
|
|
|
|
content: 'foo',
|
|
|
|
isEmpty: false,
|
|
|
|
loc: mockLoc
|
|
|
|
},
|
2019-09-27 23:42:02 +08:00
|
|
|
createInterpolation(`hello`, mockLoc),
|
2019-09-25 03:49:02 +08:00
|
|
|
{
|
|
|
|
type: NodeTypes.COMMENT,
|
|
|
|
content: 'foo',
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`
|
|
|
|
return [
|
|
|
|
"foo",
|
2019-09-26 07:17:45 +08:00
|
|
|
_${TO_STRING}(hello),
|
|
|
|
_${CREATE_VNODE}(_${COMMENT}, 0, "foo")
|
2019-09-25 03:49:02 +08:00
|
|
|
]`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-26 07:17:45 +08:00
|
|
|
test('text + comment + interpolation w/ prefixIdentifiers: true', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.TEXT,
|
|
|
|
content: 'foo',
|
|
|
|
isEmpty: false,
|
|
|
|
loc: mockLoc
|
|
|
|
},
|
2019-09-27 23:42:02 +08:00
|
|
|
createInterpolation(`hello`, mockLoc),
|
2019-09-26 07:17:45 +08:00
|
|
|
{
|
|
|
|
type: NodeTypes.COMMENT,
|
|
|
|
content: 'foo',
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
prefixIdentifiers: true
|
|
|
|
}
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`
|
|
|
|
return [
|
|
|
|
"foo",
|
|
|
|
${TO_STRING}(hello),
|
|
|
|
${CREATE_VNODE}(${COMMENT}, 0, "foo")
|
|
|
|
]`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 04:35:01 +08:00
|
|
|
test('compound expression', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
2019-09-27 23:42:02 +08:00
|
|
|
createInterpolation(
|
|
|
|
createCompoundExpression(
|
|
|
|
[`_ctx.`, createSimpleExpression(`foo`, false, mockLoc)],
|
|
|
|
mockLoc
|
|
|
|
),
|
|
|
|
mockLoc
|
|
|
|
)
|
2019-09-25 04:35:01 +08:00
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(`return _${TO_STRING}(_ctx.foo)`)
|
2019-09-25 04:35:01 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 03:49:02 +08:00
|
|
|
test('ifNode', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF,
|
|
|
|
loc: mockLoc,
|
|
|
|
branches: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF_BRANCH,
|
2019-09-27 23:42:02 +08:00
|
|
|
condition: createSimpleExpression('foo', false, mockLoc),
|
2019-09-25 03:49:02 +08:00
|
|
|
loc: mockLoc,
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.TEXT,
|
|
|
|
content: 'foo',
|
|
|
|
isEmpty: false,
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF_BRANCH,
|
2019-09-27 23:42:02 +08:00
|
|
|
condition: createSimpleExpression('a + b', false, mockLoc),
|
2019-09-25 03:49:02 +08:00
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
children: [createInterpolation(`bye`, mockLoc)]
|
2019-09-25 03:49:02 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF_BRANCH,
|
|
|
|
condition: undefined,
|
|
|
|
loc: mockLoc,
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.COMMENT,
|
|
|
|
content: 'foo',
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`
|
2019-09-25 10:39:20 +08:00
|
|
|
return foo
|
2019-09-25 03:49:02 +08:00
|
|
|
? "foo"
|
2019-09-25 10:39:20 +08:00
|
|
|
: (a + b)
|
2019-09-26 07:17:45 +08:00
|
|
|
? _${TO_STRING}(bye)
|
|
|
|
: _${CREATE_VNODE}(_${COMMENT}, 0, "foo")`)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 04:35:01 +08:00
|
|
|
test('ifNode with no v-else', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF,
|
|
|
|
loc: mockLoc,
|
|
|
|
branches: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF_BRANCH,
|
2019-09-27 23:42:02 +08:00
|
|
|
condition: createSimpleExpression('foo', false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
loc: mockLoc,
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.TEXT,
|
|
|
|
content: 'foo',
|
|
|
|
isEmpty: false,
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: NodeTypes.IF_BRANCH,
|
2019-09-27 23:42:02 +08:00
|
|
|
condition: createSimpleExpression('a + b', false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
children: [createInterpolation(`bye`, mockLoc)]
|
2019-09-25 04:35:01 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`
|
2019-09-25 10:39:20 +08:00
|
|
|
return foo
|
2019-09-25 04:35:01 +08:00
|
|
|
? "foo"
|
2019-09-25 10:39:20 +08:00
|
|
|
: (a + b)
|
2019-09-26 07:17:45 +08:00
|
|
|
? _${TO_STRING}(bye)
|
2019-09-25 04:35:01 +08:00
|
|
|
: null`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 03:49:02 +08:00
|
|
|
test('forNode', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.FOR,
|
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
source: createSimpleExpression(`list`, false, mockLoc),
|
|
|
|
valueAlias: createSimpleExpression(`v`, false, mockLoc),
|
|
|
|
keyAlias: createSimpleExpression(`k`, false, mockLoc),
|
|
|
|
objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
|
|
|
|
children: [createInterpolation(`v`, mockLoc)]
|
2019-09-25 03:49:02 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(
|
|
|
|
`return _${RENDER_LIST}(list, (v, k, i) => {
|
|
|
|
return _${TO_STRING}(v)
|
|
|
|
})`
|
|
|
|
)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('forNode w/ prefixIdentifiers: true', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.FOR,
|
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
source: createSimpleExpression(`list`, false, mockLoc),
|
|
|
|
valueAlias: createSimpleExpression(`v`, false, mockLoc),
|
|
|
|
keyAlias: createSimpleExpression(`k`, false, mockLoc),
|
|
|
|
objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
|
|
|
|
children: [createInterpolation(`v`, mockLoc)]
|
2019-09-26 07:17:45 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
prefixIdentifiers: true
|
|
|
|
}
|
|
|
|
)
|
|
|
|
expect(code).toMatch(
|
|
|
|
`return ${RENDER_LIST}(list, (v, k, i) => {
|
|
|
|
return ${TO_STRING}(v)
|
|
|
|
})`
|
|
|
|
)
|
2019-09-25 03:49:02 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 04:35:01 +08:00
|
|
|
test('forNode w/ skipped value alias', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.FOR,
|
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
source: createSimpleExpression(`list`, false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
valueAlias: undefined,
|
2019-09-27 23:42:02 +08:00
|
|
|
keyAlias: createSimpleExpression(`k`, false, mockLoc),
|
|
|
|
objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
|
|
|
|
children: [createInterpolation(`v`, mockLoc)]
|
2019-09-25 04:35:01 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(
|
|
|
|
`return _${RENDER_LIST}(list, (__value, k, i) => {
|
|
|
|
return _${TO_STRING}(v)
|
|
|
|
})`
|
|
|
|
)
|
2019-09-25 04:35:01 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('forNode w/ skipped key alias', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.FOR,
|
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
source: createSimpleExpression(`list`, false, mockLoc),
|
|
|
|
valueAlias: createSimpleExpression(`v`, false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
keyAlias: undefined,
|
2019-09-27 23:42:02 +08:00
|
|
|
objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
|
|
|
|
children: [createInterpolation(`v`, mockLoc)]
|
2019-09-25 04:35:01 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(
|
|
|
|
`return _${RENDER_LIST}(list, (v, __key, i) => {
|
|
|
|
return _${TO_STRING}(v)
|
|
|
|
})`
|
|
|
|
)
|
2019-09-25 04:35:01 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
|
|
|
test('forNode w/ skipped value and key aliases', () => {
|
2019-09-25 03:49:02 +08:00
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
2019-09-25 04:35:01 +08:00
|
|
|
type: NodeTypes.FOR,
|
2019-09-25 03:49:02 +08:00
|
|
|
loc: mockLoc,
|
2019-09-27 23:42:02 +08:00
|
|
|
source: createSimpleExpression(`list`, false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
valueAlias: undefined,
|
|
|
|
keyAlias: undefined,
|
2019-09-27 23:42:02 +08:00
|
|
|
objectIndexAlias: createSimpleExpression(`i`, false, mockLoc),
|
|
|
|
children: [createInterpolation(`v`, mockLoc)]
|
2019-09-25 04:35:01 +08:00
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(code).toMatch(
|
|
|
|
`return _${RENDER_LIST}(list, (__value, __key, i) => {
|
|
|
|
return _${TO_STRING}(v)
|
|
|
|
})`
|
|
|
|
)
|
2019-09-25 04:35:01 +08:00
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-29 01:12:41 +08:00
|
|
|
test('SlotFunctionExpression', () => {
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.ELEMENT,
|
|
|
|
tagType: ElementTypes.COMPONENT,
|
|
|
|
ns: Namespaces.HTML,
|
|
|
|
isSelfClosing: false,
|
|
|
|
tag: `Comp`,
|
|
|
|
loc: mockLoc,
|
|
|
|
props: [],
|
|
|
|
children: [],
|
|
|
|
codegenNode: {
|
|
|
|
type: NodeTypes.JS_CALL_EXPRESSION,
|
|
|
|
loc: mockLoc,
|
|
|
|
callee: `_${CREATE_VNODE}`,
|
|
|
|
arguments: [
|
|
|
|
`Comp`,
|
|
|
|
`0`,
|
|
|
|
{
|
|
|
|
type: NodeTypes.JS_OBJECT_EXPRESSION,
|
|
|
|
loc: mockLoc,
|
|
|
|
properties: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.JS_PROPERTY,
|
|
|
|
loc: mockLoc,
|
|
|
|
key: {
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: true,
|
|
|
|
content: `default`,
|
|
|
|
loc: mockLoc
|
|
|
|
},
|
|
|
|
value: {
|
|
|
|
type: NodeTypes.JS_SLOT_FUNCTION,
|
|
|
|
loc: mockLoc,
|
|
|
|
params: {
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: false,
|
|
|
|
content: `{ foo }`,
|
|
|
|
loc: mockLoc
|
|
|
|
},
|
|
|
|
returns: [
|
|
|
|
{
|
|
|
|
type: NodeTypes.INTERPOLATION,
|
|
|
|
loc: mockLoc,
|
|
|
|
content: {
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: false,
|
|
|
|
content: `foo`,
|
|
|
|
loc: mockLoc
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(
|
|
|
|
`return _createVNode(Comp, 0, {
|
|
|
|
default: ({ foo }) => [
|
|
|
|
_toString(foo)
|
|
|
|
]
|
|
|
|
})`
|
|
|
|
)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
|
|
|
|
2019-09-25 04:35:01 +08:00
|
|
|
test('callExpression + objectExpression + arrayExpression', () => {
|
|
|
|
function createElementWithCodegen(
|
|
|
|
args: CallExpression['arguments']
|
|
|
|
): ElementNode {
|
|
|
|
return {
|
|
|
|
type: NodeTypes.ELEMENT,
|
|
|
|
loc: mockLoc,
|
|
|
|
ns: Namespaces.HTML,
|
|
|
|
tag: 'div',
|
|
|
|
tagType: ElementTypes.ELEMENT,
|
|
|
|
isSelfClosing: false,
|
|
|
|
props: [],
|
|
|
|
children: [],
|
|
|
|
codegenNode: {
|
|
|
|
type: NodeTypes.JS_CALL_EXPRESSION,
|
|
|
|
loc: mockLoc,
|
|
|
|
callee: CREATE_VNODE,
|
|
|
|
arguments: args
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const { code } = generate(
|
|
|
|
createRoot({
|
|
|
|
children: [
|
|
|
|
createElementWithCodegen([
|
|
|
|
// string
|
|
|
|
`"div"`,
|
|
|
|
// ObjectExpression
|
|
|
|
createObjectExpression(
|
|
|
|
[
|
|
|
|
createObjectProperty(
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`id`, true, mockLoc),
|
|
|
|
createSimpleExpression(`foo`, true, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
mockLoc
|
|
|
|
),
|
|
|
|
createObjectProperty(
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`prop`, false, mockLoc),
|
|
|
|
createSimpleExpression(`bar`, false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
mockLoc
|
|
|
|
),
|
|
|
|
// compound expression as computed key
|
|
|
|
createObjectProperty(
|
|
|
|
{
|
2019-09-27 23:42:02 +08:00
|
|
|
type: NodeTypes.COMPOUND_EXPRESSION,
|
2019-09-25 04:35:01 +08:00
|
|
|
loc: mockLoc,
|
|
|
|
children: [
|
|
|
|
`foo + `,
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`bar`, false, mockLoc)
|
2019-09-25 04:35:01 +08:00
|
|
|
]
|
|
|
|
},
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`bar`, false, mockLoc),
|
2019-09-25 04:35:01 +08:00
|
|
|
mockLoc
|
|
|
|
)
|
|
|
|
],
|
|
|
|
mockLoc
|
|
|
|
),
|
|
|
|
// ChildNode[]
|
|
|
|
[
|
|
|
|
createElementWithCodegen([
|
|
|
|
`"p"`,
|
2019-09-25 03:49:02 +08:00
|
|
|
createObjectExpression(
|
|
|
|
[
|
|
|
|
createObjectProperty(
|
2019-09-25 04:35:01 +08:00
|
|
|
// should quote the key!
|
2019-09-27 23:42:02 +08:00
|
|
|
createSimpleExpression(`some-key`, true, mockLoc),
|
|
|
|
createSimpleExpression(`foo`, true, mockLoc),
|
2019-09-25 03:49:02 +08:00
|
|
|
mockLoc
|
|
|
|
)
|
|
|
|
],
|
|
|
|
mockLoc
|
|
|
|
)
|
2019-09-25 04:35:01 +08:00
|
|
|
])
|
|
|
|
],
|
|
|
|
// ArrayExpression
|
|
|
|
createArrayExpression(
|
|
|
|
[
|
|
|
|
'foo',
|
|
|
|
{
|
|
|
|
type: NodeTypes.JS_CALL_EXPRESSION,
|
|
|
|
loc: mockLoc,
|
|
|
|
callee: CREATE_VNODE,
|
|
|
|
arguments: [`"p"`]
|
|
|
|
}
|
|
|
|
],
|
|
|
|
mockLoc
|
|
|
|
)
|
|
|
|
])
|
2019-09-25 03:49:02 +08:00
|
|
|
]
|
|
|
|
})
|
|
|
|
)
|
|
|
|
expect(code).toMatch(`
|
|
|
|
return ${CREATE_VNODE}("div", {
|
|
|
|
id: "foo",
|
2019-09-25 04:35:01 +08:00
|
|
|
[prop]: bar,
|
|
|
|
[foo + bar]: bar
|
2019-09-28 12:19:24 +08:00
|
|
|
}, [
|
|
|
|
${CREATE_VNODE}("p", { "some-key": "foo" })
|
|
|
|
], [
|
2019-09-25 03:49:02 +08:00
|
|
|
foo,
|
|
|
|
${CREATE_VNODE}("p")
|
|
|
|
])`)
|
|
|
|
expect(code).toMatchSnapshot()
|
|
|
|
})
|
2019-09-20 11:05:51 +08:00
|
|
|
})
|