import { CodemationPluginPackageMetadata, type CodemationPlugin } from "./CodemationPlugin"; export class CodemationPluginListMerger { constructor(private readonly packageMetadata: CodemationPluginPackageMetadata) {} merge( configuredPlugins: ReadonlyArray, discoveredPlugins: ReadonlyArray, ): ReadonlyArray { const pluginsByPackageId = new Map(); const pluginsByReference = new Set(); const result: CodemationPlugin[] = []; for (const plugin of configuredPlugins) { this.tryAdd(plugin, pluginsByPackageId, pluginsByReference, result); } for (const plugin of discoveredPlugins) { this.tryAdd(plugin, pluginsByPackageId, pluginsByReference, result); } return result; } private tryAdd( plugin: CodemationPlugin, pluginsByPackageId: Map, pluginsByReference: Set, result: CodemationPlugin[], ): void { const packageId = this.packageMetadata.readPackageName(plugin); if (packageId) { if (pluginsByPackageId.has(packageId)) { return; } pluginsByPackageId.set(packageId, plugin); result.push(plugin); return; } if (pluginsByReference.has(plugin)) { return; } pluginsByReference.add(plugin); result.push(plugin); } }