1
1
import { resolveModuleByImport } from '../utils/typescript' ;
2
- import { normalizedProjectRoot } from './file-utils' ;
2
+ import { defaultFileRead , normalizedProjectRoot } from './file-utils' ;
3
3
import { ProjectGraphNodeRecords } from './project-graph/project-graph-models' ;
4
4
import { getSortedProjectNodes , isWorkspaceProject } from './project-graph' ;
5
+ import { isRelativePath , parseJsonWithComments } from '../utils/fileutils' ;
6
+ import { dirname , join } from 'path' ;
5
7
6
8
export class TargetProjectLocator {
7
- _sortedNodeNames = [ ] ;
9
+ private sortedWorkspaceProjects = [ ] ;
10
+ private paths = parseJsonWithComments ( this . fileRead ( `./tsconfig.base.json` ) )
11
+ ?. compilerOptions ?. paths ;
12
+ private cache = new Map < string , string > ( ) ;
8
13
9
- constructor ( private nodes : ProjectGraphNodeRecords ) {
10
- this . _sortedNodeNames = getSortedProjectNodes ( nodes ) . map (
11
- ( { name } ) => name
12
- ) ;
14
+ constructor (
15
+ private nodes : ProjectGraphNodeRecords ,
16
+ private fileRead : ( path : string ) => string = defaultFileRead
17
+ ) {
18
+ this . sortedWorkspaceProjects = getSortedProjectNodes ( nodes )
19
+ . filter ( ( node ) => isWorkspaceProject ( node ) )
20
+ . map ( ( node ) => ( {
21
+ ...node ,
22
+ data : {
23
+ ...node . data ,
24
+ normalizedRoot : normalizedProjectRoot ( node ) ,
25
+ } ,
26
+ } ) ) ;
13
27
}
14
28
15
29
/**
@@ -27,28 +41,45 @@ export class TargetProjectLocator {
27
41
importExpr : string ,
28
42
filePath : string ,
29
43
npmScope : string
30
- ) {
44
+ ) : string {
31
45
const normalizedImportExpr = importExpr . split ( '#' ) [ 0 ] ;
32
46
33
- const resolvedModule = resolveModuleByImport (
34
- normalizedImportExpr ,
35
- filePath
36
- ) ;
37
-
38
- return this . _sortedNodeNames . find ( ( projectName ) => {
39
- const p = this . nodes [ projectName ] ;
47
+ if ( isRelativePath ( normalizedImportExpr ) ) {
48
+ const resolvedModule = join ( dirname ( filePath ) , normalizedImportExpr ) ;
49
+ return this . findProjectOfResolvedModule ( resolvedModule ) ;
50
+ }
40
51
41
- if ( ! isWorkspaceProject ( p ) ) {
42
- return false ;
52
+ if ( this . paths && this . paths [ normalizedImportExpr ] ) {
53
+ for ( let p of this . paths [ normalizedImportExpr ] ) {
54
+ const maybeResolvedProject = this . findProjectOfResolvedModule ( p ) ;
55
+ if ( maybeResolvedProject ) {
56
+ return maybeResolvedProject ;
57
+ }
43
58
}
59
+ }
44
60
45
- if ( resolvedModule && resolvedModule . startsWith ( p . data . root ) ) {
46
- return true ;
47
- } else {
48
- const normalizedRoot = normalizedProjectRoot ( p ) ;
49
- const projectImport = `@${ npmScope } /${ normalizedRoot } ` ;
50
- return normalizedImportExpr . startsWith ( projectImport ) ;
51
- }
61
+ const resolvedModule = this . cache . has ( normalizedImportExpr )
62
+ ? this . cache . get ( normalizedImportExpr )
63
+ : resolveModuleByImport ( normalizedImportExpr , filePath ) ;
64
+
65
+ this . cache . set ( normalizedImportExpr , resolvedModule ) ;
66
+ if ( resolvedModule ) {
67
+ return this . findProjectOfResolvedModule ( resolvedModule ) ;
68
+ }
69
+
70
+ const importedProject = this . sortedWorkspaceProjects . find ( ( p ) => {
71
+ const projectImport = `@${ npmScope } /${ p . data . normalizedRoot } ` ;
72
+ return normalizedImportExpr . startsWith ( projectImport ) ;
52
73
} ) ;
74
+
75
+ return importedProject ?. name ;
76
+ }
77
+
78
+ private findProjectOfResolvedModule ( resolvedModule : string ) {
79
+ const importedProject = this . sortedWorkspaceProjects . find ( ( p ) => {
80
+ return resolvedModule . startsWith ( p . data . root ) ;
81
+ } ) ;
82
+
83
+ return importedProject ?. name ;
53
84
}
54
85
}
0 commit comments