-
Notifications
You must be signed in to change notification settings - Fork 173
Expand file tree
/
Copy pathversionEmit.ts
More file actions
48 lines (44 loc) · 1.93 KB
/
versionEmit.ts
File metadata and controls
48 lines (44 loc) · 1.93 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
import type { IPluginAPI } from '@fesjs/shared';
import { existsSync, readFileSync } from 'node:fs';
import { join } from 'node:path';
import process from 'node:process';
import webpack from 'webpack';
class VersionEmitPlugin {
constructor(private cwd: string) {}
apply(compiler: webpack.Compiler) {
compiler.hooks.thisCompilation.tap('VersionEmitPlugin', (compilation) => {
compilation.hooks.processAssets.tap({ name: 'VersionEmitPlugin', stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, () => {
const pkgPath = join(this.cwd, 'package.json');
let name = '';
let version = '';
if (existsSync(pkgPath)) {
try {
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) || {};
name = pkg.name || '';
version = pkg.version || '';
}
catch {}
}
const info = {
name,
version,
buildTime: new Date().toISOString(),
builder: 'webpack',
nodeEnv: process.env.NODE_ENV,
};
const jsonSource = new webpack.sources.RawSource(`${JSON.stringify(info, null, 2)}\n`);
const txt = `name: ${info.name}\nversion: ${info.version}\nbuildTime: ${info.buildTime}\nbuilder: ${info.builder}\nnodeEnv: ${info.nodeEnv ?? ''}\n`;
const txtSource = new webpack.sources.RawSource(txt);
compilation.emitAsset('version.json', jsonSource);
compilation.emitAsset('version.txt', txtSource);
});
});
}
}
export default (api: IPluginAPI) => {
api.modifyBundleConfig((memo: any) => {
memo.plugins = memo.plugins || [];
memo.plugins.push(new VersionEmitPlugin(api.paths.cwd));
return memo;
});
};