(ideName: string)
| 83 | |
| 84 | // Find all actual plugin directories that exist |
| 85 | async function detectPluginDirectories(ideName: string): Promise<string[]> { |
| 86 | const foundDirectories: string[] = [] |
| 87 | const fs = getFsImplementation() |
| 88 | |
| 89 | const pluginDirPaths = buildCommonPluginDirectoryPaths(ideName) |
| 90 | const idePatterns = ideNameToDirMap[ideName.toLowerCase()] |
| 91 | if (!idePatterns) { |
| 92 | return foundDirectories |
| 93 | } |
| 94 | |
| 95 | // Precompile once — idePatterns is invariant across baseDirs |
| 96 | const regexes = idePatterns.map(p => new RegExp('^' + p)) |
| 97 | |
| 98 | for (const baseDir of pluginDirPaths) { |
| 99 | try { |
| 100 | const entries = await fs.readdir(baseDir) |
| 101 | for (const regex of regexes) { |
| 102 | for (const entry of entries) { |
| 103 | if (!regex.test(entry.name)) continue |
| 104 | // Accept symlinks too — dirent.isDirectory() is false for symlinks, |
| 105 | // but GNU stow users symlink their JetBrains config dirs. Downstream |
| 106 | // fs.stat() calls will filter out symlinks that don't point to dirs. |
| 107 | if (!entry.isDirectory() && !entry.isSymbolicLink()) continue |
| 108 | const dir = join(baseDir, entry.name) |
| 109 | // Linux is the only OS to not have a plugins directory |
| 110 | if (platform() === 'linux') { |
| 111 | foundDirectories.push(dir) |
| 112 | continue |
| 113 | } |
| 114 | const pluginDir = join(dir, 'plugins') |
| 115 | try { |
| 116 | await fs.stat(pluginDir) |
| 117 | foundDirectories.push(pluginDir) |
| 118 | } catch { |
| 119 | // Plugin directory doesn't exist, skip |
| 120 | } |
| 121 | } |
| 122 | } |
| 123 | } catch { |
| 124 | // Ignore errors from stale IDE directories (ENOENT, EACCES, etc.) |
| 125 | continue |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | return foundDirectories.filter( |
| 130 | (dir, index) => foundDirectories.indexOf(dir) === index, |
| 131 | ) |
| 132 | } |
| 133 | |
| 134 | export async function isJetBrainsPluginInstalled( |
| 135 | ideType: IdeType, |
no test coverage detected