@@ -84,29 +84,29 @@ type packageMetadata struct {
8484}
8585
8686func DetectPackageManager (request DetectionRequest ) DetectionResult {
87- if result , ok := detectOverride (request .CLIOverride , DetectionSourceCLIOverride ); ok {
87+ signals := detectProjectSignals (request .Project )
88+ if result , ok := detectOverride (request .CLIOverride , DetectionSourceCLIOverride , signals ); ok {
8889 return result
8990 }
90- if result , ok := detectOverride (request .EnvOverride , DetectionSourceEnvOverride ); ok {
91+ if result , ok := detectOverride (request .EnvOverride , DetectionSourceEnvOverride , signals ); ok {
9192 return result
9293 }
93- if result , ok := detectOverride (request .ConfigOverride , DetectionSourceConfigOverride ); ok {
94+ if result , ok := detectOverride (request .ConfigOverride , DetectionSourceConfigOverride , signals ); ok {
9495 return result
9596 }
9697
97- signals := detectProjectSignals (request .Project )
9898 return resultFromSignals (signals )
9999}
100100
101- func detectOverride (raw string , source DetectionSource ) (DetectionResult , bool ) {
101+ func detectOverride (raw string , source DetectionSource , signals [] DetectionSignal ) (DetectionResult , bool ) {
102102 id , ok := parseManagerID (raw )
103103 if id == "" {
104104 return DetectionResult {}, false
105105 }
106106 if ! ok {
107107 return invalidResult (id , source ), true
108108 }
109- return resultForManager (id , source , nil ), true
109+ return resultForManager (id , source , signals ), true
110110}
111111
112112func detectProjectSignals (project ProjectRef ) []DetectionSignal {
@@ -183,14 +183,23 @@ func ambiguousSignals(signals []DetectionSignal) bool {
183183}
184184
185185func resultForManager (id ManagerID , source DetectionSource , signals []DetectionSignal ) DetectionResult {
186- if id == ManagerIDNPM {
186+ var manager PackageManager
187+ switch id {
188+ case ManagerIDNPM :
189+ manager = NewNPM ()
190+ case ManagerIDPNPM :
191+ manager = NewPNPM ()
192+ case ManagerIDYarn :
193+ manager = yarnManagerForSignals (signals )
194+ }
195+ if manager != nil {
187196 return DetectionResult {
188- ID : ManagerIDNPM ,
197+ ID : id ,
189198 Source : source ,
190199 Supported : true ,
191200 Executable : true ,
192201 Signals : signals ,
193- Manager : NewNPM () ,
202+ Manager : manager ,
194203 }
195204 }
196205 return DetectionResult {
@@ -207,6 +216,15 @@ func resultForManager(id ManagerID, source DetectionSource, signals []DetectionS
207216 }
208217}
209218
219+ func yarnManagerForSignals (signals []DetectionSignal ) PackageManager {
220+ for _ , signal := range signals {
221+ if signal .Path == ".yarnrc.yml" || (strings .HasPrefix (strings .ToLower (signal .Value ), "yarn@" ) && ! strings .HasPrefix (strings .ToLower (signal .Value ), "yarn@1." )) {
222+ return NewYarn ()
223+ }
224+ }
225+ return NewYarnClassic ()
226+ }
227+
210228func invalidResult (id ManagerID , source DetectionSource ) DetectionResult {
211229 return DetectionResult {
212230 ID : id ,
0 commit comments