forked from DTStack/dt-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgulpfile.ts
130 lines (115 loc) · 3.95 KB
/
gulpfile.ts
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
129
130
import { series } from 'gulp';
import path from 'path';
import fse from 'fs-extra';
import chalk from 'chalk';
import { rollup } from 'rollup';
import {
Extractor,
ExtractorConfig,
ExtractorResult,
} from '@microsoft/api-extractor';
import conventionalChangelog from 'conventional-changelog';
import rollupConfig from './rollup.config';
interface TaskFunc {
(cb: Function): void
}
const log = {
progress: (text: string) => {
console.log(chalk.green(text));
},
error: (text: string) => {
console.log(chalk.red(text));
},
};
const paths = {
root: path.join(__dirname, '/'),
lib: path.join(__dirname, '/lib'),
docs: path.join(__dirname, '/docs'),
};
// 删除 lib 文件
const clearLibFile: TaskFunc = async (cb) => {
fse.removeSync(paths.lib);
log.progress('Deleted lib file');
cb();
};
// rollup 打包
const buildByRollup: TaskFunc = async (cb) => {
const inputOptions = {
input: rollupConfig.input,
external: rollupConfig.external,
plugins: rollupConfig.plugins,
};
const outOptions = rollupConfig.output;
const bundle = await rollup(inputOptions);
// 写入需要遍历输出配置
if (Array.isArray(outOptions)) {
outOptions.forEach(async (outOption) => {
await bundle.write(outOption);
});
cb();
log.progress('Rollup built successfully');
}
};
// api-extractor 整理 .d.ts 文件
const apiExtractorGenerate: TaskFunc = async (cb) => {
const apiExtractorJsonPath: string = path.join(__dirname, './api-extractor.json');
// 加载并解析 api-extractor.json 文件
const extractorConfig: ExtractorConfig = await ExtractorConfig.loadFileAndPrepare(apiExtractorJsonPath);
// 判断是否存在 index.d.ts 文件,这里必须异步先访问一边,不然后面找不到会报错
const isExist: boolean = await fse.pathExists(extractorConfig.mainEntryPointFilePath);
if (!isExist) {
log.error('API Extractor not find index.d.ts');
return;
}
// 调用 API
const extractorResult: ExtractorResult = await Extractor.invoke(extractorConfig, {
localBuild: true,
// 在输出中显示信息
showVerboseMessages: true,
});
if (extractorResult.succeeded) {
// 删除多余的 .d.ts 文件
const libFiles: string[] = await fse.readdir(paths.lib);
libFiles.forEach(async file => {
if (file.endsWith('.d.ts') && !file.includes('index')) {
await fse.remove(path.join(paths.lib, file));
}
});
log.progress('API Extractor completed successfully');
cb();
} else {
log.error(`API Extractor completed with ${extractorResult.errorCount} errors`
+ ` and ${extractorResult.warningCount} warnings`);
}
};
const complete: TaskFunc = (cb) => {
log.progress('---- end ----');
cb();
};
// 构建过程
// 1. 删除 lib 文件夹
// 2. rollup 打包
// 3. api-extractor 生成统一的声明文件, 删除多余的声明文件
// 4. 完成
export const build = series(clearLibFile, buildByRollup, apiExtractorGenerate, complete);
// 自定义生成 changelog
export const changelog: TaskFunc = async (cb) => {
const changelogPath: string = path.join(paths.root, 'CHANGELOG.md');
// 对命令 conventional-changelog -p angular -i CHANGELOG.md -w -r 0
const changelogPipe = await conventionalChangelog({
preset: 'angular',
releaseCount: 0,
});
changelogPipe.setEncoding('utf8');
const resultArray = ['# 工具库更新日志\n\n'];
changelogPipe.on('data', (chunk) => {
// 原来的 commits 路径是进入提交列表
chunk = chunk.replace(/\/commits\//g, '/commit/');
resultArray.push(chunk);
});
changelogPipe.on('end', async () => {
// const changelogDocPath: string = path.join(paths.docs, 'CHANGELOG.md');
await fse.createWriteStream(changelogPath).write(resultArray.join(''));
cb();
});
};