93 lines
2.3 KiB
JavaScript
93 lines
2.3 KiB
JavaScript
import fs from "fs"
|
|
import { glob } from "glob"
|
|
import path from "path"
|
|
import ts from "typescript"
|
|
import vueTsc from "vue-tsc"
|
|
|
|
import { fileURLToPath } from "url"
|
|
|
|
/**
|
|
* Helper function to find files to perform type check on
|
|
*/
|
|
const findFilesToPerformTypeCheck = (directoryPaths, filePatterns) => {
|
|
const files = []
|
|
|
|
directoryPaths.forEach((directoryPath) => {
|
|
if (!fs.existsSync(directoryPath)) {
|
|
console.error(`Directory not found: ${directoryPath}`)
|
|
process.exit(1)
|
|
}
|
|
|
|
files.push(
|
|
...glob.sync(filePatterns, {
|
|
cwd: directoryPath,
|
|
ignore: ["**/__tests__/**", "**/*.d.ts"],
|
|
absolute: true,
|
|
})
|
|
)
|
|
})
|
|
return files
|
|
}
|
|
|
|
// Derive the current file's directory path `__dirname` from the URL of this module `__filename`
|
|
const __filename = fileURLToPath(import.meta.url)
|
|
const __dirname = path.dirname(__filename)
|
|
|
|
// Define the directory paths and file patterns to perform type checks on
|
|
const directoryPaths = [path.resolve(__dirname, "src", "services")]
|
|
const filePatterns = ["**/*.ts"]
|
|
|
|
const tsConfigFileName = path.resolve(__dirname, "tsconfig.json")
|
|
const tsConfig = ts.readConfigFile(tsConfigFileName, ts.sys.readFile)
|
|
const { options } = ts.parseJsonConfigFileContent(
|
|
tsConfig.config,
|
|
ts.sys,
|
|
__dirname
|
|
)
|
|
|
|
const files = findFilesToPerformTypeCheck(directoryPaths, filePatterns)
|
|
|
|
const host = ts.createCompilerHost(options)
|
|
const program = vueTsc.createProgram({
|
|
rootNames: files,
|
|
options: { ...options, noEmit: true },
|
|
host,
|
|
})
|
|
|
|
// Perform type checking
|
|
const diagnostics = ts
|
|
.getPreEmitDiagnostics(program)
|
|
// Filter diagnostics to include only errors from files in the specified directory
|
|
.filter(({ file }) => {
|
|
if (!file) {
|
|
return false
|
|
}
|
|
return directoryPaths.some((directoryPath) =>
|
|
path.resolve(file.fileName).includes(directoryPath)
|
|
)
|
|
})
|
|
|
|
if (!diagnostics.length) {
|
|
console.log("Type checking passed.")
|
|
|
|
// Success
|
|
process.exit(0)
|
|
}
|
|
|
|
console.log("TypeScript diagnostics:")
|
|
|
|
const formatHost = {
|
|
getCanonicalFileName: (fileName) => fileName,
|
|
getCurrentDirectory: host.getCurrentDirectory,
|
|
getNewLine: () => ts.sys.newLine,
|
|
}
|
|
|
|
const formattedDiagnostics = ts.formatDiagnosticsWithColorAndContext(
|
|
diagnostics,
|
|
formatHost
|
|
)
|
|
console.error(formattedDiagnostics)
|
|
|
|
// Failure
|
|
process.exit(1)
|