You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
896 B
JavaScript

"use strict";
const stream = require("../stream");
const isCss = require("../is-css");
module.exports = function createCssDepsStream() {
let dependents = new Map();
let depsPhaseItems = [];
function handleItem(item) {
Object.values(item.deps).forEach((dependency) => {
if (!dependents.has(dependency)) {
dependents.set(dependency, new Set());
}
dependents.get(dependency).add(item);
});
depsPhaseItems.push(item);
}
function flush() {
return depsPhaseItems.map((item) => {
let selfIsCss = isCss(item);
let dependentsForItem = dependents.get(item.id);
let hasDependents = (dependentsForItem != null);
let dependentsAreCss = hasDependents && Array.from(dependentsForItem).every((dependent) => isCss(dependent));
return {
... item,
__icssify__discardable: (selfIsCss && dependentsAreCss)
};
});
}
return stream(handleItem, flush);
};