/// <summary>
        /// Retrieve the <see cref="RemoteSourceDependencyInfo" /> for a registration.
        /// </summary>
        /// <returns>Returns an empty sequence if the package does not exist.</returns>
        public static async Task <IEnumerable <RemoteSourceDependencyInfo> > GetDependencies(
            HttpSource httpClient,
            Uri registrationUri,
            VersionRange range,
            ILogger log,
            CancellationToken token)
        {
            var ranges = await RegistrationUtility.LoadRanges(httpClient, registrationUri, range, log, token);

            var results = new HashSet <RemoteSourceDependencyInfo>();

            foreach (var rangeObj in ranges)
            {
                if (rangeObj == null)
                {
                    throw new InvalidDataException(registrationUri.AbsoluteUri);
                }

                foreach (JObject packageObj in rangeObj["items"])
                {
                    var catalogEntry = (JObject)packageObj["catalogEntry"];
                    var version      = NuGetVersion.Parse(catalogEntry["version"].ToString());

                    if (range.Satisfies(version))
                    {
                        results.Add(ProcessPackageVersion(packageObj, version));
                    }
                }
            }

            return(results);
        }
        /// <summary>
        /// Returns inlined catalog entry items for each registration blob
        /// </summary>
        /// <remarks>The inlined entries are potentially going away soon</remarks>
        public virtual async Task <IEnumerable <JObject> > GetPackageMetadata(
            string packageId,
            VersionRange range,
            bool includePrerelease,
            bool includeUnlisted,
            SourceCacheContext cacheContext,
            Common.ILogger log,
            CancellationToken token)
        {
            var results = new List <JObject>();

            var registrationUri = GetUri(packageId);

            var ranges = await RegistrationUtility.LoadRanges(_client, registrationUri, packageId, range, cacheContext, log, token);

            foreach (var rangeObj in ranges)
            {
                if (rangeObj == null)
                {
                    throw new InvalidDataException(registrationUri.AbsoluteUri);
                }

                foreach (JObject packageObj in rangeObj["items"])
                {
                    var catalogEntry = (JObject)packageObj["catalogEntry"];
                    var version      = NuGetVersion.Parse(catalogEntry["version"].ToString());
                    var listed       = catalogEntry.GetBoolean("listed") ?? true;

                    if (range.Satisfies(version) &&
                        (includePrerelease || !version.IsPrerelease) &&
                        (includeUnlisted || listed))
                    {
                        // add in the download url
                        if (packageObj["packageContent"] != null)
                        {
                            catalogEntry["packageContent"] = packageObj["packageContent"];
                        }

                        results.Add(catalogEntry);
                    }
                }
            }

            return(results);
        }
        /// <summary>
        /// Process an individual package version entry
        /// </summary>
        /// <param name="packageObj"></param>
        /// <param name="version"></param>
        /// <returns>Returns the RemoteSourceDependencyInfo object corresponding to this package version</returns>
        private static RemoteSourceDependencyInfo ProcessPackageVersion(JObject packageObj, NuGetVersion version)
        {
            var catalogEntry = (JObject)packageObj["catalogEntry"];

            var listed = catalogEntry.GetBoolean("listed") ?? true;

            var id = catalogEntry.Value <string>("id");

            var identity         = new PackageIdentity(id, version);
            var dependencyGroups = new List <PackageDependencyGroup>();

            var dependencyGroupsArray = (JArray)catalogEntry["dependencyGroups"];

            if (dependencyGroupsArray != null)
            {
                foreach (JObject dependencyGroupObj in dependencyGroupsArray)
                {
                    var currentFramework = GetFramework(dependencyGroupObj);

                    var groupDependencies = new List <PackageDependency>();

                    JToken dependenciesObj;

                    // Packages with no dependencies have 'dependencyGroups' but no 'dependencies'
                    if (dependencyGroupObj.TryGetValue("dependencies", out dependenciesObj))
                    {
                        foreach (JObject dependencyObj in dependenciesObj)
                        {
                            var dependencyId    = dependencyObj.Value <string>("id");
                            var dependencyRange = RegistrationUtility.CreateVersionRange(dependencyObj.Value <string>("range"));

                            groupDependencies.Add(new PackageDependency(dependencyId, dependencyRange));
                        }
                    }

                    dependencyGroups.Add(new PackageDependencyGroup(currentFramework, groupDependencies));
                }
            }

            var contentUri = packageObj.Value <string>("packageContent");

            return(new RemoteSourceDependencyInfo(identity, listed, dependencyGroups, contentUri));
        }