Skip to content

Commit e0b67ba

Browse files
committed
Add snapshot testst and various fixes
1 parent 8ebddbf commit e0b67ba

File tree

5 files changed

+844
-613
lines changed

5 files changed

+844
-613
lines changed

packages/babel-sugar-event/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
},
3636
"dependencies": {
3737
"@babel/plugin-syntax-jsx": "^7.0.0-beta.49",
38-
"@vuejs/babel-helper-vue-jsx-merge-props": "^0.1.0",
39-
"@vuejs/babel-plugin-transform-vue-jsx": "^0.1.0",
4038
"camelcase": "^5.0.0"
4139
},
4240
"nyc": {

packages/babel-sugar-event/src/index.js

Lines changed: 87 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const cachedCamelCase = (() => {
1212
}
1313
})()
1414
const equalCamel = (string, match) => string === match || string === cachedCamelCase(match)
15-
const startsWithCamel = (string, match) => string.startsWith(match) || string.startsWith(cachedCamelCase(match))
15+
1616
const keyModifiers = ['ctrl', 'shift', 'alt', 'meta']
1717
const keyCodes = {
1818
esc: 27,
@@ -40,43 +40,39 @@ const keyNames = {
4040
delete: ['Backspace', 'Delete'],
4141
}
4242

43-
export default function (babel) {
43+
export default function(babel) {
4444
const t = babel.types
4545

4646
function genGuard(expression) {
47-
return t.ifStatement(expression, t.returnStatement(t.nullStatement()))
47+
return t.ifStatement(expression, t.returnStatement(t.nullLiteral()))
4848
}
4949

5050
function genCallExpression(expression, args = []) {
5151
return t.callExpression(expression, args)
5252
}
5353

54-
function genCallExpressionWithEvent(expression) {
55-
return genCallExpression(expression, [t.identifier('$event')])
56-
}
57-
5854
function genEventExpression(name) {
5955
return t.memberExpression(t.identifier('$event'), t.identifier(name))
6056
}
6157

6258
function not(expression) {
63-
return t.unaryStatement('!', expression)
59+
return t.unaryExpression('!', expression)
6460
}
6561

6662
function notEq(left, right) {
67-
return t.binaryStatement(left, '!==', right)
63+
return t.binaryExpression('!==', left, right)
6864
}
6965

7066
function and(left, right) {
71-
return t.binaryStatement(left, '&&', right)
67+
return t.logicalExpression('&&', left, right)
7268
}
7369

74-
function and(left, right) {
75-
return t.binaryStatement(left, '||', right)
70+
function or(left, right) {
71+
return t.logicalExpression('||', left, right)
7672
}
7773

7874
function hasButton() {
79-
return t.binaryStatement(t.stringLiteral('button'), 'in', t.identifier('$event'))
75+
return t.binaryExpression('in', t.stringLiteral('button'), t.identifier('$event'))
8076
}
8177

8278
const modifierCode = {
@@ -95,36 +91,36 @@ export default function (babel) {
9591
// meta: genGuard(`!$event.metaKey`),
9692
meta: () => genGuard(not(genEventExpression('metaKey'))),
9793
// left: genGuard(`'button' in $event && $event.button !== 0`),
98-
left: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numberLiteral(0)))),
94+
left: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numericLiteral(0)))),
9995
// middle: genGuard(`'button' in $event && $event.button !== 1`),
100-
middle: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numberLiteral(1)))),
96+
middle: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numericLiteral(1)))),
10197
// right: genGuard(`'button' in $event && $event.button !== 2`)
102-
right: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numberLiteral(2)))),
98+
right: () => genGuard(and(hasButton(), notEq(genEventExpression('button'), t.numericLiteral(2)))),
10399
}
104100

105101
function genHandlerFunction(body) {
106-
return t.functionExpression([t.identifier('$event')], t.blockStatement(body instanceof Array ? body : [body]))
102+
return t.arrowFunctionExpression([t.identifier('$event')], t.blockStatement(body instanceof Array ? body : [body]))
107103
}
108104

109105
/**
110106
* @param {Path<JSXAttribute>} handlerPath
111107
*/
112108
function parse(handlerPath) {
113109
const namePath = handlerPath.get('name')
114-
let name = t.isJSXNamespacedName(namePath) ?
115-
`${namePath.get('namespace.name').node}:${namePath.get('name.name').node}` :
116-
namePath.get('name').node
110+
let name = t.isJSXNamespacedName(namePath)
111+
? `${namePath.get('namespace.name').node}:${namePath.get('name.name').node}`
112+
: namePath.get('name').node
117113

118114
const normalizedName = camelCase(name)
119115

120116
let modifiers
121-
let argument;
122-
[name, ...modifiers] = name.split('_');
123-
[name, argument] = name.split(':')
117+
let argument
118+
;[name, ...modifiers] = name.split('_')
119+
;[name, argument] = name.split(':')
124120

125121
if (!equalCamel(name, 'v-on') || !argument) {
126122
return {
127-
isInvalid: false
123+
isInvalid: false,
128124
}
129125
}
130126

@@ -145,23 +141,16 @@ export default function (babel) {
145141
* @param {Path<JSXAttribute>} handlerPath
146142
*/
147143
function genHandler(handlerPath) {
148-
const {
149-
modifiers,
150-
isInvalid,
151-
expression,
152-
event
153-
} = parse(handlerPath)
144+
let { modifiers, isInvalid, expression, event } = parse(handlerPath)
145+
let isNative = false
154146

155147
if (isInvalid) return
156148

157-
const isFunctionExpression = t.isArrowFunctionExpression(expression) || t.isFunctionExpression(expression)
158-
159-
if (!isFunctionExpression) throw new Error('Only function expression is supported with v-on.')
160-
161-
if (!modifiers) {
149+
if (!modifiers || modifiers.length === 0) {
162150
return {
163151
event,
164-
expression
152+
expression,
153+
isNative,
165154
}
166155
}
167156

@@ -171,20 +160,28 @@ export default function (babel) {
171160

172161
for (const key of modifiers) {
173162
if (modifierCode[key]) {
174-
genModifierCode.push(modifierCode[key]())
175-
163+
const modifierStatement = modifierCode[key]()
164+
genModifierCode.push(
165+
t.isExpression(modifierStatement) ? t.expressionStatement(modifierStatement) : modifierStatement,
166+
)
176167
if (keyCodes[key]) {
177168
keys.push(key)
178169
}
179170
} else if (key === 'exact') {
180171
genModifierCode.push(
181172
genGuard(
182173
keyModifiers
183-
.filter(keyModifier => !modifiers.includes(keyModifier))
184-
.map(keyModifier => genEventExpression(keyModifier + 'Key'))
185-
.reduce((acc, item) => acc ? or(acc, item) : item),
174+
.filter(keyModifier => !modifiers.includes(keyModifier))
175+
.map(keyModifier => genEventExpression(keyModifier + 'Key'))
176+
.reduce((acc, item) => (acc ? or(acc, item) : item)),
186177
),
187178
)
179+
} else if (key === 'capture') {
180+
event = '!' + event
181+
} else if (key === 'once') {
182+
event = '~' + event
183+
} else if (key === 'native') {
184+
isNative = true
188185
} else {
189186
keys.push(key)
190187
}
@@ -195,16 +192,23 @@ export default function (babel) {
195192
}
196193

197194
if (genModifierCode.length) {
198-
code.concat(genModifierCode)
195+
code.push(...genModifierCode)
199196
}
200197

201-
code.push(
202-
t.returnStatement(genCallExpression(expression, [t.identifier('$event')]))
203-
)
198+
if (code.length === 0) {
199+
return {
200+
event,
201+
expression,
202+
isNative,
203+
}
204+
}
205+
206+
code.push(t.returnStatement(genCallExpression(expression, [t.identifier('$event')])))
204207

205208
return {
206209
event,
207-
expression: genHandlerFunction(code)
210+
expression: genHandlerFunction(code),
211+
isNative,
208212
}
209213
}
210214

@@ -216,7 +220,7 @@ export default function (babel) {
216220
const keyVal = parseInt(key, 10)
217221

218222
if (keyVal) {
219-
return notEq(genEventExpression('keyCode'), t.numberLiteral(keyVal))
223+
return notEq(genEventExpression('keyCode'), t.numericLiteral(keyVal))
220224
}
221225

222226
const keyCode = keyCodes[key]
@@ -225,40 +229,58 @@ export default function (babel) {
225229
return t.callExpression(t.memberExpression(t.thisExpression(), t.identifier('_k')), [
226230
genEventExpression('keyCode'),
227231
t.stringLiteral(`${key}`),
228-
t.stringLiteral(`${keyCode}`),
232+
keyCode
233+
? Array.isArray(keyCode)
234+
? t.arrayExpression(keyCode.map(number => t.numericLiteral(number)))
235+
: t.numericLiteral(keyCode)
236+
: t.identifier('undefined'),
229237
genEventExpression('key'),
230-
t.stringLiteral(`${keyName}`),
238+
keyName
239+
? Array.isArray(keyName)
240+
? t.arrayExpression(keyName.map(number => t.stringLiteral(number)))
241+
: t.stringLiteral(`${keyName}`)
242+
: t.identifier('undefined'),
231243
])
232244
}
233245

246+
function addEvent(event, expression, isNative, attributes) {
247+
if (event[0] !== '~' && event[0] !== '!') {
248+
attributes.push(
249+
t.jSXAttribute(
250+
t.jSXIdentifier(`${isNative ? 'nativeOn' : 'on'}-${event}`),
251+
t.jSXExpressionContainer(expression),
252+
),
253+
)
254+
} else {
255+
attributes.push(
256+
t.jSXSpreadAttribute(
257+
t.objectExpression([
258+
t.objectProperty(
259+
t.identifier('on'),
260+
t.objectExpression([t.objectProperty(t.stringLiteral(event), expression)]),
261+
),
262+
]),
263+
),
264+
)
265+
}
266+
}
267+
234268
return {
235269
inherits: syntaxJsx,
236270
visitor: {
237271
Program(path) {
238272
path.traverse({
239273
JSXAttribute(path) {
240-
const {
241-
event,
242-
expression
243-
} = genHandler(path)
274+
const { event, expression, isNative } = genHandler(path)
244275

245276
if (event) {
246277
path.remove()
247-
const tag = path.parentPath.get('name.name')
248-
const isNative = tag[0] < 'A' || 'Z' < tag[1]
249-
250-
path.parentPath.node.attributes.push(
251-
t.jSXAttribute(
252-
t.jSXNamespacedName(
253-
t.jSXIdentifier(isNative ? 'v-native-on' : 'v-on'), t.jSXIdentifier(event)
254-
),
255-
t.jSXExpressionContainer(expression)
256-
)
257-
)
278+
279+
addEvent(event, expression, isNative, path.parentPath.node.attributes)
258280
}
259281
},
260282
})
261283
},
262284
},
263285
}
264-
}
286+
}

0 commit comments

Comments
 (0)