1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #!/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;
- }
- }
- })();
|