UNPKG

kaven-utils

Version:

Utils for Node.js.

80 lines (79 loc) 2.79 kB
/******************************************************************** * @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}.`); } } } }