diff --git a/vscode/src/extension.ts b/vscode/src/extension.ts index ea022727..503b4ebc 100644 --- a/vscode/src/extension.ts +++ b/vscode/src/extension.ts @@ -15,7 +15,8 @@ import { activateReporter, reportEvent, analytics } from "./analytics"; import { showFirstRunPrivacyNotice, showPrivacySettings } from "./privacyNotice"; import { Template, getTemplates, scaffoldTemplate } from "./templateUtils"; - +import { activateUpdateImportsOnFileMove } from "./updateImportsOnFileMove"; +import { activateUpdateImportsOnFileMove } from "./updateImportsOnFileMove"; // the application insights key (also known as instrumentation key) @@ -29,6 +30,7 @@ let process: execa.ExecaChildProcess | undefined; const FLYDE_DEFAULT_SERVER_PORT = 8545; export function activate(context: vscode.ExtensionContext) { + activateUpdateImportsOnFileMove(context); // eslint-disable-next-line @typescript-eslint/naming-convention const { Uri } = vscode; const { fs } = vscode.workspace; diff --git a/vscode/src/updateImportsOnFileMove.ts b/vscode/src/updateImportsOnFileMove.ts new file mode 100644 index 00000000..bc25027a --- /dev/null +++ b/vscode/src/updateImportsOnFileMove.ts @@ -0,0 +1,58 @@ +import * as vscode from "vscode"; +import * as path from "path"; + +export function activateUpdateImportsOnFileMove(context: vscode.ExtensionContext) { + const disposable = vscode.workspace.onDidRenameFiles(async (event) => { + for (const { oldUri, newUri } of event.files) { + if (!oldUri.fsPath.endsWith(".flyde")) continue; + + const flydeFiles = await vscode.workspace.findFiles( + "**/*.flyde", + "**/node_modules/**" + ); + + const oldPath = vscode.workspace.asRelativePath(oldUri, false); + const newPath = vscode.workspace.asRelativePath(newUri, false); + const oldBaseName = path.basename(oldUri.fsPath, ".flyde"); + const newBaseName = path.basename(newUri.fsPath, ".flyde"); + + for (const file of flydeFiles) { + if (file.fsPath === newUri.fsPath) continue; + + try { + const doc = await vscode.workspace.openTextDocument(file); + const text = doc.getText(); + + if (text.includes(oldPath) || text.includes(oldBaseName)) { + let updatedText = text; + updatedText = updatedText.split(oldPath).join(newPath); + if (oldBaseName !== newBaseName) { + updatedText = updatedText.split(oldBaseName).join(newBaseName); + } + + if (updatedText !== text) { + const edit = new vscode.WorkspaceEdit(); + edit.replace( + file, + new vscode.Range( + new vscode.Position(0, 0), + new vscode.Position(doc.lineCount, 0) + ), + updatedText + ); + await vscode.workspace.applyEdit(edit); + await doc.save(); + vscode.window.showInformationMessage( + `Updated imports in ${path.basename(file.fsPath)} after file move.` + ); + } + } + } catch (err) { + console.error(`Failed to update imports in ${file.fsPath}:`, err); + } + } + } + }); + + context.subscriptions.push(disposable); +}