|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
|
|
|
|
const forEachBail = require("./forEachBail"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function cdUp(directory) { |
|
|
if (directory === "/") return null; |
|
|
const i = directory.lastIndexOf("/"); |
|
|
const j = directory.lastIndexOf("\\"); |
|
|
const path = i < 0 ? j : j < 0 ? i : i < j ? j : i; |
|
|
if (path < 0) return null; |
|
|
return directory.slice(0, path || 1); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function loadDescriptionFile( |
|
|
resolver, |
|
|
directory, |
|
|
filenames, |
|
|
oldInfo, |
|
|
resolveContext, |
|
|
callback, |
|
|
) { |
|
|
(function findDescriptionFile() { |
|
|
if (oldInfo && oldInfo.directory === directory) { |
|
|
|
|
|
return callback(null, oldInfo); |
|
|
} |
|
|
forEachBail( |
|
|
filenames, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(filename, callback) => { |
|
|
const descriptionFilePath = resolver.join(directory, filename); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function onJson(err, resolvedContent) { |
|
|
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: (resolvedContent), |
|
|
directory, |
|
|
path: descriptionFilePath, |
|
|
}); |
|
|
} |
|
|
|
|
|
if (resolver.fileSystem.readJson) { |
|
|
resolver.fileSystem.readJson(descriptionFilePath, (err, content) => { |
|
|
if (err) { |
|
|
if ( |
|
|
typeof ( (err).code) !== |
|
|
"undefined" |
|
|
) { |
|
|
if (resolveContext.missingDependencies) { |
|
|
resolveContext.missingDependencies.add(descriptionFilePath); |
|
|
} |
|
|
return callback(); |
|
|
} |
|
|
if (resolveContext.fileDependencies) { |
|
|
resolveContext.fileDependencies.add(descriptionFilePath); |
|
|
} |
|
|
return onJson(err); |
|
|
} |
|
|
if (resolveContext.fileDependencies) { |
|
|
resolveContext.fileDependencies.add(descriptionFilePath); |
|
|
} |
|
|
onJson(null, content); |
|
|
}); |
|
|
} else { |
|
|
resolver.fileSystem.readFile(descriptionFilePath, (err, content) => { |
|
|
if (err) { |
|
|
if (resolveContext.missingDependencies) { |
|
|
resolveContext.missingDependencies.add(descriptionFilePath); |
|
|
} |
|
|
return callback(); |
|
|
} |
|
|
if (resolveContext.fileDependencies) { |
|
|
resolveContext.fileDependencies.add(descriptionFilePath); |
|
|
} |
|
|
|
|
|
|
|
|
let json; |
|
|
|
|
|
if (content) { |
|
|
try { |
|
|
json = JSON.parse(content.toString()); |
|
|
} catch ( err_) { |
|
|
return onJson( (err_)); |
|
|
} |
|
|
} else { |
|
|
return onJson(new Error("No content in file")); |
|
|
} |
|
|
|
|
|
onJson(null, json); |
|
|
}); |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(err, result) => { |
|
|
if (err) return callback(err); |
|
|
if (result) return callback(null, result); |
|
|
const dir = cdUp(directory); |
|
|
if (!dir) { |
|
|
return callback(); |
|
|
} |
|
|
directory = dir; |
|
|
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]] |
|
|
); |
|
|
} |
|
|
return current; |
|
|
} |
|
|
return content[field]; |
|
|
} |
|
|
|
|
|
module.exports.cdUp = cdUp; |
|
|
module.exports.getField = getField; |
|
|
module.exports.loadDescriptionFile = loadDescriptionFile; |
|
|
|