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