Files
continue/core/util/filesystem.ts
2026-01-16 15:42:30 +05:30

288 lines
6.5 KiB
TypeScript

import * as fs from "node:fs";
import { fileURLToPath } from "node:url";
import {
DocumentSymbol,
FileStatsMap,
FileType,
IDE,
IdeInfo,
IdeSettings,
IndexTag,
Location,
Problem,
Range,
RangeInFile,
SignatureHelp,
TerminalOptions,
Thread,
ToastType,
} from "../index.js";
class FileSystemIde implements IDE {
constructor(private readonly workspaceDir: string) {}
async readSecrets(keys: string[]): Promise<Record<string, string>> {
return {};
}
async writeSecrets(secrets: { [key: string]: string }): Promise<void> {}
showToast(
type: ToastType,
message: string,
...otherParams: any[]
): Promise<void> {
return Promise.resolve();
}
fileExists(fileUri: string): Promise<boolean> {
const filepath = fileURLToPath(fileUri);
return Promise.resolve(fs.existsSync(filepath));
}
gotoDefinition(location: Location): Promise<RangeInFile[]> {
return Promise.resolve([]);
}
gotoTypeDefinition(location: Location): Promise<RangeInFile[]> {
return Promise.resolve([]);
}
getSignatureHelp(location: Location): Promise<SignatureHelp | null> {
return Promise.resolve(null);
}
getReferences(location: Location): Promise<RangeInFile[]> {
return Promise.resolve([]);
}
getDocumentSymbols(fileUri: string): Promise<DocumentSymbol[]> {
return Promise.resolve([]);
}
onDidChangeActiveTextEditor(callback: (fileUri: string) => void): void {
return;
}
isWorkspaceRemote(): Promise<boolean> {
return Promise.resolve(false);
}
async getIdeSettings(): Promise<IdeSettings> {
return {
remoteConfigServerUrl: undefined,
remoteConfigSyncPeriod: 60,
userToken: "",
continueTestEnvironment: "none",
pauseCodebaseIndexOnStart: false,
};
}
async getFileStats(fileUris: string[]): Promise<FileStatsMap> {
const result: FileStatsMap = {};
for (const uri of fileUris) {
try {
const filepath = fileURLToPath(uri);
const stats = fs.statSync(filepath);
result[uri] = {
lastModified: stats.mtimeMs,
size: stats.size,
};
} catch (error) {
console.error(`Error getting last modified time for ${uri}:`, error);
}
}
return result;
}
getGitRootPath(dir: string): Promise<string | undefined> {
return Promise.resolve(dir);
}
async listDir(dir: string): Promise<[string, FileType][]> {
const filepath = fileURLToPath(dir);
const all: [string, FileType][] = fs
.readdirSync(filepath, { withFileTypes: true })
.map((dirent: any) => [
dirent.name,
dirent.isDirectory()
? (2 as FileType.Directory)
: dirent.isSymbolicLink()
? (64 as FileType.SymbolicLink)
: (1 as FileType.File),
]);
return Promise.resolve(all);
}
getRepoName(dir: string): Promise<string | undefined> {
return Promise.resolve(undefined);
}
async getTags(artifactId: string): Promise<IndexTag[]> {
const directory = (await this.getWorkspaceDirs())[0];
return [
{
artifactId,
branch: await this.getBranch(directory),
directory,
},
];
}
getIdeInfo(): Promise<IdeInfo> {
return Promise.resolve({
ideType: "vscode",
name: "na",
version: "0.1",
remoteName: "na",
extensionVersion: "na",
isPrerelease: false,
});
}
readRangeInFile(fileUri: string, range: Range): Promise<string> {
return Promise.resolve("");
}
isTelemetryEnabled(): Promise<boolean> {
return Promise.resolve(true);
}
getUniqueId(): Promise<string> {
return Promise.resolve("NOT_UNIQUE");
}
getDiff(includeUnstaged: boolean): Promise<string[]> {
return Promise.resolve([]);
}
getClipboardContent(): Promise<{ text: string; copiedAt: string }> {
return Promise.resolve({ text: "", copiedAt: new Date().toISOString() });
}
getTerminalContents(): Promise<string> {
return Promise.resolve("");
}
async getDebugLocals(threadIndex: number): Promise<string> {
return Promise.resolve("");
}
async getTopLevelCallStackSources(
threadIndex: number,
stackDepth: number,
): Promise<string[]> {
return Promise.resolve([]);
}
async getAvailableThreads(): Promise<Thread[]> {
return Promise.resolve([]);
}
showLines(
fileUri: string,
startLine: number,
endLine: number,
): Promise<void> {
return Promise.resolve();
}
getWorkspaceDirs(): Promise<string[]> {
return Promise.resolve([this.workspaceDir]);
}
writeFile(fileUri: string, contents: string): Promise<void> {
const filepath = fileURLToPath(fileUri);
return new Promise((resolve, reject) => {
fs.writeFile(filepath, contents, (err) => {
if (err) {
reject(err);
}
resolve();
});
});
}
removeFile(fileUri: string): Promise<void> {
const filepath = fileURLToPath(fileUri);
return new Promise((resolve, reject) => {
fs.unlink(filepath, (err) => {
if (err) {
reject(err);
}
resolve();
});
});
}
showVirtualFile(title: string, contents: string): Promise<void> {
return Promise.resolve();
}
openFile(path: string): Promise<void> {
return Promise.resolve();
}
openUrl(url: string): Promise<void> {
return Promise.resolve();
}
runCommand(command: string, options?: TerminalOptions): Promise<void> {
return Promise.resolve();
}
saveFile(fileUri: string): Promise<void> {
return Promise.resolve();
}
readFile(fileUri: string): Promise<string> {
const filepath = fileURLToPath(fileUri);
return new Promise((resolve, reject) => {
fs.readFile(filepath, "utf8", (err, contents) => {
if (err) {
reject(err);
}
resolve(contents);
});
});
}
getCurrentFile(): Promise<undefined> {
return Promise.resolve(undefined);
}
getBranch(dir: string): Promise<string> {
return Promise.resolve("");
}
getOpenFiles(): Promise<string[]> {
return Promise.resolve([]);
}
getPinnedFiles(): Promise<string[]> {
return Promise.resolve([]);
}
async getSearchResults(query: string, maxResults?: number): Promise<string> {
return "";
}
async getFileResults(
pattern: string,
maxResults?: number,
): Promise<string[]> {
return [];
}
async getProblems(fileUri?: string | undefined): Promise<Problem[]> {
return Promise.resolve([]);
}
async subprocess(command: string, cwd?: string): Promise<[string, string]> {
return ["", ""];
}
}
export default FileSystemIde;