Support env vars, line endings, add glob ignore patterns, clean up deps

This commit is contained in:
Andras Schmelczer 2026-03-28 10:50:37 +00:00
commit b83031e3e6

View file

@ -6,6 +6,7 @@ import type {
RelativePath,
TextWithCursors
} from "sync-client";
import { toUnixPath } from "./path-utils";
export class NodeFileSystemOperations implements FileSystemOperations {
public constructor(private readonly basePath: string) {}
@ -15,7 +16,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
): Promise<RelativePath[]> {
const files: RelativePath[] = [];
await this.walkDirectory(
directory !== undefined ? this.toNativePath(directory) : "",
directory ?? "",
files
);
return files;
@ -24,7 +25,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
public async read(relativePath: RelativePath): Promise<Uint8Array> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
return await fs.readFile(fullPath);
@ -41,13 +42,13 @@ export class NodeFileSystemOperations implements FileSystemOperations {
): Promise<void> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
const dir = path.dirname(fullPath);
try {
await fs.mkdir(dir, { recursive: true });
await fs.writeFile(fullPath, content);
await this.atomicWrite(fullPath, content);
} catch (error) {
throw new Error(
`Failed to write file ${fullPath}: ${error instanceof Error ? error.message : String(error)}`
@ -61,13 +62,13 @@ export class NodeFileSystemOperations implements FileSystemOperations {
): Promise<string> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
const currentContent = await fs.readFile(fullPath, "utf-8");
const result = updater({ text: currentContent, cursors: [] });
await fs.writeFile(fullPath, result.text, "utf-8");
await this.atomicWrite(fullPath, result.text, "utf-8");
return result.text;
} catch (error) {
throw new Error(
@ -79,7 +80,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
public async getFileSize(relativePath: RelativePath): Promise<number> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
const stats = await fs.stat(fullPath);
@ -94,7 +95,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
public async exists(relativePath: RelativePath): Promise<boolean> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
await fs.access(fullPath);
@ -107,7 +108,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
public async createDirectory(relativePath: RelativePath): Promise<void> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
await fs.mkdir(fullPath, { recursive: false });
@ -121,7 +122,7 @@ export class NodeFileSystemOperations implements FileSystemOperations {
public async delete(relativePath: RelativePath): Promise<void> {
const fullPath = path.join(
this.basePath,
this.toNativePath(relativePath)
relativePath
);
try {
await fs.unlink(fullPath);
@ -136,14 +137,8 @@ export class NodeFileSystemOperations implements FileSystemOperations {
oldPath: RelativePath,
newPath: RelativePath
): Promise<void> {
const oldFullPath = path.join(
this.basePath,
this.toNativePath(oldPath)
);
const newFullPath = path.join(
this.basePath,
this.toNativePath(newPath)
);
const oldFullPath = path.join(this.basePath, oldPath);
const newFullPath = path.join(this.basePath, newPath);
const newDir = path.dirname(newFullPath);
try {
@ -156,6 +151,19 @@ export class NodeFileSystemOperations implements FileSystemOperations {
}
}
private async atomicWrite(
fullPath: string,
content: Uint8Array | string,
encoding?: BufferEncoding
): Promise<void> {
const tmpPath = fullPath + ".tmp";
await fs.writeFile(tmpPath, content, encoding);
const fd = await fs.open(tmpPath, "r");
await fd.datasync();
await fd.close();
await fs.rename(tmpPath, fullPath);
}
private async walkDirectory(
relativePath: string,
files: RelativePath[]
@ -179,28 +187,9 @@ export class NodeFileSystemOperations implements FileSystemOperations {
await this.walkDirectory(entryRelativePath, files);
} else if (entry.isFile()) {
// Always return forward slashes
files.push(this.toUnixPath(entryRelativePath));
files.push(toUnixPath(entryRelativePath));
}
}
}
/**
* Convert a forward-slash path to native platform path separators
*/
private toNativePath(relativePath: string): string {
if (path.sep === "\\") {
return relativePath.replace(/\//g, "\\");
}
return relativePath;
}
/**
* Convert a native platform path to forward slashes
*/
private toUnixPath(nativePath: string): string {
if (path.sep === "\\") {
return nativePath.replace(/\\/g, "/");
}
return nativePath;
}
}