/** Replace only the captured project prefix, in parsed JSON keys and string values. */
export function createReportNormalizer(projectRoot) {
  const forward = projectRoot.replaceAll('\\', '/').replace(/\/$/, '');
  const backward = forward.replaceAll('/', '\\');
  const filePrefix = forward.startsWith('/') ? 'file://' + forward : 'file:///' + forward;
  const prefixes = [...new Set([
    projectRoot, forward, backward,
    filePrefix, encodeURI(filePrefix),
    'file://' + forward, encodeURI('file://' + forward),
    encodeURI(forward),
  ])].filter(Boolean).sort((a, b) => b.length - a.length);
  const cleanString = text => prefixes.reduce((result, prefix) => result.replaceAll(prefix, '[project]'), text);
  const normalize = value => {
    if (typeof value === 'string') return cleanString(value);
    if (Array.isArray(value)) return value.map(normalize);
    if (value !== null && typeof value === 'object') {
      return Object.fromEntries(Object.entries(value).map(([key, item]) => [cleanString(key), normalize(item)]));
    }
    return value;
  };
  return { normalize, cleanString };
}
