| /* | 
|     MIT License http://www.opensource.org/licenses/mit-license.php | 
|     Author Tobias Koppers @sokra | 
| */ | 
| "use strict"; | 
|   | 
| const forEachBail = require("./forEachBail"); | 
|   | 
| function loadDescriptionFile( | 
|     resolver, | 
|     directory, | 
|     filenames, | 
|     resolveContext, | 
|     callback | 
| ) { | 
|     (function findDescriptionFile() { | 
|         forEachBail( | 
|             filenames, | 
|             (filename, callback) => { | 
|                 const descriptionFilePath = resolver.join(directory, filename); | 
|                 if (resolver.fileSystem.readJson) { | 
|                     resolver.fileSystem.readJson(descriptionFilePath, (err, content) => { | 
|                         if (err) { | 
|                             if (typeof err.code !== "undefined") return callback(); | 
|                             return onJson(err); | 
|                         } | 
|                         onJson(null, content); | 
|                     }); | 
|                 } else { | 
|                     resolver.fileSystem.readFile(descriptionFilePath, (err, content) => { | 
|                         if (err) return callback(); | 
|                         let json; | 
|                         try { | 
|                             json = JSON.parse(content); | 
|                         } catch (e) { | 
|                             onJson(e); | 
|                         } | 
|                         onJson(null, json); | 
|                     }); | 
|                 } | 
|   | 
|                 function onJson(err, content) { | 
|                     if (err) { | 
|                         if (resolveContext.log) | 
|                             resolveContext.log( | 
|                                 descriptionFilePath + " (directory description file): " + err | 
|                             ); | 
|                         else | 
|                             err.message = | 
|                                 descriptionFilePath + " (directory description file): " + err; | 
|                         return callback(err); | 
|                     } | 
|                     callback(null, { | 
|                         content: content, | 
|                         directory: directory, | 
|                         path: descriptionFilePath | 
|                     }); | 
|                 } | 
|             }, | 
|             (err, result) => { | 
|                 if (err) return callback(err); | 
|                 if (result) { | 
|                     return callback(null, result); | 
|                 } else { | 
|                     directory = cdUp(directory); | 
|                     if (!directory) { | 
|                         return callback(); | 
|                     } else { | 
|                         return findDescriptionFile(); | 
|                     } | 
|                 } | 
|             } | 
|         ); | 
|     })(); | 
| } | 
|   | 
| function getField(content, field) { | 
|     if (!content) return undefined; | 
|     if (Array.isArray(field)) { | 
|         let current = content; | 
|         for (let j = 0; j < field.length; j++) { | 
|             if (current === null || typeof current !== "object") { | 
|                 current = null; | 
|                 break; | 
|             } | 
|             current = current[field[j]]; | 
|         } | 
|         if (typeof current === "object") { | 
|             return current; | 
|         } | 
|     } else { | 
|         if (typeof content[field] === "object") { | 
|             return content[field]; | 
|         } | 
|     } | 
| } | 
|   | 
| function cdUp(directory) { | 
|     if (directory === "/") return null; | 
|     const i = directory.lastIndexOf("/"), | 
|         j = directory.lastIndexOf("\\"); | 
|     const p = i < 0 ? j : j < 0 ? i : i < j ? j : i; | 
|     if (p < 0) return null; | 
|     return directory.substr(0, p || 1); | 
| } | 
|   | 
| exports.loadDescriptionFile = loadDescriptionFile; | 
| exports.getField = getField; | 
| exports.cdUp = cdUp; |