@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
JavaScript
"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