packages/postcss-move-props-to-bg-image-query/utils.js (34 lines of code) (raw):

/** * @param {postcss.Declaration[]} decls * @param {function(decl: postcss.Declaration): {name: string, value: string}} transformer * @return {Object<string, string>} */ function declsToObject(decls, transformer) { return decls.reduce((acc, decl) => { const { name, value } = transformer({ name: decl.prop, value: decl.value }); // eslint-disable-next-line no-param-reassign acc = Object.assign(acc, { [name]: value }); return acc; }, {}); } module.exports.declsToObject = declsToObject; /** * @param {postcss.Declaration[]} decls * @param {postcss.Result} root * @param {postcss.Plugin} plugin * @return {Promise<postcss.Declaration[]>} */ async function computeCustomProps(decls, result, plugin) { const map = new Map(); const clonedRoot = result.root.clone(); clonedRoot.walkDecls(clonedDecl => { const sourceDecl = decls.find(decl => ( decl.source.start.column === clonedDecl.source.start.column && decl.source.start.line === clonedDecl.source.start.line && decl.source.end.column === clonedDecl.source.end.column && decl.source.end.line === clonedDecl.source.end.line )); if (sourceDecl) { map.set(sourceDecl, clonedDecl); } }); await plugin(clonedRoot, { from: result.opts.from }); for (const [decl, clonedDecl] of map.entries()) { decl.value = clonedDecl.value; } return decls; } module.exports.computeCustomProps = computeCustomProps;