UNPKG

2.35 kBJavaScriptView Raw
1const output = require('./output')
2
3function formatError(error) {
4 if (error.name === 'ModuleNotFoundError' && error.message.indexOf('Can\'t resolve') >= 0) {
5 const [, name] = /Can't resolve '([^']+)'/.exec(error.message)
6 return {
7 type: 'module-not-found',
8 payload: name,
9 error
10 }
11 }
12
13 if (error.name === 'ModuleBuildError' && error.message.indexOf('Cannot find module') >= 0) {
14 const [, name] = /Cannot find module '([^']+)'/.exec(error.message)
15 return {
16 type: 'module-not-found',
17 payload: name,
18 error
19 }
20 }
21
22 if (error.name === 'ModuleBuildError' && error.message.indexOf('ReferenceError: Unknown plugin') >= 0 && error.message.indexOf('babel-core') >= 0) {
23 const [, name, location] = /Unknown plugin "([^"]+)" specified in "([^"]+)"/.exec(error.message)
24 return {
25 type: 'babel-plugin-not-found',
26 payload: {
27 name,
28 location
29 },
30 error
31 }
32 }
33
34 if (error.name === 'ModuleBuildError' && error.message.indexOf(`Error: Couldn't find preset`) >= 0 && error.message.indexOf('babel-core') >= 0) {
35 const [, name, location] = /Couldn't find preset "([^"]+)" relative to directory "([^"]+)"/.exec(error.message)
36 return {
37 type: 'babel-preset-not-found',
38 payload: {
39 name,
40 location
41 },
42 error
43 }
44 }
45
46 if (error.stack && error.stack.indexOf('eslint-loader') >= 0) {
47 return {
48 type: 'eslint-error',
49 error
50 }
51 }
52
53 if (/Vue packages version mismatch/.test(error.message)) {
54 return {
55 type: 'vue-version-mismatch',
56 error
57 }
58 }
59
60 if (cannotUglifyES6(error.message)) {
61 const { kind, payload } = getModuleNameFromPath(error.message)
62 return {
63 type: 'uglify-error',
64 payload,
65 kind,
66 error
67 }
68 }
69
70 return {
71 type: 'unknown',
72 error
73 }
74}
75
76function cannotUglifyES6(message) {
77 return /from UglifyJs/.test(message) &&
78 /Unexpected token:/.test(message)
79}
80
81function getModuleNameFromPath(str) {
82 const matchModule = /[/\\]node_modules[/\\]([^/\\]+)/.exec(str)
83 if (matchModule) return { kind: 'module', payload: matchModule[1] }
84
85 const matchFile = /\[([^:]+):[^\]]+\]/.exec(str)
86 if (matchFile) return { kind: 'file', payload: matchFile[1] }
87}
88
89module.exports = errors => {
90 errors = errors.map(formatError)
91 output(errors)
92}