async function readPackages(packagePath) {
    const files = await fs.promises.readdir(packagePath, {withFileTypes: true});
    const packages = await Promise.all(files.map(async (file) => {
        // Filter out things which are not packages by regex
        if (file.name.match(notAPackageRegex)) {
            return false;
        }

        if (file.isSymbolicLink()) {
            try {
                const packageFileOrig = await fs.stat(join(packagePath, file.name));
                return packageFileOrig.isDirectory();
            } catch (err) {
                // if there's an error reading the symlink, we should just return false
                return false;
            }
        }

        // Check the remaining items to ensure they are a directory
        return file.isDirectory();
    }))
        .then(results => files.filter((_v, index) => results[index]))
        .then(packageFiles => Promise.all(packageFiles.map((packageFile) => {
            const absolutePath = join(packagePath, packageFile.name);
            return processPackage(absolutePath, packageFile.name);
        })));

    return _.keyBy(packages, 'name');
}
@param {string} packagePath
@returns {Promise<PackageList>}