| 
									
										
										
										
											2020-01-14 15:15:01 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-01-14 15:15:01 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Custom resolution plugin for Webpack's `resolve-enhanced` package that is used by | 
					
						
							|  |  |  |  * Madge for resolving imports. The plugin extends the resolution by leveraging the | 
					
						
							|  |  |  |  * runfile resolution and module mappings handled in the module info aspect. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class BazelRunfileResolutionPlugin { | 
					
						
							|  |  |  |   apply(resolver) { | 
					
						
							|  |  |  |     resolver.plugin('module', (request, callback) => { | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         // Resolve the module through the `require.resolve` method which has been patched
 | 
					
						
							|  |  |  |         // in the Bazel NodeJS loader to respect runfiles and module mappings. This allows
 | 
					
						
							|  |  |  |         // Madge to handle module mappings specified in `ts_library` and `ng_module` targets.
 | 
					
						
							|  |  |  |         const resolvedPath = require.resolve(request.request); | 
					
						
							|  |  |  |         // Update the request to refer to the runfile resolved file path.
 | 
					
						
							|  |  |  |         resolver.doResolve('resolve', {...request, request: resolvedPath}, null, callback, true); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } catch { | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // If the file could not be resolved through Bazel's runfile resolution, proceed
 | 
					
						
							|  |  |  |       // with the default module resolvers.
 | 
					
						
							|  |  |  |       callback(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Configures a plugin which ensures that Madge can properly resolve specified
 | 
					
						
							|  |  |  | // dependencies through their configured module names.
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   resolve: {plugins: [new BazelRunfileResolutionPlugin()]} | 
					
						
							|  |  |  | }; |