kittenipc/kitcom/internal/tsgo/outputpaths/commonsourcedirectory.go
2025-10-15 10:12:44 +03:00

73 lines
2.7 KiB
Go

package outputpaths
import (
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
)
func computeCommonSourceDirectoryOfFilenames(fileNames []string, currentDirectory string, useCaseSensitiveFileNames bool) string {
var commonPathComponents []string
for _, sourceFile := range fileNames {
// Each file contributes into common source file path
sourcePathComponents := tspath.GetNormalizedPathComponents(sourceFile, currentDirectory)
// The base file name is not part of the common directory path
sourcePathComponents = sourcePathComponents[:len(sourcePathComponents)-1]
if commonPathComponents == nil {
// first file
commonPathComponents = sourcePathComponents
continue
}
n := min(len(commonPathComponents), len(sourcePathComponents))
for i := range n {
if tspath.GetCanonicalFileName(commonPathComponents[i], useCaseSensitiveFileNames) != tspath.GetCanonicalFileName(sourcePathComponents[i], useCaseSensitiveFileNames) {
if i == 0 {
// Failed to find any common path component
return ""
}
// New common path found that is 0 -> i-1
commonPathComponents = commonPathComponents[:i]
break
}
}
// If the sourcePathComponents was shorter than the commonPathComponents, truncate to the sourcePathComponents
if len(sourcePathComponents) < len(commonPathComponents) {
commonPathComponents = commonPathComponents[:len(sourcePathComponents)]
}
}
if len(commonPathComponents) == 0 {
// Can happen when all input files are .d.ts files
return currentDirectory
}
return tspath.GetPathFromPathComponents(commonPathComponents)
}
func GetCommonSourceDirectory(options *core.CompilerOptions, files func() []string, currentDirectory string, useCaseSensitiveFileNames bool) string {
var commonSourceDirectory string
if options.RootDir != "" {
// If a rootDir is specified use it as the commonSourceDirectory
commonSourceDirectory = options.RootDir
} else if options.Composite.IsTrue() && options.ConfigFilePath != "" {
// If the rootDir is not specified, but the project is composite, then the common source directory
// is the directory of the config file.
commonSourceDirectory = tspath.GetDirectoryPath(options.ConfigFilePath)
} else {
commonSourceDirectory = computeCommonSourceDirectoryOfFilenames(files(), currentDirectory, useCaseSensitiveFileNames)
}
if len(commonSourceDirectory) > 0 {
// Make sure directory path ends with directory separator so this string can directly
// used to replace with "" to get the relative path of the source file and the relative path doesn't
// start with / making it rooted path
commonSourceDirectory = tspath.EnsureTrailingDirectorySeparator(commonSourceDirectory)
}
return commonSourceDirectory
}