72 lines
2.3 KiB
JavaScript
72 lines
2.3 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
const 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;
|
||
|
}
|
||
|
}
|
||
|
})();
|