-
Notifications
You must be signed in to change notification settings - Fork 98
/
Copy pathtest.js
142 lines (136 loc) · 3.26 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import test from 'ava'
import { transform } from '@babel/core'
import plugin from '../dist/plugin.testing'
import jsxPlugin from '../../babel-plugin-transform-vue-jsx/dist/plugin.testing'
const transpile = src =>
new Promise((resolve, reject) => {
transform(
src,
{
plugins: [plugin],
},
(err, result) => {
if (err) {
return reject(err)
}
resolve(result.code)
},
)
})
const transpileWithJSXPlugin = src =>
new Promise((resolve, reject) => {
transform(
src,
{
plugins: [plugin, jsxPlugin],
},
(err, result) => {
if (err) {
return reject(err)
}
resolve(result.code)
},
)
})
const tests = [
{
name: 'Generic functional component',
from: `export const A = ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`,
to: `export const A = {
functional: true,
render: (h, {
props,
listeners
}) => <div onClick={listeners.click}>{props.msg}</div>
};`,
},
{
name: 'Default export functional component',
from: `export default ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`,
to: `export default {
functional: true,
render: (h, {
props,
listeners
}) => <div onClick={listeners.click}>{props.msg}</div>
};`,
},
{
name: 'Named functional component in DevMode',
NODE_ENV: 'development',
from: `export const A = ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`,
to: `export const A = {
name: "A",
functional: true,
render: (h, {
props,
listeners
}) => <div onClick={listeners.click}>{props.msg}</div>
};`,
},
{
name: 'Lowercase should not compile',
from: `export const a = ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`,
to: `export const a = ({
props,
listeners
}) => <div onClick={listeners.click}>{props.msg}</div>;`,
},
{
name: 'Wrapper does not compile',
from: `const Wrapped = () => wrap({
render() {
return <div></div>
}
})`,
to: `const Wrapped = () => wrap({
render() {
return <div></div>;
}
});`,
},
{
name: 'Default export',
from: `export default ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`,
to: `export default {
functional: true,
render: (h, {
props,
listeners
}) => <div onClick={listeners.click}>{props.msg}</div>
};`,
},
{
name: 'Ignore non-arrow function',
from: `const a = 2; export default 3`,
to: `const a = 2;
export default 3;`,
},
]
tests.map(({ name, from, to, NODE_ENV }) => {
test.serial(name, async t => {
const nodeEnvCopy = process.env.NODE_ENV
if (NODE_ENV) {
process.env.NODE_ENV = NODE_ENV
}
t.is(await transpile(from), to)
if (NODE_ENV) {
process.env.NODE_ENV = nodeEnvCopy
}
})
})
test('Should work with JSX plugin enabled', async t => {
const from = `export const A = ({ props, listeners }) => <div onClick={listeners.click}>{props.msg}</div>`
const to = `export const A = {
functional: true,
render: (h, {
props,
listeners
}) => h("div", {
"on": {
"click": listeners.click
}
}, [props.msg])
};`
t.is(await(transpileWithJSXPlugin(from)), to)
})