1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 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)
|