vue-tsc.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env node
  2. const semver = require('semver')
  3. const fs = require('fs');
  4. const tsPkg = require('typescript/package.json');
  5. const readFileSync = fs.readFileSync;
  6. const tscPath = require.resolve('typescript/lib/tsc');
  7. const proxyApiPath = require.resolve('../out/index');
  8. const { state } = require('../out/shared');
  9. fs.readFileSync = (...args) => {
  10. if (args[0] === tscPath) {
  11. let tsc = readFileSync(...args);
  12. // add *.vue files to allow extensions
  13. tryReplace(/supportedTSExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');
  14. tryReplace(/supportedJSExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');
  15. tryReplace(/allSupportedExtensions = .*(?=;)/, s => s + '.concat([[".vue"]])');
  16. // proxy createProgram apis
  17. tryReplace(/function createProgram\(.+\) {/, s => s + ` return require(${JSON.stringify(proxyApiPath)}).createProgram(...arguments);`);
  18. // patches logic for checking root file extension in build program for incremental builds
  19. if (semver.gt(tsPkg.version, '5.0.0')) {
  20. tryReplace(
  21. `for (const existingRoot of buildInfoVersionMap.roots) {`,
  22. `for (const existingRoot of buildInfoVersionMap.roots
  23. .filter(file => !file.toLowerCase().includes('__vls_'))
  24. .map(file => file.replace(/\.vue\.(j|t)sx?$/i, '.vue'))
  25. ) {`
  26. );
  27. tryReplace(
  28. `return [toFileId(key), toFileIdListId(state.exportedModulesMap.getValues(key))];`,
  29. `return [toFileId(key), toFileIdListId(new Set(arrayFrom(state.exportedModulesMap.getValues(key)).filter(file => file !== void 0)))];`
  30. );
  31. }
  32. if (semver.gte(tsPkg.version, '5.0.4')) {
  33. tryReplace(
  34. `return createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host);`,
  35. s => `buildInfo.program.fileNames = buildInfo.program.fileNames
  36. .filter(file => !file.toLowerCase().includes('__vls_'))
  37. .map(file => file.replace(/\.vue\.(j|t)sx?$/i, '.vue'));\n` + s
  38. );
  39. }
  40. return tsc;
  41. function tryReplace(search, replace) {
  42. const before = tsc;
  43. tsc = tsc.replace(search, replace);
  44. const after = tsc;
  45. if (after === before) {
  46. throw 'Search string not found: ' + JSON.stringify(search.toString());
  47. }
  48. }
  49. }
  50. return readFileSync(...args);
  51. };
  52. (function main() {
  53. try {
  54. require(tscPath);
  55. }
  56. catch (err) {
  57. if (err === 'hook') {
  58. state.hook.worker.then(main);
  59. }
  60. else {
  61. throw err;
  62. }
  63. }
  64. })();