this repo has no description

Skip multiple extensions with the same ID

+17 -5
+17 -5
packages/core/src/extension.ts
··· 24 24 return ret; 25 25 } 26 26 27 - async function loadDetectedExtensions(dir: string, type: ExtensionLoadSource): Promise<DetectedExtension[]> { 27 + async function loadDetectedExtensions( 28 + dir: string, 29 + type: ExtensionLoadSource, 30 + seen: Set<string> 31 + ): Promise<DetectedExtension[]> { 28 32 const ret: DetectedExtension[] = []; 29 33 30 34 const manifests = await findManifests(dir); ··· 34 38 const dir = moonlightFS.dirname(manifestPath); 35 39 36 40 const manifest: ExtensionManifest = JSON.parse(await moonlightFS.readFileString(manifestPath)); 41 + if (seen.has(manifest.id)) { 42 + logger.warn(`Duplicate extension found, skipping: ${manifest.id}`); 43 + continue; 44 + } 45 + seen.add(manifest.id); 37 46 38 47 const webPath = moonlightFS.join(dir, "index.js"); 39 48 const nodePath = moonlightFS.join(dir, "node.js"); ··· 92 101 async function getExtensionsNative(): Promise<DetectedExtension[]> { 93 102 const config = await readConfig(); 94 103 const res = []; 104 + const seen = new Set<string>(); 95 105 96 - res.push(...(await loadDetectedExtensions(getCoreExtensionsPath(), ExtensionLoadSource.Core))); 106 + res.push(...(await loadDetectedExtensions(getCoreExtensionsPath(), ExtensionLoadSource.Core, seen))); 97 107 98 - res.push(...(await loadDetectedExtensions(await getExtensionsPath(), ExtensionLoadSource.Normal))); 108 + res.push(...(await loadDetectedExtensions(await getExtensionsPath(), ExtensionLoadSource.Normal, seen))); 99 109 100 110 for (const devSearchPath of config.devSearchPaths ?? []) { 101 - res.push(...(await loadDetectedExtensions(devSearchPath, ExtensionLoadSource.Developer))); 111 + res.push(...(await loadDetectedExtensions(devSearchPath, ExtensionLoadSource.Developer, seen))); 102 112 } 103 113 104 114 return res; ··· 106 116 107 117 async function getExtensionsBrowser(): Promise<DetectedExtension[]> { 108 118 const ret: DetectedExtension[] = []; 119 + const seen = new Set<string>(); 109 120 110 121 const coreExtensionsFs: Record<string, string> = JSON.parse( 111 122 // @ts-expect-error shut up ··· 137 148 webpackModules: wpModules 138 149 } 139 150 }); 151 + seen.add(manifest.id); 140 152 } 141 153 142 154 if (await moonlightFS.exists("/extensions")) { 143 - ret.push(...(await loadDetectedExtensions("/extensions", ExtensionLoadSource.Normal))); 155 + ret.push(...(await loadDetectedExtensions("/extensions", ExtensionLoadSource.Normal, seen))); 144 156 } 145 157 146 158 return ret;