( filePath: string, serverName: string )
| 299 | } |
| 300 | |
| 301 | export async function removeTomlServer( |
| 302 | filePath: string, |
| 303 | serverName: string |
| 304 | ): Promise<{ removed: boolean }> { |
| 305 | let existing = ""; |
| 306 | try { |
| 307 | existing = await readFile(filePath, "utf-8"); |
| 308 | } catch { |
| 309 | return { removed: false }; |
| 310 | } |
| 311 | |
| 312 | const sectionHeader = `[mcp_servers.${serverName}]`; |
| 313 | const startIdx = existing.indexOf(sectionHeader); |
| 314 | if (startIdx === -1) { |
| 315 | return { removed: false }; |
| 316 | } |
| 317 | |
| 318 | const subPrefix = `[mcp_servers.${serverName}.`; |
| 319 | const rest = existing.slice(startIdx + sectionHeader.length); |
| 320 | |
| 321 | let endOffset = rest.length; |
| 322 | const re = /^\[/gm; |
| 323 | let match: RegExpExecArray | null; |
| 324 | while ((match = re.exec(rest)) !== null) { |
| 325 | const lineEnd = rest.indexOf("\n", match.index); |
| 326 | const line = rest.slice(match.index, lineEnd === -1 ? undefined : lineEnd); |
| 327 | if (!line.startsWith(subPrefix)) { |
| 328 | endOffset = match.index; |
| 329 | break; |
| 330 | } |
| 331 | } |
| 332 | |
| 333 | const rawBefore = existing.slice(0, startIdx).replace(/\n+$/, ""); |
| 334 | const rawAfter = existing.slice(startIdx + sectionHeader.length + endOffset).replace(/^\n+/, ""); |
| 335 | const content = [rawBefore, rawAfter].filter(Boolean).join("\n\n"); |
| 336 | |
| 337 | await mkdir(dirname(filePath), { recursive: true }); |
| 338 | await writeFile(filePath, content.length > 0 ? `${content}\n` : "", "utf-8"); |
| 339 | return { removed: true }; |
| 340 | } |
no test coverage detected