kaven-utils
Version:
Utils for Node.js.
80 lines (79 loc) • 2.79 kB
JavaScript
/********************************************************************
* @author: Kaven
* @email: kaven@wuwenkai.com
* @website: http://blog.kaven.xyz
* @file: [Kaven-Utils] /src/KavenUtility.Minify.ts
* @create: 2024-05-24 11:25:23.824
* @modify: 2025-10-23 15:09:18.401
* @version: 6.1.1
* @times: 16
* @lines: 96
* @copyright: Copyright © 2024-2025 Kaven. All Rights Reserved.
* @description: [description]
* @license: [license]
********************************************************************/
import { existsSync } from "node:fs";
import { readFile, unlink, writeFile } from "node:fs/promises";
import { basename, extname } from "node:path";
import { minify } from "terser";
import { EnumerateFiles } from "./KavenUtility.FileSystem.js";
/**
* @since 5.4.3
* @version 2025-10-23
*/
export async function Minify(options) {
const logger = options.logger;
for await (const file of EnumerateFiles(options.src, {
logger: options.logger,
ignoreDirectoryNames: options.includeNodeModules ? [] : ["node_modules"],
})) {
const ext = extname(file).toLowerCase();
const fileLowercase = file.toLowerCase();
if (fileLowercase.endsWith(".d.ts")) {
if (options.deleteTypeScriptDeclarationFile) {
logger?.Info(`Delete: ${file}`);
await unlink(file);
}
continue;
}
if (fileLowercase.endsWith(".js.map")) {
if (options.deleteSourceMap) {
logger?.Info(`Delete: ${file}`);
await unlink(file);
}
continue;
}
if (ext !== ".js") {
continue;
}
const code = await readFile(file, "utf8");
const terserOptions = {
format: {
ecma: 2015,
comments: false,
},
};
const mapFile = file + ".map";
if (existsSync(mapFile)) {
const content = await readFile(mapFile, "utf8");
terserOptions.sourceMap = {
content,
};
if (options.setSourceMappingURL !== false) {
terserOptions.sourceMap.url = basename(mapFile);
}
}
const terserResult = await minify(code, {
...terserOptions,
...options?.terserOptions,
});
if (terserResult.code) {
await writeFile(file, terserResult.code, "utf8");
logger?.Info(`Minifying ${file} success.`);
if (typeof terserResult.map === "string") {
await writeFile(mapFile, terserResult.map, "utf8");
logger?.Info(`Source map: ${mapFile}.`);
}
}
}
}