-
Notifications
You must be signed in to change notification settings - Fork 2
/
gulpfile.ts
105 lines (92 loc) · 2.82 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
import path from 'path';
import { series } from 'gulp';
import fse from 'fs-extra';
import chalk from 'chalk';
import { rollup } from 'rollup';
import {
Extractor,
ExtractorConfig,
ExtractorResult,
} from '@microsoft/api-extractor';
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'),
};
// 删除 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);