Skip to content

Commit

Permalink
Feat: bring up "once" module support
Browse files Browse the repository at this point in the history
  • Loading branch information
SukkaW committed Dec 9, 2020
1 parent c40c99b commit 2da8104
Showing 1 changed file with 35 additions and 3 deletions.
38 changes: 35 additions & 3 deletions lib/htmlnano.es6
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ import maxPreset from './presets/max';

function htmlnano(options = {}, preset = safePreset) {
return function minifier(tree) {
const attrsHandlers = [];
const contentsHandlers = [];

options = { ...preset, ...options };
let promise = Promise.resolve(tree);

for (const [moduleName, moduleOptions] of Object.entries(options)) {
if (! moduleOptions) {
if (!moduleOptions) {
// The module is disabled
continue;
}
Expand All @@ -19,8 +22,37 @@ function htmlnano(options = {}, preset = safePreset) {
throw new Error('Module "' + moduleName + '" is not defined');
}

let module = require('./modules/' + moduleName);
promise = promise.then(tree => module.default(tree, options, moduleOptions));
const module = require('./modules/' + moduleName);

if (module.once) {
// It is a "once" version of htmlnano module
if (module.onattrs) {
attrsHandlers.push(module.onattrs(options, moduleOptions));
}
if (module.oncontent) {
contentsHandlers.push(module.oncontent(options, moduleOptions));
}
} else {
// It is a traditional htmlnano module
promise = promise.then(tree => module.default(tree, options, moduleOptions));
}
}

if (attrsHandlers.length + contentsHandlers.length > 0) {
promise = promise.then(tree => {
tree.walk(node => {
for (const handler of attrsHandlers) {
node.attrs = handler(node.attrs, node);
}
for (const handler of contentsHandlers) {
node.content = handler(node.content, node);
}

return node;
});

return tree;
});
}

return promise;
Expand Down

0 comments on commit 2da8104

Please sign in to comment.