@@ -4,6 +4,7 @@ import * as ts from "typescript";
44import * as fs from "fs" ;
55import { EmitHost , ProcessedFile } from "./utils" ;
66import { SourceNode } from "source-map" ;
7+ import { getEmitPathRelativeToOutDir , getSourceDir } from "./transpiler" ;
78
89const resolver = resolve . ResolverFactory . createResolver ( {
910 extensions : [ ".lua" ] ,
@@ -15,19 +16,28 @@ export function resolveDependencies(program: ts.Program, files: ProcessedFile[],
1516 const outFiles = [ ] ;
1617
1718 for ( const file of files ) {
18- outFiles . push ( file , ...resolveFileDependencies ( file , program . getCompilerOptions ( ) . rootDir ?? program . getCommonSourceDirectory ( ) , emitHost ) ) ;
19+ outFiles . push ( file , ...resolveFileDependencies ( file , program , emitHost ) ) ;
1920 }
2021
2122 return outFiles ;
2223}
2324
24- function resolveFileDependencies ( file : ProcessedFile , projectRootDir : string , emitHost : EmitHost ) : ProcessedFile [ ] {
25+ function resolveFileDependencies ( file : ProcessedFile , program : ts . Program , emitHost : EmitHost ) : ProcessedFile [ ] {
26+ const projectRootDir = getSourceDir ( program ) ;
2527 const dependencies : ProcessedFile [ ] = [ ] ;
2628 for ( const required of findRequiredPaths ( file . code ) ) {
2729 // Do no resolve lualib
2830 if ( required === "lualib_bundle" ) {
2931 continue ;
3032 }
33+
34+ // Do not resolve noResolution paths
35+ if ( required . startsWith ( "@NoResolution:" ) ) {
36+ const path = required . replace ( "@NoResolution:" , "" )
37+ replaceRequireInCode ( file , required , path ) ;
38+ replaceRequireInSourceMap ( file , required , path ) ;
39+ continue ;
40+ }
3141
3242 // Try to resolve the import starting from the directory `file` is in
3343 const fileDir = path . dirname ( file . fileName ) ;
@@ -39,20 +49,21 @@ function resolveFileDependencies(file: ProcessedFile, projectRootDir: string, em
3949 throw `TODO: FAILED TO READ ${ resolvedDependency } ` ;
4050 }
4151
42- // Figure out resolved require path and dependency output path
43- const resolvedRequire = path . relative ( projectRootDir , resolvedDependency ) ;
52+ // Figure out resolved require path and dependency output path
53+ const resolvedRequire = getEmitPathRelativeToOutDir ( resolvedDependency , program ) ;
4454
4555 replaceRequireInCode ( file , required , resolvedRequire ) ;
4656 replaceRequireInSourceMap ( file , required , resolvedRequire ) ;
4757
48- // Add dependency to output and resolve its dependencies recursively
49- const dependency = {
50- fileName : resolvedDependency ,
51- code : dependencyContent ,
52- } ;
53- dependencies . push ( dependency , ...resolveFileDependencies ( dependency , projectRootDir , emitHost ) ) ;
58+ // If dependency is not part of sources, add dependency to output and resolve its dependencies recursively
59+ if ( ! program . getSourceFile ( resolvedDependency ) ) {
60+ const dependency = {
61+ fileName : resolvedDependency ,
62+ code : dependencyContent ,
63+ } ;
64+ dependencies . push ( dependency , ...resolveFileDependencies ( dependency , program , emitHost ) ) ;
65+ }
5466 } else {
55- //throw `TODO: COULD NOT RESOLVE ${required}`;
5667 console . error ( `Failed to resolve ${ required } referenced in ${ file . fileName } .` ) ;
5768 console . error ( projectRootDir ) ;
5869 }
@@ -103,14 +114,16 @@ function findRequiredPaths(code: string): string[] {
103114}
104115
105116function resolveDependency ( fileDirectory : string , rootDirectory : string , dependency : string , emitHost : EmitHost ) : string | undefined {
106- // Check if
107- const dependencyPath = dependency . replace ( "." , "/" ) ;
108- const projectFilePath = path . join ( fileDirectory , dependencyPath + ".ts" ) ;
109- if ( emitHost . fileExists ( projectFilePath ) ) {
110- return projectFilePath ;
117+ // Check if file is a TS file in the project
118+ const dependencyPath = dependency ;
119+ const resolvedPath = path . resolve ( fileDirectory , dependencyPath ) ;
120+ const resolvedFile = resolvedPath + ".ts" ;
121+
122+ if ( emitHost . fileExists ( resolvedFile ) ) {
123+ return resolvedPath + ".ts" ;
111124 }
112125
113- const projectIndexPath = path . join ( fileDirectory , dependencyPath , "index.ts" ) ;
126+ const projectIndexPath = path . resolve ( fileDirectory , dependencyPath , "index.ts" ) ;
114127 if ( emitHost . fileExists ( projectIndexPath ) ) {
115128 return projectIndexPath ;
116129 }
0 commit comments