2025-03-29 15:51:03 -04:00

76 lines
1.7 KiB
JavaScript

'use strict';
/**
* Get replacement helper
*/
function getReplacement(replace, isArray, i) {
if (isArray && typeof replace[i] === 'undefined') {
return null;
}
if (isArray) {
return replace[i];
}
return replace;
}
/**
* Helper to make replacements
*/
module.exports = function makeReplacements(contents, from, to, file, count) {
//Turn into array
if (!Array.isArray(from)) {
from = [from];
}
//Check if replace value is an array and prepare result
const isArray = Array.isArray(to);
const result = {file};
//Counting? Initialize number of matches
if (count) {
result.numMatches = 0;
result.numReplacements = 0;
}
//Make replacements
const newContents = from.reduce((contents, item, i) => {
//Call function if given, passing in the filename
if (typeof item === 'function') {
item = item(file);
}
//Get replacement value
let replacement = getReplacement(to, isArray, i);
if (replacement === null) {
return contents;
}
//Call function if given, appending the filename
if (typeof replacement === 'function') {
const original = replacement;
replacement = (...args) => original(...args, file);
}
//Count matches
if (count) {
const matches = contents.match(item);
if (matches) {
const replacements = matches.filter(match => match !== replacement);
result.numMatches += matches.length;
result.numReplacements += replacements.length;
}
}
//Make replacement
return contents.replace(item, replacement);
}, contents);
//Check if changed
result.hasChanged = (newContents !== contents);
//Return result and new contents
return [result, newContents];
};