UNPKG

@mdfriday/foundry

Version:

The core engine of MDFriday. Convert Markdown and shortcodes into fully themed static sites – Hugo-style, powered by TypeScript.

118 lines 4.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MinifierClient = void 0; const resources_1 = require("../../../domain/resources"); const terser_1 = require("terser"); /** * MinifierClient for minification of Resource objects. Supported minifiers are: * css, html, js, json, svg and xml. */ class MinifierClient { constructor(minifyOutput = false) { this.minifiers = new Map(); this.minifyOutput = minifyOutput; this.setupMinifiers(); } setupMinifiers() { // Basic minifiers - in a real implementation, you'd use proper minification libraries this.minifiers.set('text/css', this.minifyCSS.bind(this)); this.minifiers.set('text/javascript', this.minifyJS.bind(this)); this.minifiers.set('application/javascript', this.minifyJS.bind(this)); this.minifiers.set('application/json', this.minifyJSON.bind(this)); this.minifiers.set('text/html', this.minifyHTML.bind(this)); this.minifiers.set('image/svg+xml', this.minifySVG.bind(this)); this.minifiers.set('application/xml', this.minifyXML.bind(this)); this.minifiers.set('text/xml', this.minifyXML.bind(this)); } async minify(resource) { const transformation = new MinifyTransformation(this); return resource.transform(transformation); } getMinifier(mediaType) { return this.minifiers.get(mediaType) || null; } async minifyCSS(content) { // Basic CSS minification - remove comments, extra whitespace, etc. return content; } async minifyJS(content) { try { const result = await (0, terser_1.minify)(content, { compress: { drop_console: false, // 保留 console 语句 drop_debugger: true, // 移除 debugger 语句 passes: 2 // 压缩轮数 }, mangle: { toplevel: false // 不混淆顶级变量名 }, format: { comments: false // 移除注释 } }); return result.code || content; } catch (error) { return content; } } async minifyJSON(content) { try { return JSON.stringify(JSON.parse(content)); } catch { return content; } } async minifyHTML(content) { // Basic HTML minification return content; } async minifySVG(content) { // Basic SVG minification return content; } async minifyXML(content) { // Basic XML minification return content; } } exports.MinifierClient = MinifierClient; class MinifyTransformation { constructor(minifierClient) { this.minifierClient = minifierClient; } key() { return resources_1.ResourceTransformationKey.newResourceTransformationKey('minify'); } async transform(ctx) { ctx.addOutPathIdentifier('.min'); const mediaType = ctx.source.inMediaType.type; const minifier = this.minifierClient.getMinifier(mediaType); if (!minifier) { // No minifier for this media type, just pass through ctx.source.from.pipe(ctx.target.to); return; } // Read from source let content = ''; ctx.source.from.on('data', (chunk) => { content += chunk.toString(); }); await new Promise((resolve, reject) => { ctx.source.from.on('end', async () => { try { const minified = await minifier(content); ctx.target.to.write(minified); ctx.target.to.end(); resolve(); } catch (error) { reject(error); } }); ctx.source.from.on('error', reject); }); } } //# sourceMappingURL=minifier.js.map