diff --git a/packages/parser/src/shared/utils.ts b/packages/parser/src/shared/utils.ts index 6e0782006..b24ea32d0 100644 --- a/packages/parser/src/shared/utils.ts +++ b/packages/parser/src/shared/utils.ts @@ -32,8 +32,10 @@ export function traverseAST( } export function generateCode(node: Node) { + if (!node) return ''; try { const func = (generate as any).default || generate; + const generated = func(node, { comments: false, concise: true, diff --git a/packages/parser/src/vue/scripts.ts b/packages/parser/src/vue/scripts.ts index c1e4aacfc..128c245c2 100644 --- a/packages/parser/src/vue/scripts.ts +++ b/packages/parser/src/vue/scripts.ts @@ -196,10 +196,24 @@ function getState(block: BlockStatement) { if (!stateExpression) return {}; const state: BlockState = {}; for (const item of stateExpression.properties) { - const { key, value } = item as ObjectProperty; - if (key.type === 'Identifier') { - const code = generateCode(value); - state[key.name] = getJSExpression(code); + if (item.type === 'ObjectProperty') { + const { key, value } = item as ObjectProperty; + if (key.type === 'Identifier') { + const code = generateCode(value); + state[key.name] = getJSExpression(code); + } + } else if (item.type === 'ObjectMethod') { + const { key, params, body } = item as ObjectMethod; + if (key.type === 'Identifier') { + const bodyCode = generateCode(body); + const paramsCode = params + .map((n) => { + return (n as any).name || 'none'; + }) + .join(','); + const code = `(${paramsCode}) => ${bodyCode}`; + state[key.name] = getJSExpression(code); + } } } return state; diff --git a/packages/parser/tests/sources/test_27.ts b/packages/parser/tests/sources/test_27.ts index 07fac67b7..eafbfce28 100644 --- a/packages/parser/tests/sources/test_27.ts +++ b/packages/parser/tests/sources/test_27.ts @@ -1,48 +1,36 @@ export const test_27 = `