Browse Source

fix(build): reuse TypeScript config host

Tianyi Cui 1 month ago
parent
commit
204a09b70f
2 changed files with 5 additions and 14 deletions
  1. 2 12
      scripts/clean.ts
  2. 3 2
      scripts/ts-project.ts

+ 2 - 12
scripts/clean.ts

@@ -2,20 +2,10 @@ import { lstat, readdir, rm } from 'node:fs/promises'
 import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'
 import { fileURLToPath } from 'node:url'
 import ts from 'typescript'
+import { repositoryConfigHost } from './ts-project.ts'
 
 const knownOrphanEntries = new Set(['node_modules', 'lib', '.typecheck'])
 
-const configHost: ts.ParseConfigFileHost = {
-  useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
-  readDirectory: (...args) => ts.sys.readDirectory(...args),
-  fileExists: fileName => ts.sys.fileExists(fileName),
-  readFile: fileName => ts.sys.readFile(fileName),
-  getCurrentDirectory: () => ts.sys.getCurrentDirectory(),
-  onUnRecoverableConfigFileDiagnostic(diagnostic) {
-    throw new Error(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'))
-  },
-}
-
 function isMissing(error: unknown): boolean {
   return error instanceof Error && 'code' in error && error.code === 'ENOENT'
 }
@@ -45,7 +35,7 @@ function repositoryPath(root: string, path: string): string {
 }
 
 function parseConfig(configPath: string): ts.ParsedCommandLine {
-  const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, configHost)
+  const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, repositoryConfigHost)
   if (!parsed) throw new Error(`clean: cannot parse TypeScript config ${configPath}`)
   if (parsed.errors.length > 0) {
     throw new Error(parsed.errors.map(error => ts.flattenDiagnosticMessageText(error.messageText, '\n')).join('\n'))

+ 3 - 2
scripts/ts-project.ts

@@ -11,7 +11,8 @@ interface ProjectGraph {
   options: ts.CompilerOptions
 }
 
-const configHost: ts.ParseConfigFileHost = {
+/** TypeScript config host shared by repository scripts. */
+export const repositoryConfigHost: ts.ParseConfigFileHost = {
   useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
   readDirectory: (...args) => ts.sys.readDirectory(...args),
   fileExists: fileName => ts.sys.fileExists(fileName),
@@ -52,7 +53,7 @@ function loadProjectGraph(projectRoot: string): ProjectGraph {
 
 /** Parse one config file and fail loud on any config diagnostic. */
 function parseConfig(configPath: string): ts.ParsedCommandLine {
-  const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, configHost)
+  const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, repositoryConfigHost)
   if (!parsed) throw new Error(`cannot parse TypeScript config ${configPath}`)
   if (parsed.errors.length > 0) {
     throw new Error(parsed.errors.map(error => ts.flattenDiagnosticMessageText(error.messageText, '\n')).join('\n'))