{"version":3,"sources":["../../src/utils/programs.ts"],"sourcesContent":["import type * as ts from \"typescript\";\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport v8 from \"node:v8\";\n\nexport type TSModule = typeof ts;\n\ninterface ReadConfigFile {\n\tconfig: {\n\t\tcompilerOptions: {\n\t\t\tmodule: string;\n\t\t};\n\t};\n}\n\nconst programCache = new WeakMap<ts.Program, Map<string, ts.Program>>();\n\nfunction createProgram(configFile: string, ts: TSModule): ts.Program {\n\tconst projectDirectory = path.dirname(configFile);\n\tconst { config } = ts.readConfigFile(configFile, (...args) => {\n\t\treturn ts.sys.readFile(...args);\n\t}) as ReadConfigFile;\n\tconst parseConfigHost: ts.ParseConfigHost = {\n\t\tfileExists: fs.existsSync,\n\t\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\t\treadDirectory: ts.sys.readDirectory,\n\t\treadFile: (file) => fs.readFileSync(file, \"utf8\"),\n\t\tuseCaseSensitiveFileNames: true,\n\t};\n\tconst parsed = ts.parseJsonConfigFileContent(\n\t\tconfig,\n\t\tparseConfigHost,\n\t\tpath.resolve(projectDirectory),\n\t\t{\n\t\t\tnoEmit: true,\n\t\t},\n\t);\n\n\tconst host = ts.createCompilerHost(parsed.options, true);\n\treturn ts.createProgram(parsed.fileNames, parsed.options, host);\n}\n\n/**\n * Maps a ts.Program to its equivalent created with a specific version.\n */\nexport function getProgramForVersion(\n\tconfigFile: string,\n\tts: TSModule,\n\tversion: string,\n\toriginalProgram: ts.Program,\n): ts.Program {\n\tlet versionToProgram = programCache.get(originalProgram);\n\tif (versionToProgram === undefined) {\n\t\tversionToProgram = new Map<string, ts.Program>();\n\t\tprogramCache.set(originalProgram, versionToProgram);\n\t}\n\n\tlet newProgram = versionToProgram.get(version);\n\tif (newProgram === undefined) {\n\t\tnewProgram = createProgram(configFile, ts);\n\t\tversionToProgram.set(version, newProgram);\n\t}\n\n\tconst heapStats = v8.getHeapStatistics();\n\tconst heapUsage = heapStats.used_heap_size / heapStats.heap_size_limit;\n\tif (heapUsage > 0.9) {\n\t\tversionToProgram.clear();\n\t}\n\n\treturn newProgram;\n}\n"],"mappings":";AAEA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAYf,MAAM,eAAe,oBAAI,QAA6C;AAEtE,SAAS,cAAc,YAAoB,IAA0B;AACpE,QAAM,mBAAmB,KAAK,QAAQ,UAAU;AAChD,QAAM,EAAE,OAAO,IAAI,GAAG,eAAe,YAAY,IAAI,SAAS;AAC7D,WAAO,GAAG,IAAI,SAAS,GAAG,IAAI;AAAA,EAC/B,CAAC;AACD,QAAM,kBAAsC;AAAA,IAC3C,YAAY,GAAG;AAAA;AAAA,IAEf,eAAe,GAAG,IAAI;AAAA,IACtB,UAAU,CAAC,SAAS,GAAG,aAAa,MAAM,MAAM;AAAA,IAChD,2BAA2B;AAAA,EAC5B;AACA,QAAM,SAAS,GAAG;AAAA,IACjB;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,gBAAgB;AAAA,IAC7B;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AAEA,QAAM,OAAO,GAAG,mBAAmB,OAAO,SAAS,IAAI;AACvD,SAAO,GAAG,cAAc,OAAO,WAAW,OAAO,SAAS,IAAI;AAC/D;AAKO,SAAS,qBACf,YACA,IACA,SACA,iBACa;AACb,MAAI,mBAAmB,aAAa,IAAI,eAAe;AACvD,MAAI,qBAAqB,QAAW;AACnC,uBAAmB,oBAAI,IAAwB;AAC/C,iBAAa,IAAI,iBAAiB,gBAAgB;AAAA,EACnD;AAEA,MAAI,aAAa,iBAAiB,IAAI,OAAO;AAC7C,MAAI,eAAe,QAAW;AAC7B,iBAAa,cAAc,YAAY,EAAE;AACzC,qBAAiB,IAAI,SAAS,UAAU;AAAA,EACzC;AAEA,QAAM,YAAY,GAAG,kBAAkB;AACvC,QAAM,YAAY,UAAU,iBAAiB,UAAU;AACvD,MAAI,YAAY,KAAK;AACpB,qBAAiB,MAAM;AAAA,EACxB;AAEA,SAAO;AACR;","names":[]}