#if UNITY_EDITOR #nullable enable using System.Collections.Generic; using System.Linq; namespace ShrinkSDK.Installer { internal enum ShrinkSdkPackageLayer { Context, Host, Feature, Integration, Tooling } internal sealed class ShrinkSdkPackageEntry { public ShrinkSdkPackageEntry(string displayName, string summary, string packageName, string version, ShrinkSdkPackageLayer layer, bool requiresUniTask = false) { DisplayName = displayName; Summary = summary; PackageName = packageName; Version = version; Layer = layer; RequiresUniTask = requiresUniTask; } public string DisplayName { get; } public string Summary { get; } public string PackageName { get; } public string Version { get; } public ShrinkSdkPackageLayer Layer { get; } public bool RequiresUniTask { get; } } internal sealed class ShrinkSdkPackageBundle { public ShrinkSdkPackageBundle(string displayName, string summary, IReadOnlyList packages, IReadOnlyList? installRoots = null, bool recommended = false) { DisplayName = displayName; Summary = summary; Packages = packages; InstallRoots = installRoots ?? packages; Recommended = recommended; } public string DisplayName { get; } public string Summary { get; } public IReadOnlyList Packages { get; } public IReadOnlyList InstallRoots { get; } public bool Recommended { get; } } internal static class ShrinkSdkPackageCatalog { internal const string RegistryName = "ShrinkSDK"; internal const string RegistryUrl = "https://git.crash.work/api/packages/ShrinkSDK/npm/"; internal const string RegistryScope = "com.cneicy"; internal const string UniTaskPackageName = "com.cysharp.unitask"; internal const string UniTaskGitUrl = "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#7c0f199fe0d3fc528024488ccd671e6c7b27745b"; internal static readonly ShrinkSdkPackageEntry ContextCore = Package( "Context 核心", "可逆效应、响应式依赖与组件生命周期,是框架的组合基础。", "com.cneicy.shrink-context-core", "0.1.0", ShrinkSdkPackageLayer.Context, true); internal static readonly ShrinkSdkPackageEntry ContextAppAdapter = Package( "Context 应用适配", "用 ContextLoader 承载 ShrinkApp 组合根和运行时诊断。", "com.cneicy.shrink-context-app-adapter", "0.1.4", ShrinkSdkPackageLayer.Context, true); internal static readonly ShrinkSdkPackageEntry ContextEventBusAdapter = Package( "Context 事件适配", "把事件订阅纳入 Context 的安装与自动撤回。", "com.cneicy.shrink-context-eventbus-adapter", "0.1.0", ShrinkSdkPackageLayer.Context, true); internal static readonly ShrinkSdkPackageEntry AppCore = Package( "应用宿主", "统一启动、服务门面与应用生命周期。", "com.cneicy.shrink-app-core", "0.1.3", ShrinkSdkPackageLayer.Host, true); internal static readonly ShrinkSdkPackageEntry StarterBasic = Package( "基础应用起步包", "默认 Context 组合根,包含命令、存档、网络及其集成。", "com.cneicy.shrink-app-starter-basic", "0.2.1", ShrinkSdkPackageLayer.Host, true); internal static readonly ShrinkSdkPackageEntry Command = Package( "命令系统", "命令路由、参数、权限与自动注册。", "com.cneicy.shrink-command", "0.2.0", ShrinkSdkPackageLayer.Feature, true); internal static readonly ShrinkSdkPackageEntry DataSaver = Package( "存档系统", "异步存档、设置、备份恢复与数据观察。", "com.cneicy.shrink-datasaver", "2.2.2", ShrinkSdkPackageLayer.Feature, true); internal static readonly ShrinkSdkPackageEntry EventBus = Package( "事件总线", "类型安全事件、请求结果、调度与代码生成。", "com.cneicy.shrink-eventbus", "2.0.0", ShrinkSdkPackageLayer.Feature, true); internal static readonly ShrinkSdkPackageEntry EventBusEntities = Package( "Entities 事件适配", "将事件总线接入 Unity Entities。", "com.cneicy.shrink-eventbus-entities", "0.1.0", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry ModFramework = Package( "模组框架", "Context 托管的模组生命周期、热替换与外部 DLL 加载。", "com.cneicy.shrink-mod-framework", "0.2.3", ShrinkSdkPackageLayer.Feature, true); internal static readonly ShrinkSdkPackageEntry Network = Package( "网络系统", "消息、RPC、权限、序列化与多种传输层。", "com.cneicy.shrink-network", "0.2.1", ShrinkSdkPackageLayer.Feature, true); internal static readonly ShrinkSdkPackageEntry Tutorial = Package( "引导系统", "可复用的步骤式引导、遮罩、锚点与进度存储。", "com.cneicy.shrink-tutorial", "0.1.2", ShrinkSdkPackageLayer.Feature); internal static readonly ShrinkSdkPackageEntry CommandApp = Package( "命令 - 应用集成", "以原生 Context 组件向应用宿主发布命令服务。", "com.cneicy.shrink-command-integration-app", "0.1.2", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry CommandEventBus = Package( "命令 - 事件集成", "通过事件总线执行命令并发布执行状态。", "com.cneicy.shrink-command-integration-eventbus", "0.1.1", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry CommandNetwork = Package( "命令 - 网络集成", "通过网络 RPC 执行远程命令。", "com.cneicy.shrink-command-integration-network", "0.1.1", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry DataSaverApp = Package( "存档 - 应用集成", "以原生 Context 组件向应用宿主发布存档服务。", "com.cneicy.shrink-datasaver-integration-app", "0.1.2", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry DataSaverEventBus = Package( "存档 - 事件集成", "通过事件总线请求读写并观察存档变化。", "com.cneicy.shrink-datasaver-integration-eventbus", "2.1.2", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry NetworkApp = Package( "网络 - 应用集成", "以原生 Context 组件向应用宿主发布网络服务。", "com.cneicy.shrink-network-integration-app", "0.1.2", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry NetworkEventBus = Package( "网络 - 事件集成", "把网络消息与事件请求桥接为可撤回的 Context 组件。", "com.cneicy.shrink-network-integration-eventbus", "0.1.2", ShrinkSdkPackageLayer.Integration, true); internal static readonly ShrinkSdkPackageEntry SharedCodeGen = Package( "共享代码生成", "各功能包使用的编译期注册表基础设施。", "com.cneicy.shrink-shared-codegen", "0.1.0", ShrinkSdkPackageLayer.Tooling); internal static readonly IReadOnlyList Packages = new[] { ContextCore, ContextAppAdapter, ContextEventBusAdapter, AppCore, StarterBasic, Command, DataSaver, EventBus, ModFramework, Network, Tutorial, CommandApp, CommandEventBus, CommandNetwork, DataSaverApp, DataSaverEventBus, NetworkApp, NetworkEventBus, EventBusEntities, SharedCodeGen }; internal static readonly IReadOnlyList Bundles = new[] { new ShrinkSdkPackageBundle( "基础应用(推荐)", "直接获得以 ContextLoader 为组合根的命令、存档、网络基础应用。", new[] { ContextCore, ContextAppAdapter, ContextEventBusAdapter, AppCore, Command, DataSaver, EventBus, Network, CommandApp, CommandEventBus, CommandNetwork, DataSaverApp, DataSaverEventBus, NetworkApp, NetworkEventBus, StarterBasic }, new[] { StarterBasic, ContextEventBusAdapter }, recommended: true), new ShrinkSdkPackageBundle( "Context 最小基座", "只安装组合内核,适合自行编写 IShrinkComponent 与组合根。", new[] { ContextCore }), new ShrinkSdkPackageBundle( "Context 应用宿主", "安装应用宿主、ContextLoader 适配与事件生命周期适配,不预装业务模块。", new[] { ContextCore, EventBus, AppCore, ContextAppAdapter, ContextEventBusAdapter }, new[] { ContextAppAdapter, ContextEventBusAdapter }), new ShrinkSdkPackageBundle( "事件与命令", "安装 Context 托管的事件订阅和命令执行链。", new[] { ContextCore, EventBus, ContextEventBusAdapter, Command, CommandEventBus }, new[] { ContextEventBusAdapter, CommandEventBus }), new ShrinkSdkPackageBundle( "存档能力", "安装存档系统及 Context 托管的事件桥接。", new[] { ContextCore, EventBus, ContextEventBusAdapter, DataSaver, DataSaverEventBus }, new[] { ContextEventBusAdapter, DataSaverEventBus }), new ShrinkSdkPackageBundle( "网络能力", "安装网络系统及 Context 托管的事件桥接。", new[] { ContextCore, EventBus, ContextEventBusAdapter, Network, NetworkEventBus }, new[] { ContextEventBusAdapter, NetworkEventBus }), new ShrinkSdkPackageBundle( "模组开发", "安装以 Context 管理生命周期和热替换的模组框架。", new[] { ContextCore, EventBus, ModFramework }, new[] { ModFramework }), new ShrinkSdkPackageBundle( "常用完整套件", "基础应用、模组框架与引导系统;不包含需要 Entities 的可选适配。", new[] { ContextCore, ContextAppAdapter, ContextEventBusAdapter, AppCore, Command, DataSaver, EventBus, Network, ModFramework, Tutorial, CommandApp, CommandEventBus, CommandNetwork, DataSaverApp, DataSaverEventBus, NetworkApp, NetworkEventBus, StarterBasic }, new[] { StarterBasic, ContextEventBusAdapter, ModFramework, Tutorial }) }; internal static IReadOnlyList DistinctInstallRoots( IEnumerable packages) => packages .GroupBy(entry => entry.PackageName) .Select(group => group.First()) .ToArray(); private static ShrinkSdkPackageEntry Package(string displayName, string summary, string packageName, string version, ShrinkSdkPackageLayer layer, bool requiresUniTask = false) => new(displayName, summary, packageName, version, layer, requiresUniTask); } } #endif