| /* |
| 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; |