125 lines
No EOL
3.2 KiB
JavaScript
125 lines
No EOL
3.2 KiB
JavaScript
"use strict";
|
|
|
|
const cssnano = require('cssnano');
|
|
/*
|
|
* We bring to the line here, because when passing result from the worker,
|
|
* the warning.toString is replaced with native Object.toString
|
|
* */
|
|
|
|
|
|
function warningsToString(warnings) {
|
|
return warnings.map(i => i.toString());
|
|
}
|
|
|
|
async function load(module) {
|
|
let exports;
|
|
|
|
try {
|
|
// eslint-disable-next-line import/no-dynamic-require, global-require
|
|
exports = require(module);
|
|
return exports;
|
|
} catch (requireError) {
|
|
let importESM;
|
|
|
|
try {
|
|
// eslint-disable-next-line no-new-func
|
|
importESM = new Function('id', 'return import(id);');
|
|
} catch (e) {
|
|
importESM = null;
|
|
}
|
|
|
|
if (requireError.code === 'ERR_REQUIRE_ESM' && importESM) {
|
|
exports = await importESM(module);
|
|
return exports.default;
|
|
}
|
|
|
|
throw requireError;
|
|
}
|
|
}
|
|
|
|
const minify = async options => {
|
|
const {
|
|
name,
|
|
input,
|
|
minimizerOptions,
|
|
map,
|
|
inputSourceMap,
|
|
minify: minifyFn
|
|
} = options;
|
|
|
|
if (minifyFn) {
|
|
const result = await minifyFn({
|
|
[name]: input
|
|
}, inputSourceMap, minimizerOptions);
|
|
return {
|
|
// TODO remove `css` in future major release
|
|
code: result.code || result.css,
|
|
map: result.map,
|
|
warnings: warningsToString(result.warnings || [])
|
|
};
|
|
}
|
|
|
|
const postcssOptions = {
|
|
to: name,
|
|
from: name,
|
|
...minimizerOptions.processorOptions
|
|
};
|
|
|
|
if (typeof postcssOptions.parser === 'string') {
|
|
try {
|
|
postcssOptions.parser = await load(postcssOptions.parser);
|
|
} catch (error) {
|
|
throw new Error(`Loading PostCSS "${postcssOptions.parser}" parser failed: ${error.message}\n\n(@${name})`);
|
|
}
|
|
}
|
|
|
|
if (typeof postcssOptions.stringifier === 'string') {
|
|
try {
|
|
postcssOptions.stringifier = await load(postcssOptions.stringifier);
|
|
} catch (error) {
|
|
throw new Error(`Loading PostCSS "${postcssOptions.stringifier}" stringifier failed: ${error.message}\n\n(@${name})`);
|
|
}
|
|
}
|
|
|
|
if (typeof postcssOptions.syntax === 'string') {
|
|
try {
|
|
postcssOptions.syntax = await load(postcssOptions.syntax);
|
|
} catch (error) {
|
|
throw new Error(`Loading PostCSS "${postcssOptions.syntax}" syntax failed: ${error.message}\n\n(@${name})`);
|
|
}
|
|
}
|
|
|
|
if (inputSourceMap) {
|
|
// TODO remove `inline` value for the `sourceMap` option
|
|
postcssOptions.map = {
|
|
annotation: false,
|
|
inline: false,
|
|
prev: inputSourceMap,
|
|
...map
|
|
};
|
|
}
|
|
|
|
const result = await cssnano.process(input, postcssOptions, minimizerOptions);
|
|
return {
|
|
code: result.css,
|
|
map: result.map && result.map.toString(),
|
|
warnings: warningsToString(result.warnings())
|
|
};
|
|
};
|
|
|
|
async function transform(options) {
|
|
// 'use strict' => this === undefined (Clean Scope)
|
|
// Safer for possible security issues, albeit not critical at all here
|
|
// eslint-disable-next-line no-new-func, no-param-reassign
|
|
options = new Function('exports', 'require', 'module', '__filename', '__dirname', `'use strict'\nreturn ${options}`)(exports, require, module, __filename, __dirname);
|
|
const result = await minify(options);
|
|
|
|
if (result.error) {
|
|
throw result.error;
|
|
} else {
|
|
return result;
|
|
}
|
|
}
|
|
|
|
module.exports.minify = minify;
|
|
module.exports.transform = transform; |