@@ -9,7 +9,7 @@ export interface Module {
99 sourceFiles ?: ts . SourceFile [ ] ;
1010}
1111
12- export type ModuleDependencyResolver = ( request : string ) => string | { error : string } ;
12+ export type ModuleDependencyResolver = ( request : string , position : ts . ReadonlyTextRange ) => string | { error : string } ;
1313
1414export function buildModule ( module : Module , dependencyResolver : ModuleDependencyResolver ) {
1515 if ( module . isBuilt ) return ;
@@ -18,22 +18,36 @@ export function buildModule(module: Module, dependencyResolver: ModuleDependency
1818}
1919
2020function replaceResolveRequests ( rootNode : SourceNode , dependencyResolver : ModuleDependencyResolver ) {
21+ let currentPosition = 0 ;
22+
2123 function replaceInString ( source : string ) {
22- return source . replace ( / _ _ T S _ _ R e s o l v e \( ( " .* ?" ) \) / g, ( _ , match ) => {
23- const request = unescapeLuaString ( match ) ;
24- const replacement = dependencyResolver ( request ) ;
25- return typeof replacement === "string"
26- ? escapeString ( replacement )
27- : `--[[ ${ request } ]] error(${ escapeString ( replacement . error ) } )` ;
28- } ) ;
24+ const matches = source . matchAll ( / _ _ T S _ _ R e s o l v e \( ( " .* ?" ) \) / g) ;
25+ for ( const match of [ ...matches ] . reverse ( ) ) {
26+ const request = unescapeLuaString ( match [ 1 ] ) ;
27+ const pos = currentPosition + match . index ! ;
28+ const end = pos + match [ 0 ] . length ;
29+ const result = dependencyResolver ( request , { pos, end } ) ;
30+ const replacement =
31+ typeof result === "string"
32+ ? escapeString ( result )
33+ : `--[[ ${ request } ]] error(${ escapeString ( result . error ) } )` ;
34+
35+ source = source . slice ( 0 , match . index ) + replacement + source . slice ( end ) ;
36+ }
37+
38+ return source ;
2939 }
3040
3141 function walkSourceNode ( node : SourceNode , parent : SourceNode ) {
3242 for ( const child of node . children as Array < SourceNode | string > ) {
3343 if ( typeof child === "object" ) {
3444 walkSourceNode ( child , node ) ;
35- } else if ( child . includes ( "__TS__Resolve" ) ) {
36- parent . children = [ replaceInString ( parent . toString ( ) ) as any ] ;
45+ } else {
46+ if ( child . includes ( "__TS__Resolve" ) ) {
47+ parent . children = [ replaceInString ( parent . toString ( ) ) as any ] ;
48+ }
49+
50+ currentPosition += child . length ;
3751 }
3852 }
3953 }
0 commit comments