| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | #!/usr/bin/env nodeconst semver = require('semver')const fs = require('fs');const tsPkg = require('typescript/package.json');const readFileSync = fs.readFileSync;const tscPath = require.resolve('typescript/lib/tsc');const proxyApiPath = require.resolve('../out/index');const { state } = require('../out/shared');fs.readFileSync = (...args) => {	if (args[0] === tscPath) {		let tsc = readFileSync(...args);		// add *.vue files to allow extensions		tryReplace(/supportedTSExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');		tryReplace(/supportedJSExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');		tryReplace(/allSupportedExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');		// proxy createProgram apis		tryReplace(/function createProgram\(.+\) {/, s => s + ` return require(${JSON.stringify(proxyApiPath)}).createProgram(...arguments);`);		// patches logic for checking root file extension in build program for incremental builds		if (semver.gt(tsPkg.version, '5.0.0')) {			tryReplace(				`for (const existingRoot of buildInfoVersionMap.roots) {`,				`for (const existingRoot of buildInfoVersionMap.roots					.filter(file => !file.toLowerCase().includes('__vls_'))					.map(file => file.replace(/\.vue\.(j|t)sx?$/i, '.vue'))				) {`			);			tryReplace(				`return [toFileId(key), toFileIdListId(state.exportedModulesMap.getValues(key))];`, 				`return [toFileId(key), toFileIdListId(new Set(arrayFrom(state.exportedModulesMap.getValues(key)).filter(file => file !== void 0)))];`			);		}		if (semver.gte(tsPkg.version, '5.0.4')) {			tryReplace(				`return createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host);`,				s => `buildInfo.program.fileNames = buildInfo.program.fileNames					.filter(file => !file.toLowerCase().includes('__vls_'))					.map(file => file.replace(/\.vue\.(j|t)sx?$/i, '.vue'));\n` + s			);		}		return tsc;		function tryReplace(search, replace) {			const before = tsc;			tsc = tsc.replace(search, replace);			const after = tsc;			if (after === before) {				throw 'Search string not found: ' + JSON.stringify(search.toString());			}		}	}	return readFileSync(...args);};(function main() {	try {		require(tscPath);	}	catch (err) {		if (err === 'hook') {			state.hook.worker.then(main);		}		else {			throw err;		}	}})();
 |