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