{"version":3,"file":"index.cjs","sources":["../src/util.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'fs'\nimport objectHash from 'object-hash'\n\nexport const CURRENT_BASELINE_VERSION = 1\n\nexport interface ErrorSummary {\n  code: string\n  count: number\n  file: string\n  message?: string\n}\n\nexport interface SpecificError {\n  code: string\n  column: number\n  file: string\n  line: number\n  message: string\n}\n\nexport interface OldBaselineFile {\n  [hash: string]: ErrorSummary | SpecificError\n}\n\nexport interface BaselineFile {\n  meta: {\n    baselineFileVersion: number\n    ignoreMessages: boolean\n  }\n  // eslint-disable-next-line typescript-sort-keys/interface\n  errors: {\n    [hash: string]: ErrorSummary\n  }\n}\n\nexport type SpecificErrorsMap = Map<string, SpecificError[]>\nexport type ErrorSummaryMap = Map<string, ErrorSummary>\nexport type GitLabErrorFormat = {\n  check_name: string\n  description: string\n  fingerprint: string\n  location: {\n    lines: {\n      begin: number\n    }\n    path: string\n  }\n  severity: string\n}\n\nexport interface ParsingResult {\n  errorSummaryMap: ErrorSummaryMap\n  specificErrorsMap: SpecificErrorsMap\n}\n\nexport enum ErrorFormat {\n  GITLAB = 'gitlab',\n  HUMAN = 'human'\n}\n\ntype ErrorOptions = {\n  ignoreMessages: boolean\n}\n\n// Hash just the error summary, not the count so that we can easily\n// modify the count independently\nconst getErrorSummaryHash = (\n  errorSummary: ErrorSummary,\n  { ignoreMessages }: ErrorOptions\n) => {\n  const { code, file, message } = errorSummary\n  if (ignoreMessages) {\n    return objectHash({ code, file })\n  }\n  return objectHash({ code, file, message })\n}\n\nexport const parseTypeScriptErrors = (\n  errorLog: string,\n  { ignoreMessages }: ErrorOptions\n): ParsingResult => {\n  const errorPattern = /^(.+)\\((\\d+),(\\d+)\\): error (\\w+): (.+)$/\n\n  const lines = errorLog.split('\\n')\n  const specificErrorsMap: SpecificErrorsMap = new Map<\n    string,\n    SpecificError[]\n  >()\n  const errorSummaryMap: ErrorSummaryMap = new Map<string, ErrorSummary>()\n\n  const addSpecificErrorToMap = (\n    filePathName: string,\n    error: SpecificError\n  ) => {\n    const existingFile = specificErrorsMap.get(filePathName)\n    if (existingFile) {\n      existingFile.push(error)\n    } else {\n      specificErrorsMap.set(filePathName, [error])\n    }\n  }\n\n  const addErrorToSummary = (error: SpecificError) => {\n    const { file, code, message } = error\n    let errorSummary: ErrorSummary = {\n      file,\n      code,\n      count: 1\n    }\n    if (!ignoreMessages) {\n      errorSummary.message = message\n    }\n    const key = getErrorSummaryHash(errorSummary, { ignoreMessages })\n\n    const existingError = errorSummaryMap.get(key)\n    if (existingError) {\n      errorSummary = { ...existingError }\n      errorSummary.count += 1\n    }\n    errorSummaryMap.set(key, errorSummary)\n  }\n\n  for (const line of lines) {\n    const match = line.match(errorPattern)\n    if (match) {\n      const [, file, lineStr, columnStr, code, message] = match\n      const error: SpecificError = {\n        file,\n        code,\n        message,\n        line: parseInt(lineStr),\n        column: parseInt(columnStr)\n      }\n      addSpecificErrorToMap(error.file, error)\n      addErrorToSummary(error)\n    }\n  }\n\n  return { specificErrorsMap, errorSummaryMap }\n}\n\nexport const writeTypeScriptErrorsToFile = (\n  map: ErrorSummaryMap,\n  filepath: string,\n  errorOptions: ErrorOptions\n): void => {\n  const newBaselineFile: BaselineFile = {\n    meta: {\n      baselineFileVersion: CURRENT_BASELINE_VERSION,\n      ignoreMessages: errorOptions.ignoreMessages\n    },\n    errors: Object.fromEntries(map)\n  }\n  writeFileSync(filepath, JSON.stringify(newBaselineFile, null, 2))\n}\n\nexport const readBaselineErrorsFile = (\n  filepath: string\n): BaselineFile | OldBaselineFile => {\n  const text = readFileSync(filepath, {\n    encoding: 'utf-8'\n  })\n  return JSON.parse(text)\n}\n\nexport const getBaselineFileVersion = (\n  baselineFile: BaselineFile | OldBaselineFile\n) => {\n  if (\n    typeof baselineFile?.meta === 'object' &&\n    'baselineFileVersion' in baselineFile?.meta\n  ) {\n    return baselineFile?.meta?.baselineFileVersion\n  }\n  return 0\n}\n\nexport const isBaselineVersionCurrent = (\n  baselineFile: BaselineFile | OldBaselineFile\n): baselineFile is BaselineFile => {\n  return getBaselineFileVersion(baselineFile) === CURRENT_BASELINE_VERSION\n}\n\nexport const getErrorSummaryMap = (baselineFile: BaselineFile) => {\n  return new Map(Object.entries(baselineFile.errors))\n}\n\nexport const getNewErrors = (\n  oldErrors: ErrorSummaryMap,\n  newErrors: ErrorSummaryMap\n): ErrorSummaryMap => {\n  const result = new Map<string, ErrorSummary>()\n\n  for (const [id, error] of newErrors) {\n    if (!oldErrors.has(id)) {\n      result.set(id, error)\n    } else {\n      const oldErrCount = oldErrors.get(id)?.count ?? 0\n      const newErrCount = newErrors.get(id)?.count ?? 0\n      if (oldErrCount < newErrCount) {\n        const newErrors = { ...error, count: newErrCount - oldErrCount }\n        result.set(id, newErrors)\n      }\n    }\n  }\n\n  return result\n}\n\nexport const getTotalErrorsCount = (errorMap: ErrorSummaryMap): number =>\n  // NOTE: Previously, this was written with an array spread, but there was a bug\n  // with microbundle that was incorrectly compiling that (see: https://github.com/TimMikeladze/tsc-baseline/issues/21).\n  // Until that is resolved or the bundler is switched for this repo, this has been\n  // rewritten with Array.from\n  Array.from(errorMap.values()).reduce((sum, info) => sum + info.count, 0)\n\nexport const toHumanReadableText = (\n  errorSummaryMap: ErrorSummaryMap,\n  specificErrorMap: SpecificErrorsMap,\n  errorOptions: ErrorOptions,\n  isReportingUnmatchedErrors = false\n): string => {\n  let log = ''\n\n  for (const [key, error] of errorSummaryMap) {\n    const specificErrors = getSpecificErrorsMatchingSummary(\n      error,\n      specificErrorMap,\n      errorOptions\n    )\n\n    log += `File: ${error.file}\\n`\n    if (error.message) {\n      log += `Message: ${error.message}\\n`\n    }\n    log += `Code: ${error.code}\\n`\n    log += `Hash: ${key}\\n`\n\n    if (!isReportingUnmatchedErrors) {\n      log += `Count of new errors: ${error.count}\\n`\n      log += `${specificErrors.length} current error${\n        specificErrors.length === 1 ? '' : 's'\n      }:\\n`\n\n      log += specificErrors\n        .map(\n          (specificError) =>\n            `${specificError.file}(${specificError.line},${specificError.column})`\n        )\n        .join('\\n')\n    }\n\n    log += '\\n\\n'\n  }\n\n  return log.trim()\n}\n\nexport const getSpecificErrorsMatchingSummary = (\n  errorSummary: ErrorSummary,\n  specificErrorsMap: SpecificErrorsMap,\n  errorOptions: ErrorOptions\n): SpecificError[] => {\n  return (\n    specificErrorsMap\n      .get(errorSummary.file)\n      ?.filter(\n        (specificError) =>\n          specificError.file === errorSummary.file &&\n          (errorOptions.ignoreMessages\n            ? true\n            : specificError.message === errorSummary.message) &&\n          specificError.code === errorSummary.code\n      ) || []\n  )\n}\n\nexport const addHashToBaseline = (hash: string, filepath: string): void => {\n  const baselineErrorsFile = readBaselineErrorsFile(filepath)\n  if (!isBaselineVersionCurrent(baselineErrorsFile)) {\n    throw new Error(\n      'The .tsc-baseline.json is not current. Please make sure your packages are up to date and save a new baseline file'\n    )\n  }\n\n  const oldErrors = getErrorSummaryMap(baselineErrorsFile)\n  const newErrors = new Map<string, ErrorSummary>()\n\n  for (const [key, error] of oldErrors) {\n    newErrors.set(key, error)\n  }\n\n  newErrors.set(hash, {\n    code: '0000',\n    file: '0000',\n    message: '0000',\n    count: 1\n  })\n\n  writeTypeScriptErrorsToFile(newErrors, filepath, {\n    ignoreMessages: baselineErrorsFile.meta.ignoreMessages\n  })\n}\n\nexport const toGitLabOutputFormat = (\n  errorSummaryMap: ErrorSummaryMap,\n  specificErrorMap: SpecificErrorsMap,\n  errorOptions: ErrorOptions\n): string => {\n  const result: GitLabErrorFormat[] = []\n\n  for (const [key, error] of errorSummaryMap.entries()) {\n    const specificErrors: SpecificError[] = getSpecificErrorsMatchingSummary(\n      error,\n      specificErrorMap,\n      errorOptions\n    )\n\n    specificErrors.forEach((specificError: SpecificError, index: number) => {\n      result.push(<GitLabErrorFormat>{\n        description: specificError.message,\n        check_name: 'typescript-errors',\n        fingerprint: `${key}-${index}`,\n        severity: 'minor',\n        location: {\n          path: specificError.file,\n          lines: {\n            begin: specificError.line\n          }\n        }\n      })\n    })\n  }\n\n  return JSON.stringify(result, null, 2)\n}\n"],"names":["ErrorFormat","writeTypeScriptErrorsToFile","map","filepath","errorOptions","newBaselineFile","meta","baselineFileVersion","ignoreMessages","errors","Object","fromEntries","writeFileSync","JSON","stringify","readBaselineErrorsFile","text","readFileSync","encoding","parse","getBaselineFileVersion","baselineFile","_baselineFile$meta","isBaselineVersionCurrent","getErrorSummaryMap","Map","entries","getSpecificErrorsMatchingSummary","errorSummary","specificErrorsMap","_specificErrorsMap$ge","get","file","filter","specificError","message","code","hash","baselineErrorsFile","Error","_step4","oldErrors","newErrors","_iterator4","_createForOfIteratorHelperLoose","done","_step4$value","value","set","error","count","_step2","result","_iterator2","_step2$value","id","has","_oldErrors$get$count","_oldErrors$get","_newErrors$get$count","_newErrors$get","oldErrCount","newErrCount","_extends","errorMap","Array","from","values","reduce","sum","info","errorLog","_ref2","_step","errorPattern","lines","split","errorSummaryMap","addSpecificErrorToMap","filePathName","existingFile","push","addErrorToSummary","key","_ref","objectHash","getErrorSummaryHash","existingError","_iterator","match","columnStr","line","parseInt","column","specificErrorMap","_step5","_loop","_step5$value","forEach","index","description","check_name","fingerprint","severity","location","path","begin","_iterator5","isReportingUnmatchedErrors","_step3","log","_iterator3","_step3$value","specificErrors","length","join","trim"],"mappings":"gGAuDYA,uiCAAAA,4BAAAA,EAAAA,QAAAA,cAAAA,QAAWA,YAGtB,KAFC,OAAA,SACAA,EAAA,MAAA,QASF,IA2EaC,EAA8B,SACzCC,EACAC,EACAC,GAEA,IAAMC,EAAgC,CACpCC,KAAM,CACJC,oBAjJkC,EAkJlCC,eAAgBJ,EAAaI,gBAE/BC,OAAQC,OAAOC,YAAYT,IAE7BU,gBAAcT,EAAUU,KAAKC,UAAUT,EAAiB,KAAM,GAChE,EAEaU,EAAyB,SACpCZ,GAEA,IAAMa,EAAOC,EAAAA,aAAad,EAAU,CAClCe,SAAU,UAEZ,OAAOL,KAAKM,MAAMH,EACpB,EAEaI,EAAyB,SACpCC,GAKE,IAAAC,EAHF,MACgC,iBAAvBD,MAAAA,OAAAA,EAAAA,EAAcf,OACrB,wBAAqC,MAAZe,OAAY,EAAZA,EAAcf,MAEpB,MAAZe,UAAYC,EAAZD,EAAcf,aAAdgB,EAAoBf,oBAG/B,CAAA,EAEagB,EAA2B,SACtCF,GAEA,OAjLsC,IAiL/BD,EAAuBC,EAChC,EAEaG,EAAqB,SAACH,GACjC,WAAWI,IAAIf,OAAOgB,QAAQL,EAAaZ,QAC7C,EAyEakB,EAAmC,SAC9CC,EACAC,EACAzB,GACmB0B,IAAAA,EACnB,OAE2B,OADzBA,EAAAD,EACGE,IAAIH,EAAaI,YAAK,EADzBF,EAEIG,OACA,SAACC,GACC,OAAAA,EAAcF,OAASJ,EAAaI,SACnC5B,EAAaI,gBAEV0B,EAAcC,UAAYP,EAAaO,UAC3CD,EAAcE,OAASR,EAAaQ,IAAI,KACvC,EAEX,mCAhRwC,4BAkRP,SAACC,EAAclC,GAC9C,IAAMmC,EAAqBvB,EAAuBZ,GAClD,IAAKoB,EAAyBe,GAC5B,MAAU,IAAAC,MACR,qHAOJ,IAHA,IAGoCC,EAH9BC,EAAYjB,EAAmBc,GAC/BI,EAAY,IAAIjB,IAEtBkB,EAAAC,EAA2BH,KAASD,EAAAG,KAAAE,MAAE,CAAA,IAAAC,EAAAN,EAAAO,MACpCL,EAAUM,IADGF,EAAEG,GAAKH,EAAA,GAErB,CAEDJ,EAAUM,IAAIX,EAAM,CAClBD,KAAM,OACNJ,KAAM,OACNG,QAAS,OACTe,MAAO,IAGTjD,EAA4ByC,EAAWvC,EAAU,CAC/CK,eAAgB8B,EAAmBhC,KAAKE,gBAE5C,qFAnH4B,SAC1BiC,EACAC,GAIA,IAFA,IAEmCS,EAF7BC,EAAS,IAAI3B,IAEnB4B,EAAAT,EAA0BF,KAASS,EAAAE,KAAAR,MAAE,CAAA,IAAAS,EAAAH,EAAAJ,MAAzBQ,EAAED,EAAEL,GAAAA,EAAKK,EAAA,GACnB,GAAKb,EAAUe,IAAID,GAEZ,CAAAE,IAAAA,EAAAC,EAAAC,EAAAC,EACCC,SAAWJ,EAAoB,OAApBC,EAAGjB,EAAUV,IAAIwB,SAAG,EAAjBG,EAAmBR,OAAKO,EAAI,EAC1CK,EAAsCH,OAA3BA,SAAAC,EAAGlB,EAAUX,IAAIwB,WAAdK,EAAmBV,OAAKS,EAAI,EAChD,GAAIE,EAAcC,EAAa,CAC7B,IAAMpB,EAASqB,EAAQd,GAAAA,GAAOC,MAAOY,EAAcD,IACnDT,EAAOJ,IAAIO,EAAIb,EAChB,CACF,MARCU,EAAOJ,IAAIO,EAAIN,EASlB,CAED,OAAOG,CACT,yEAEmC,SAACY,GAKlC,OAAAC,MAAMC,KAAKF,EAASG,UAAUC,OAAO,SAACC,EAAKC,GAAS,OAAAD,EAAMC,EAAKpB,KAAK,EAAE,EAAE,mEAzIrC,SACnCqB,EAAgBC,GA4ChB,IA1CiB,IA0COC,EA3CtBjE,EAAcgE,EAAdhE,eAEIkE,EAAe,2CAEfC,EAAQJ,EAASK,MAAM,MACvB/C,EAAuC,IAAIJ,IAI3CoD,EAAmC,IAAIpD,IAEvCqD,EAAwB,SAC5BC,EACA9B,GAEA,IAAM+B,EAAenD,EAAkBE,IAAIgD,GACvCC,EACFA,EAAaC,KAAKhC,GAElBpB,EAAkBmB,IAAI+B,EAAc,CAAC9B,GAEzC,EAEMiC,EAAoB,SAACjC,GACzB,IACIrB,EAA6B,CAC/BI,KAF8BiB,EAAxBjB,KAGNI,KAH8Ba,EAAlBb,KAIZc,MAAO,GAEJ1C,IACHoB,EAAaO,QAPiBc,EAAZd,SASpB,IAAMgD,EA9CkB,SAC1BvD,EAA0BwD,GAExB,IACMhD,EAAwBR,EAAxBQ,KAAMJ,EAAkBJ,EAAlBI,KACd,OACSqD,UAJOD,EAAd5E,eAIkB,CAAE4B,KAAAA,EAAMJ,KAAAA,GAEV,CAAEI,KAAAA,EAAMJ,KAAAA,EAAMG,QAJAP,EAAZO,SAKtB,CAqCgBmD,CAAoB1D,EAAc,CAAEpB,eAAAA,IAE1C+E,EAAgBV,EAAgB9C,IAAIoD,GACtCI,KACF3D,EAAYmC,EAAA,CAAA,EAAQwB,IACPrC,OAAS,GAExB2B,EAAgB7B,IAAImC,EAAKvD,EAC3B,EAEA4D,EAAA5C,EAAmB+B,KAAKF,EAAAe,KAAA3C,MAAE,KAClB4C,EADOhB,EAAA1B,MACM0C,MAAMf,GACzB,GAAIe,EAAO,CACT,IAAwBC,EAA4BD,KAC9CxC,EAAuB,CAC3BjB,KAFkDyD,KAGlDrD,KAHkDqD,EAAXtD,GAIvCA,QAJkDsD,KAKlDE,KAAMC,SAL4CH,EAAK,IAMvDI,OAAQD,SAASF,IAEnBZ,EAAsB7B,EAAMjB,KAAMiB,GAClCiC,EAAkBjC,EACnB,CACF,CAED,MAAO,CAAEpB,kBAAAA,EAAmBgD,gBAAAA,EAC9B,gEAqKoC,SAClCA,EACAiB,EACA1F,GAIA,IAFA,IAEoD2F,EAF9C3C,EAA8B,GAAE4C,EAAA,WAEgB,IAAAC,EAAAF,EAAAhD,MAA1CoC,EAAGc,EAAEhD,GACyBtB,EADpBsE,KAGlBH,EACA1F,GAGa8F,QAAQ,SAAChE,EAA8BiE,GACpD/C,EAAO6B,KAAwB,CAC7BmB,YAAalE,EAAcC,QAC3BkE,WAAY,oBACZC,YAAgBnB,EAAOgB,IAAAA,EACvBI,SAAU,QACVC,SAAU,CACRC,KAAMvE,EAAcF,KACpB2C,MAAO,CACL+B,MAAOxE,EAAcyD,QAI7B,EACD,EArBDgB,EAAA/D,EAA2BiC,EAAgBnD,aAASqE,EAAAY,KAAA9D,MAAAmD,IAuBpD,OAAOnF,KAAKC,UAAUsC,EAAQ,KAAM,EACtC,8BAvHmC,SACjCyB,EACAiB,EACA1F,EACAwG,QAAAA,IAAAA,IAAAA,GAA6B,GAI7B,IAFA,IAE0CC,EAFtCC,EAAM,GAEVC,EAAAnE,EAA2BiC,KAAegC,EAAAE,KAAAlE,MAAE,CAAA,IAAAmE,EAAAH,EAAA9D,MAAhCoC,EAAG6B,EAAE/D,GAAAA,EAAK+D,EAAA,GACdC,EAAiBtF,EACrBsB,EACA6C,EACA1F,GAGF0G,GAAgB7D,SAAAA,EAAMjB,KAAI,KACtBiB,EAAMd,UACR2E,eAAmB7D,EAAMd,QAC1B,MACD2E,GAAgB7D,SAAAA,EAAMb,UACtB0E,YAAgB3B,EAAG,KAEdyB,IACHE,GAAG,wBAA4B7D,EAAMC,WACrC4D,GAAUG,EAAeC,OAAM,kBACH,IAA1BD,EAAeC,OAAe,GAAK,KAChC,MAELJ,GAAOG,EACJ/G,IACC,SAACgC,UACIA,EAAcF,KAAI,IAAIE,EAAcyD,KAAQzD,IAAAA,EAAc2D,OAAM,GAAA,GAEtEsB,KAAK,OAGVL,GAAO,MACR,CAED,OAAOA,EAAIM,MACb"}