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

chore(mp): improve error messages

上级 d299f87a
const path = require('path')
const t = require('@babel/types')
const babelTraverse = require('@babel/traverse').default
const { parseComponents } = require('./util')
const {
normalizePath
} = require('@dcloudio/uni-cli-shared')
const {
parseComponents
} = require('./util')
const uniI18n = require('@dcloudio/uni-cli-i18n')
module.exports = function (ast, state = {}) {
const imports = []
let nodePath = false
babelTraverse(ast, {
CallExpression (path) {
const callee = path.node.callee
if (!callee.object || !callee.property) {
return
}
const objectName = callee.object.name
const propertyName = callee.property.name
if (
propertyName === 'component' &&
(objectName === 'Vue' || objectName === 'app')
) {
const args = path.node.arguments
const nameNode = args[0]
const valueNode = args[1]
nodePath = path
if (!t.isStringLiteral(nameNode)) {
throw new Error(
uniI18n.__('mpLoader.firstParameterNeedStaticString', {
0: objectName + '.component()'
})
)
try {
babelTraverse(ast, {
CallExpression (path) {
const callee = path.node.callee
if (!callee.object || !callee.property) {
return
}
if (!t.isIdentifier(valueNode)) {
throw new Error(
uniI18n.__('mpLoader.requireTwoParameter', {
0: objectName + '.component()'
})
)
const objectName = callee.object.name
const propertyName = callee.property.name
if (
propertyName === 'component' &&
(objectName === 'Vue' || objectName === 'app')
) {
const args = path.node.arguments
const nameNode = args[0]
const valueNode = args[1]
nodePath = path
if (!t.isStringLiteral(nameNode)) {
throw new Error(
uniI18n.__('mpLoader.firstParameterNeedStaticString', {
0: objectName + '.component()'
})
)
}
if (!t.isIdentifier(valueNode)) {
throw new Error(
uniI18n.__('mpLoader.requireTwoParameter', {
0: objectName + '.component()'
})
)
}
imports.push({
name: nameNode.value,
value: valueNode.name
})
}
imports.push({
name: nameNode.value,
value: valueNode.name
})
}
})
if (imports.length) {
state.components = parseComponents(imports, nodePath)
} else {
state.components = []
}
} catch (e) {
if (state.filename) {
console.error('at ' + normalizePath(path.relative(process.env.UNI_INPUT_DIR, state.filename)) + ':1')
}
})
if (imports.length) {
state.components = parseComponents(imports, nodePath)
} else {
state.components = []
throw e
}
return {
ast,
state
}
}
}
const path = require('path')
const t = require('@babel/types')
const babelTraverse = require('@babel/traverse').default
const {
normalizePath
} = require('@dcloudio/uni-cli-shared')
const {
parseComponents
} = require('./util')
......@@ -107,77 +110,85 @@ module.exports = function (ast, state = {
components: [],
options: {}
}) {
babelTraverse(ast, {
CallExpression (path) {
const callee = path.node.callee
const args = path.node.arguments
const objExpr = args[0]
if (
t.isIdentifier(callee) &&
callee.name === 'defineComponent' &&
args.length === 1 &&
t.isObjectExpression(objExpr)
) {
handleObjectExpression(objExpr, path, state)
}
},
AssignmentExpression (path) {
const leftExpression = path.node.left
const rightExpression = path.node.right
try {
babelTraverse(ast, {
CallExpression (path) {
const callee = path.node.callee
const args = path.node.arguments
const objExpr = args[0]
if (
t.isIdentifier(callee) &&
callee.name === 'defineComponent' &&
args.length === 1 &&
t.isObjectExpression(objExpr)
) {
handleObjectExpression(objExpr, path, state)
}
},
AssignmentExpression (path) {
const leftExpression = path.node.left
const rightExpression = path.node.right
if ( // global['__wxVueOptions'] = {'van-button':VanButton}
t.isMemberExpression(leftExpression) &&
t.isObjectExpression(rightExpression) &&
leftExpression.object.name === 'global' &&
leftExpression.property.value === '__wxVueOptions'
) {
handleObjectExpression(rightExpression, path, state)
}
if ( // global['__wxVueOptions'] = {'van-button':VanButton}
t.isMemberExpression(leftExpression) &&
t.isObjectExpression(rightExpression) &&
leftExpression.object.name === 'global' &&
leftExpression.property.value === '__wxVueOptions'
) {
handleObjectExpression(rightExpression, path, state)
}
if ( // exports.default.components = Object.assign({'van-button': VanButton}, exports.default.components || {})
t.isMemberExpression(leftExpression) &&
t.isCallExpression(rightExpression) &&
leftExpression.property.name === 'components' &&
t.isMemberExpression(leftExpression.object) &&
leftExpression.object.object.name === 'exports' &&
leftExpression.object.property.name === 'default' &&
rightExpression.arguments.length === 2 &&
t.isObjectExpression(rightExpression.arguments[0])
) {
handleComponentsObjectExpression(rightExpression.arguments[0], path, state, true)
}
},
ExportDefaultDeclaration (path) {
const declaration = path.node.declaration
if (t.isObjectExpression(declaration)) { // export default {components:{}}
handleObjectExpression(declaration, path, state)
} else if (t.isIdentifier(declaration)) {
handleIdentifier(declaration, path, state)
} else if (t.isCallExpression(declaration) &&
t.isMemberExpression(declaration.callee) &&
declaration.arguments.length === 1) { // export default Vue.extend({components:{}})
if (declaration.callee.object.name === 'Vue' && declaration.callee.property.name ===
'extend') {
const argument = declaration.arguments[0]
if (t.isObjectExpression(argument)) {
handleObjectExpression(argument, path, state)
} else if (t.isIdentifier(argument)) {
handleIdentifier(argument, path, state)
}
if ( // exports.default.components = Object.assign({'van-button': VanButton}, exports.default.components || {})
t.isMemberExpression(leftExpression) &&
t.isCallExpression(rightExpression) &&
leftExpression.property.name === 'components' &&
t.isMemberExpression(leftExpression.object) &&
leftExpression.object.object.name === 'exports' &&
leftExpression.object.property.name === 'default' &&
rightExpression.arguments.length === 2 &&
t.isObjectExpression(rightExpression.arguments[0])
) {
handleComponentsObjectExpression(rightExpression.arguments[0], path, state, true)
}
} else if (t.isClassDeclaration(declaration) &&
declaration.decorators &&
declaration.decorators.length) { // export default @Component({components:{}}) class MyComponent extend Vue
const componentDecorator = declaration.decorators[0]
if (t.isCallExpression(componentDecorator.expression)) {
const args = componentDecorator.expression.arguments
if (args && args.length && t.isObjectExpression(args[0])) {
handleObjectExpression(args[0], path, state)
},
ExportDefaultDeclaration (path) {
const declaration = path.node.declaration
if (t.isObjectExpression(declaration)) { // export default {components:{}}
handleObjectExpression(declaration, path, state)
} else if (t.isIdentifier(declaration)) {
handleIdentifier(declaration, path, state)
} else if (t.isCallExpression(declaration) &&
t.isMemberExpression(declaration.callee) &&
declaration.arguments.length === 1) { // export default Vue.extend({components:{}})
if (declaration.callee.object.name === 'Vue' && declaration.callee.property.name ===
'extend') {
const argument = declaration.arguments[0]
if (t.isObjectExpression(argument)) {
handleObjectExpression(argument, path, state)
} else if (t.isIdentifier(argument)) {
handleIdentifier(argument, path, state)
}
}
} else if (t.isClassDeclaration(declaration) &&
declaration.decorators &&
declaration.decorators.length
) { // export default @Component({components:{}}) class MyComponent extend Vue
const componentDecorator = declaration.decorators[0]
if (t.isCallExpression(componentDecorator.expression)) {
const args = componentDecorator.expression.arguments
if (args && args.length && t.isObjectExpression(args[0])) {
handleObjectExpression(args[0], path, state)
}
}
}
}
})
} catch (e) {
if (state.filename) {
console.error('at ' + normalizePath(path.relative(process.env.UNI_INPUT_DIR, state.filename)) + ':1')
}
})
throw e
}
return {
ast,
state
......
......@@ -92,12 +92,15 @@ createPage(Page)
components
}
} = traverse(parser.parse(content, getBabelParserOptions()), {
filename: this.resourcePath,
components: []
})
const babelLoader = findBabelLoader(this.loaders)
if (!babelLoader) {
throw new Error(uniI18n.__('mpLoader.findFail', { 0: 'babel-loader' }))
throw new Error(uniI18n.__('mpLoader.findFail', {
0: 'babel-loader'
}))
} else {
addCreateApp(babelLoader)
}
......@@ -144,4 +147,4 @@ createPage(Page)
callback(err, content, map)
})
}
}
}
......@@ -83,7 +83,8 @@ module.exports = function (content, map) {
}
} = traverse(parser.parse(content, getBabelParserOptions()), {
type,
components: []
components: [],
filename: this.resourcePath
})
const callback = this.async()
......@@ -126,7 +127,9 @@ module.exports = function (content, map) {
const babelLoader = findBabelLoader(this.loaders)
if (!babelLoader) {
callback(new Error(uniI18n.__('mpLoader.findFail', { 0: 'babel-loader' })), content)
callback(new Error(uniI18n.__('mpLoader.findFail', {
0: 'babel-loader'
})), content)
} else {
addDynamicImport(babelLoader, resourcePath, dynamicImports)
......@@ -136,4 +139,4 @@ module.exports = function (content, map) {
}, err => {
callback(err, content, map)
})
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册