| /* | 
|     MIT License http://www.opensource.org/licenses/mit-license.php | 
|     Author Tobias Koppers @sokra | 
| */ | 
| "use strict"; | 
|   | 
| const concord = require("./concord"); | 
| const DescriptionFileUtils = require("./DescriptionFileUtils"); | 
| const forEachBail = require("./forEachBail"); | 
|   | 
| module.exports = class ConcordExtensionsPlugin { | 
|     constructor(source, options, target) { | 
|         this.source = source; | 
|         this.options = options; | 
|         this.target = target; | 
|     } | 
|   | 
|     apply(resolver) { | 
|         const target = resolver.ensureHook(this.target); | 
|         resolver | 
|             .getHook(this.source) | 
|             .tapAsync( | 
|                 "ConcordExtensionsPlugin", | 
|                 (request, resolveContext, callback) => { | 
|                     const concordField = DescriptionFileUtils.getField( | 
|                         request.descriptionFileData, | 
|                         "concord" | 
|                     ); | 
|                     if (!concordField) return callback(); | 
|                     const extensions = concord.getExtensions( | 
|                         request.context, | 
|                         concordField | 
|                     ); | 
|                     if (!extensions) return callback(); | 
|                     forEachBail( | 
|                         extensions, | 
|                         (appending, callback) => { | 
|                             const obj = Object.assign({}, request, { | 
|                                 path: request.path + appending, | 
|                                 relativePath: | 
|                                     request.relativePath && request.relativePath + appending | 
|                             }); | 
|                             resolver.doResolve( | 
|                                 target, | 
|                                 obj, | 
|                                 "concord extension: " + appending, | 
|                                 resolveContext, | 
|                                 callback | 
|                             ); | 
|                         }, | 
|                         (err, result) => { | 
|                             if (err) return callback(err); | 
|   | 
|                             // Don't allow other processing | 
|                             if (result === undefined) return callback(null, null); | 
|                             callback(null, result); | 
|                         } | 
|                     ); | 
|                 } | 
|             ); | 
|     } | 
| }; |