| import { describe, expect, test } from 'bun:test' |
|
|
| import type { LoadedPlugin } from '../../types/plugin.js' |
| import { mergePluginSources } from './pluginLoader.js' |
|
|
| function marketplacePlugin( |
| name: string, |
| marketplace: string, |
| enabled: boolean, |
| ): LoadedPlugin { |
| const pluginId = `${name}@${marketplace}` |
| return { |
| name, |
| manifest: { name } as LoadedPlugin['manifest'], |
| path: `/tmp/${pluginId}`, |
| source: pluginId, |
| repository: pluginId, |
| enabled, |
| } |
| } |
|
|
| describe('mergePluginSources', () => { |
| test('keeps the enabled copy when duplicate marketplace plugins disagree on enabled state', () => { |
| const enabledOfficial = marketplacePlugin( |
| 'frontend-design', |
| 'claude-plugins-official', |
| true, |
| ) |
| const disabledLegacy = marketplacePlugin( |
| 'frontend-design', |
| 'claude-code-plugins', |
| false, |
| ) |
|
|
| const result = mergePluginSources({ |
| session: [], |
| marketplace: [disabledLegacy, enabledOfficial], |
| builtin: [], |
| }) |
|
|
| expect(result.plugins).toEqual([enabledOfficial]) |
| expect(result.errors).toEqual([]) |
| }) |
|
|
| test('keeps the later copy when duplicate marketplace plugins are both enabled', () => { |
| const legacy = marketplacePlugin( |
| 'frontend-design', |
| 'claude-code-plugins', |
| true, |
| ) |
| const official = marketplacePlugin( |
| 'frontend-design', |
| 'claude-plugins-official', |
| true, |
| ) |
|
|
| const result = mergePluginSources({ |
| session: [], |
| marketplace: [legacy, official], |
| builtin: [], |
| }) |
|
|
| expect(result.plugins).toEqual([official]) |
| expect(result.errors).toHaveLength(1) |
| expect(result.errors[0]).toMatchObject({ |
| type: 'generic-error', |
| source: legacy.source, |
| plugin: legacy.name, |
| }) |
| }) |
| }) |
|
|