build.utils.js
3.79 KB
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
const path = require('path')
const fs = require('fs')
const resolve = (dir) => path.join(__dirname, '../', dir)
const packageJson = require('../package')
const join = path.join
const webpack = require('webpack')
const WebpackMerge = require('webpack-merge')
/**
* 转为驼峰命名
* @author 韦胜健
* @date 2018/11/19
*/
function camelCase(name) {
const SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g;
const MOZ_HACK_REGEXP = /^moz([A-Z])/;
return name
.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) {
return offset ? letter.toUpperCase() : letter;
})
.replace(MOZ_HACK_REGEXP, 'Moz$1');
}
const entryName = (() => {
let name = packageJson.name
let separatorIndex = name.indexOf('/')
if (separatorIndex > -1) {
name = name.substring(separatorIndex + 1)
}
return name
})();
module.exports = {
// 当前是否为生产模式
isProduction: process.env.NODE_ENV === 'production',
// 包名
packageName: packageJson.name,
// 打包主入口文件名
entryName,
// 打包暴露对象名称
libraryName: (() => {
let name = camelCase(entryName)
name = name.charAt(0).toUpperCase() + name.substring(1)
return name
})(),
// 版本
version: packageJson.version,
webpack,
WebpackMerge,
resolve,
join,
camelCase,
argv: (() => {
const args = process.argv.slice(2)
return args.reduce((ret, item) => {
if (item.indexOf('=') > -1) {
const [key, value] = item.split('=')
ret[key] = value
} else if (item.indexOf('--') > -1) {
const key = item.replace('--', '')
ret[key] = true
}
return ret
}, {})
})(),
isExist(path) {
try {
return fs.statSync(path)
} catch (e) {
return null
}
},
checkEntries(path) {
let files = fs.readdirSync(resolve(path));
files.forEach((item) => {
let itemPath = join(path, item)
let isDir = fs.statSync(itemPath).isDirectory();
if (isDir) {
let p;
p = resolve(join(itemPath, 'index.js'))
if (!!this.isExist(p)) {
return
}
p = resolve(join(itemPath, 'index.ts'))
if (!!this.isExist(p)) {
return
}
p = resolve(join(itemPath, 'index.tsx'))
if (!!this.isExist(p)) {
return
}
console.log(`create index file:` + p)
fs.writeFileSync(join(itemPath, 'index.js'), `
import component from './pl-${item}.vue'
import {plugin} from "../../utils";
export default plugin(component)
`.trim())
}
})
},
getEntries(path) {
let files = fs.readdirSync(resolve(path));
const componentEntries = files.reduce((ret, item) => {
let itemPath = join(path, item)
let isDir = fs.statSync(itemPath).isDirectory();
if (isDir) {
let p;
p = resolve(join(itemPath, 'index.js'))
if (!!this.isExist(p)) {
ret[item] = p
}
p = resolve(join(itemPath, 'index.ts'))
if (!!this.isExist(p)) {
ret[item] = p
}
p = resolve(join(itemPath, 'index.tsx'))
if (!!this.isExist(p)) {
ret[item] = p
}
} else {
const [name] = item.split('.')
ret[name] = resolve(`${itemPath}`)
}
return ret
}, {})
return componentEntries
},
}