File: Nuget.Frameworks\DefaultFrameworkMappings.cs
Web Access
Project: src\src\vstest\src\Microsoft.TestPlatform.ObjectModel\Microsoft.TestPlatform.ObjectModel.csproj (Microsoft.VisualStudio.TestPlatform.ObjectModel)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Linq;

namespace NuGetClone.Frameworks
{
    internal sealed class DefaultFrameworkMappings : IFrameworkMappings
    {
        private static Lazy<KeyValuePair<string, string>[]> IdentifierSynonymsLazy = new(() =>
        {
            return
            [
                // .NET
                new KeyValuePair<string, string>("NETFramework", FrameworkConstants.FrameworkIdentifiers.Net),
                new KeyValuePair<string, string>(".NET", FrameworkConstants.FrameworkIdentifiers.Net),

                // .NET Core
                new KeyValuePair<string, string>("NETCore", FrameworkConstants.FrameworkIdentifiers.NetCore),

                // Portable
                new KeyValuePair<string, string>("NETPortable", FrameworkConstants.FrameworkIdentifiers.Portable),

                // ASP
                new KeyValuePair<string, string>("asp.net", FrameworkConstants.FrameworkIdentifiers.AspNet),
                new KeyValuePair<string, string>("asp.netcore", FrameworkConstants.FrameworkIdentifiers.AspNetCore),

                // Mono/Xamarin
                new KeyValuePair<string, string>("Xamarin.PlayStationThree", FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation3),
                new KeyValuePair<string, string>("XamarinPlayStationThree", FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation3),
                new KeyValuePair<string, string>("Xamarin.PlayStationFour", FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation4),
                new KeyValuePair<string, string>("XamarinPlayStationFour", FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation4),
                new KeyValuePair<string, string>("XamarinPlayStationVita", FrameworkConstants.FrameworkIdentifiers.XamarinPlayStationVita)
            ];
        });

        public IEnumerable<KeyValuePair<string, string>> IdentifierSynonyms
        {
            get
            {
                return IdentifierSynonymsLazy.Value;
            }
        }

        private static readonly Lazy<KeyValuePair<string, string>[]> IdentifierShortNamesLazy = new(() =>
        {
            return
            [
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetCoreApp, "netcoreapp"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetStandardApp, "netstandardapp"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetStandard, "netstandard"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetPlatform, "dotnet"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Net, "net"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetMicro, "netmf"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Silverlight, "sl"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Portable, "portable"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.WindowsPhone, "wp"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.WindowsPhoneApp, "wpa"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Windows, "win"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.AspNet, "aspnet"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.AspNetCore, "aspnetcore"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Native, "native"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.MonoAndroid, "monoandroid"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.MonoTouch, "monotouch"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.MonoMac, "monomac"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinIOs, "xamarinios"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinMac, "xamarinmac"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation3, "xamarinpsthree"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation4, "xamarinpsfour"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinPlayStationVita, "xamarinpsvita"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinWatchOS, "xamarinwatchos"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinTVOS, "xamarintvos"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinXbox360, "xamarinxboxthreesixty"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.XamarinXboxOne, "xamarinxboxone"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Dnx, "dnx"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.DnxCore, "dnxcore"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NetCore, "netcore"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.WinRT, "winrt"), // legacy
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.UAP, "uap"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.Tizen, "tizen"),
                new KeyValuePair<string, string>(FrameworkConstants.FrameworkIdentifiers.NanoFramework, "netnano")
            ];
        });

        public IEnumerable<KeyValuePair<string, string>> IdentifierShortNames
        {
            get
            {
                return IdentifierShortNamesLazy.Value;
            }
        }

        private static readonly Lazy<FrameworkSpecificMapping[]> ProfileShortNamesLazy = new(() =>
        {
            return
            [
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Net, "Client", "Client"),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Net, "CF", "CompactFramework"),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Net, "Full", string.Empty),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Silverlight, "WP", "WindowsPhone"),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Silverlight, "WP71", "WindowsPhone71")
            ];
        });

        public IEnumerable<FrameworkSpecificMapping> ProfileShortNames
        {
            get
            {
                return ProfileShortNamesLazy.Value;
            }
        }

        private static readonly Lazy<KeyValuePair<NuGetFramework, NuGetFramework>[]> EquivalentFrameworksLazy = new(() =>
        {
            return
            [
                // UAP 0.0 <-> UAP 10.0
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.EmptyVersion),
                    FrameworkConstants.CommonFrameworks.UAP10),

                // win <-> win8
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Windows, FrameworkConstants.EmptyVersion),
                    FrameworkConstants.CommonFrameworks.Win8),

                // win8 <-> netcore45
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.Win8,
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, new Version(4, 5, 0, 0))),

                // netcore45 <-> winrt45
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, new Version(4, 5, 0, 0)),
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WinRT, new Version(4, 5, 0, 0))),

                // netcore <-> netcore45
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, FrameworkConstants.EmptyVersion),
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, new Version(4, 5, 0, 0))),

                // winrt <-> winrt45
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WinRT, FrameworkConstants.EmptyVersion),
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WinRT, new Version(4, 5, 0, 0))),

                // win81 <-> netcore451
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.Win81,
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, new Version(4, 5, 1, 0))),

                // wp <-> wp7
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WindowsPhone, FrameworkConstants.EmptyVersion),
                    FrameworkConstants.CommonFrameworks.WP7),

                // wp7 <-> f:sl3-wp
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.WP7,
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Silverlight, new Version(3, 0, 0, 0), "WindowsPhone")),

                // wp71 <-> f:sl4-wp71
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WindowsPhone, new Version(7, 1, 0, 0)),
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Silverlight, new Version(4, 0, 0, 0), "WindowsPhone71")),

                // wp8 <-> f:sl8-wp
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.WP8,
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Silverlight, new Version(8, 0, 0, 0), "WindowsPhone")),

                // wp81 <-> f:sl81-wp
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.WP81,
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Silverlight, new Version(8, 1, 0, 0), "WindowsPhone")),

                // wpa <-> wpa81
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WindowsPhoneApp, FrameworkConstants.EmptyVersion),
                    FrameworkConstants.CommonFrameworks.WPA81),

                // tizen <-> tizen3
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Tizen, FrameworkConstants.EmptyVersion),
                    FrameworkConstants.CommonFrameworks.Tizen3),

                // dnx <-> dnx45
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.Dnx,
                    FrameworkConstants.CommonFrameworks.Dnx45),

                // dnxcore <-> dnxcore50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.DnxCore,
                    FrameworkConstants.CommonFrameworks.DnxCore50),

                // dotnet <-> dotnet50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.DotNet,
                    FrameworkConstants.CommonFrameworks.DotNet50),

                // TODO: remove these rules post-RC
                // aspnet <-> aspnet50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.AspNet,
                    FrameworkConstants.CommonFrameworks.AspNet50),

                // aspnetcore <-> aspnetcore50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.AspNetCore,
                    FrameworkConstants.CommonFrameworks.AspNetCore50),

                // dnx451 <-> aspnet50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.Dnx45,
                    FrameworkConstants.CommonFrameworks.AspNet50),

                // dnxcore50 <-> aspnetcore50
                new KeyValuePair<NuGetFramework, NuGetFramework>(
                    FrameworkConstants.CommonFrameworks.DnxCore50,
                    FrameworkConstants.CommonFrameworks.AspNetCore50)
            ];
        });

        public IEnumerable<KeyValuePair<NuGetFramework, NuGetFramework>> EquivalentFrameworks
        {
            get
            {
                return EquivalentFrameworksLazy.Value;
            }
        }

        private static readonly Lazy<FrameworkSpecificMapping[]> EquivalentProfilesLazy = new(() =>
        {
            return
            [
                // The client profile, for the purposes of NuGet, is the same as the full framework
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Net, "Client", string.Empty),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Net, "Full", string.Empty),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.Silverlight, "WindowsPhone71", "WindowsPhone"),
                new FrameworkSpecificMapping(FrameworkConstants.FrameworkIdentifiers.WindowsPhone, "WindowsPhone71", "WindowsPhone")
            ];
        });

        public IEnumerable<FrameworkSpecificMapping> EquivalentProfiles
        {
            get
            {
                return EquivalentProfilesLazy.Value;
            }
        }

        private static readonly Lazy<KeyValuePair<string, string>[]> SubSetFrameworksLazy = new(() =>
        {
            return
            [
                // .NET is a subset of DNX
                new KeyValuePair<string, string>(
                    FrameworkConstants.FrameworkIdentifiers.Net,
                    FrameworkConstants.FrameworkIdentifiers.Dnx),

                // NetPlatform is a subset of DNXCore
                new KeyValuePair<string, string>(
                    FrameworkConstants.FrameworkIdentifiers.NetPlatform,
                    FrameworkConstants.FrameworkIdentifiers.DnxCore),

                // NetStandard is a subset of NetStandardApp
                new KeyValuePair<string, string>(
                    FrameworkConstants.FrameworkIdentifiers.NetStandard,
                    FrameworkConstants.FrameworkIdentifiers.NetStandardApp)
            ];
        });

        public IEnumerable<KeyValuePair<string, string>> SubSetFrameworks
        {
            get
            {
                return SubSetFrameworksLazy.Value;
            }
        }

        private static readonly Lazy<OneWayCompatibilityMappingEntry[]> CompatibilityMappingsLazy = new(() =>
        {
            return new[]
                {
                    // UAP supports Win81
                    new OneWayCompatibilityMappingEntry(new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.MaxVersion)),
                        new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Windows, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Windows, new Version(8, 1, 0, 0)))),

                    // UAP supports WPA81
                    new OneWayCompatibilityMappingEntry(new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.MaxVersion)),
                        new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WindowsPhoneApp, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WindowsPhoneApp, new Version(8, 1, 0, 0)))),

                    // UAP supports NetCore50
                    new OneWayCompatibilityMappingEntry(new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, FrameworkConstants.MaxVersion)),
                        new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, FrameworkConstants.Version5),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCore, FrameworkConstants.Version5))),

                    // Win projects support WinRT
                    new OneWayCompatibilityMappingEntry(new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Windows, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.Windows, FrameworkConstants.MaxVersion)),
                        new FrameworkRange(
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WinRT, FrameworkConstants.EmptyVersion),
                            new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.WinRT, new Version(4, 5, 0, 0)))),

                    // Tizen3 projects support NETStandard1.6
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.Tizen3,
                        FrameworkConstants.CommonFrameworks.NetStandard16),

                    // Tizen4 projects support NETStandard2.0
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.Tizen4,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    // Tizen6 projects support NETStandard2.1
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.Tizen6,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    // UAP 10.0.15064.0 projects support NETStandard2.0
                    CreateStandardMapping(
                        new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.UAP, new Version(10, 0, 15064, 0)),
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    // NetCoreApp1.0 projects support NetStandard1.6
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCoreApp10,
                        FrameworkConstants.CommonFrameworks.NetStandard16),

                    // NetCoreApp1.1 projects support NetStandard1.7
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCoreApp11,
                        FrameworkConstants.CommonFrameworks.NetStandard17),

                    // NetCoreApp2.0 projects support NetStandard2.0
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCoreApp20,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    // NetCoreApp3.0 projects support NetStandard2.1
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCoreApp30,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    // net463 projects support NetStandard2.0
                    CreateStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net463,
                        FrameworkConstants.CommonFrameworks.NetStandard20)
                }
                .Concat(new[]
                {
                    // dnxcore50 -> dotnet5.6, netstandard1.5
                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.DnxCore,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard15),

                    // uap -> dotnet5.5, netstandard1.4
                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.UAP,
                        FrameworkConstants.CommonFrameworks.DotNet55,
                        FrameworkConstants.CommonFrameworks.NetStandard14),

                    // netcore50 -> dotnet5.5, netstandard1.4
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCore50,
                        FrameworkConstants.CommonFrameworks.DotNet55,
                        FrameworkConstants.CommonFrameworks.NetStandard14),

                    // wpa81 -> dotnet5.3, netstandard1.2
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.WPA81,
                        FrameworkConstants.CommonFrameworks.DotNet53,
                        FrameworkConstants.CommonFrameworks.NetStandard12),

                    // wp8, wp81 -> dotnet5.1, netstandard1.0
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.WP8,
                        FrameworkConstants.CommonFrameworks.DotNet51,
                        FrameworkConstants.CommonFrameworks.NetStandard10),

                    // net45 -> dotnet5.2, netstandard1.1
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net45,
                        FrameworkConstants.CommonFrameworks.DotNet52,
                        FrameworkConstants.CommonFrameworks.NetStandard11),

                    // net451 -> dotnet5.3, netstandard1.2
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net451,
                        FrameworkConstants.CommonFrameworks.DotNet53,
                        FrameworkConstants.CommonFrameworks.NetStandard12),

                    // net46 -> dotnet5.4, netstandard1.3
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net46,
                        FrameworkConstants.CommonFrameworks.DotNet54,
                        FrameworkConstants.CommonFrameworks.NetStandard13),

                    // net461 -> dotnet5.5, netstandard2.0
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net461,
                        FrameworkConstants.CommonFrameworks.DotNet55,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    // net462 -> dotnet5.6, netstandard2.0
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.Net462,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    // netcore45 -> dotnet5.2, netstandard1.1
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCore45,
                        FrameworkConstants.CommonFrameworks.DotNet52,
                        FrameworkConstants.CommonFrameworks.NetStandard11),

                    // netcore451 -> dotnet5.3, netstandard1.2
                    CreateGenerationAndStandardMapping(
                        FrameworkConstants.CommonFrameworks.NetCore451,
                        FrameworkConstants.CommonFrameworks.DotNet53,
                        FrameworkConstants.CommonFrameworks.NetStandard12),

                    // xamarin frameworks
                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.MonoAndroid,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.MonoMac,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.MonoTouch,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinIOs,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinMac,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation3,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinPlayStation4,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinPlayStationVita,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinXbox360,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinXboxOne,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard20),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinTVOS,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21),

                    CreateGenerationAndStandardMappingForAllVersions(
                        FrameworkConstants.FrameworkIdentifiers.XamarinWatchOS,
                        FrameworkConstants.CommonFrameworks.DotNet56,
                        FrameworkConstants.CommonFrameworks.NetStandard21)
                }.SelectMany(mappings => mappings))
                .ToArray();
        });

        public IEnumerable<OneWayCompatibilityMappingEntry> CompatibilityMappings
        {
            get
            {
                return CompatibilityMappingsLazy.Value;
            }
        }

        private static OneWayCompatibilityMappingEntry CreateGenerationMapping(
            NuGetFramework framework,
            NuGetFramework netPlatform)
        {
            return new OneWayCompatibilityMappingEntry(
                new FrameworkRange(
                    framework,
                    new NuGetFramework(framework.Framework, FrameworkConstants.MaxVersion)),
                new FrameworkRange(
                    FrameworkConstants.CommonFrameworks.DotNet,
                    netPlatform));
        }

        private static OneWayCompatibilityMappingEntry CreateStandardMapping(
            NuGetFramework framework,
            NuGetFramework netPlatform)
        {
            return new OneWayCompatibilityMappingEntry(
                new FrameworkRange(
                    framework,
                    new NuGetFramework(framework.Framework, FrameworkConstants.MaxVersion)),
                new FrameworkRange(
                    FrameworkConstants.CommonFrameworks.NetStandard10,
                    netPlatform));
        }

        private static IEnumerable<OneWayCompatibilityMappingEntry> CreateGenerationAndStandardMapping(
            NuGetFramework framework,
            NuGetFramework netPlatform,
            NuGetFramework netStandard)
        {
            yield return CreateGenerationMapping(framework, netPlatform);
            yield return CreateStandardMapping(framework, netStandard);
        }

        private static IEnumerable<OneWayCompatibilityMappingEntry> CreateGenerationAndStandardMappingForAllVersions(
            string framework,
            NuGetFramework netPlatform,
            NuGetFramework netStandard)
        {
            var lowestFramework = new NuGetFramework(framework, FrameworkConstants.EmptyVersion);
            return CreateGenerationAndStandardMapping(lowestFramework, netPlatform, netStandard);
        }

        private static readonly Lazy<string[]> NonPackageBasedFrameworkPrecedenceLazy = new(() =>
        {
            return
            [
                FrameworkConstants.FrameworkIdentifiers.Net,
                FrameworkConstants.FrameworkIdentifiers.NetCore,
                FrameworkConstants.FrameworkIdentifiers.Windows,
                FrameworkConstants.FrameworkIdentifiers.WindowsPhoneApp
            ];
        });

        public IEnumerable<string> NonPackageBasedFrameworkPrecedence
        {
            get
            {
                return NonPackageBasedFrameworkPrecedenceLazy.Value;
            }
        }

        private static readonly Lazy<string[]> PackageBasedFrameworkPrecedenceLazy = new(() =>
        {
            return
            [
                FrameworkConstants.FrameworkIdentifiers.NetCoreApp,
                FrameworkConstants.FrameworkIdentifiers.NetStandardApp,
                FrameworkConstants.FrameworkIdentifiers.NetStandard,
                FrameworkConstants.FrameworkIdentifiers.NetPlatform
            ];
        });

        public IEnumerable<string> PackageBasedFrameworkPrecedence
        {
            get
            {
                return PackageBasedFrameworkPrecedenceLazy.Value;
            }
        }

        private static readonly Lazy<string[]> EquivalentFrameworkPrecedenceLazy = new(() =>
        {
            return
            [
                FrameworkConstants.FrameworkIdentifiers.Windows,
                FrameworkConstants.FrameworkIdentifiers.NetCore,
                FrameworkConstants.FrameworkIdentifiers.WinRT,

                FrameworkConstants.FrameworkIdentifiers.WindowsPhone,
                FrameworkConstants.FrameworkIdentifiers.Silverlight,

                FrameworkConstants.FrameworkIdentifiers.DnxCore,
                FrameworkConstants.FrameworkIdentifiers.AspNetCore,

                FrameworkConstants.FrameworkIdentifiers.Dnx,
                FrameworkConstants.FrameworkIdentifiers.AspNet
            ];
        });

        public IEnumerable<string> EquivalentFrameworkPrecedence
        {
            get
            {
                return EquivalentFrameworkPrecedenceLazy.Value;
            }
        }

        private static readonly Lazy<KeyValuePair<NuGetFramework, NuGetFramework>[]> ShortNameReplacementsLazy = new(() =>
        {
            return
            [
                new KeyValuePair<NuGetFramework, NuGetFramework>(FrameworkConstants.CommonFrameworks.DotNet50, FrameworkConstants.CommonFrameworks.DotNet)
            ];
        });

        public IEnumerable<KeyValuePair<NuGetFramework, NuGetFramework>> ShortNameReplacements
        {
            get
            {
                return ShortNameReplacementsLazy.Value;
            }
        }

        private static readonly Lazy<KeyValuePair<NuGetFramework, NuGetFramework>[]> FullNameReplacementsLazy = new(() =>
        {
            return
            [
                new KeyValuePair<NuGetFramework, NuGetFramework>(FrameworkConstants.CommonFrameworks.DotNet, FrameworkConstants.CommonFrameworks.DotNet50)
            ];
        });

        public IEnumerable<KeyValuePair<NuGetFramework, NuGetFramework>> FullNameReplacements
        {
            get
            {
                return FullNameReplacementsLazy.Value;
            }
        }

        private static readonly Lazy<IFrameworkMappings> InstanceLazy = new(() => new DefaultFrameworkMappings());

        /// <summary>
        /// Singleton instance of the default framework mappings.
        /// </summary>
        public static IFrameworkMappings Instance
        {
            get
            {
                return InstanceLazy.Value;
            }
        }
    }
}