58 lines · 2.0 KB · TypeScript
RawDownload
import * as Effect from "effect/Effect";import * as FileSystem from "effect/FileSystem";import * as Layer from "effect/Layer";import * as Path from "effect/Path"; import {  WorkspaceFileSystem,  WorkspaceFileSystemError,  type WorkspaceFileSystemShape,} from "../Services/WorkspaceFileSystem.ts";import { WorkspaceEntries } from "../Services/WorkspaceEntries.ts";import { WorkspacePaths } from "../Services/WorkspacePaths.ts"; export const makeWorkspaceFileSystem = Effect.gen(function* () {  const fileSystem = yield* FileSystem.FileSystem;  const path = yield* Path.Path;  const workspacePaths = yield* WorkspacePaths;  const workspaceEntries = yield* WorkspaceEntries;   const writeFile: WorkspaceFileSystemShape["writeFile"] = Effect.fn(    "WorkspaceFileSystem.writeFile",  )(function* (input) {    const target = yield* workspacePaths.resolveRelativePathWithinRoot({      workspaceRoot: input.cwd,      relativePath: input.relativePath,    });     yield* fileSystem.makeDirectory(path.dirname(target.absolutePath), { recursive: true }).pipe(      Effect.mapError(        (cause) =>          new WorkspaceFileSystemError({            cwd: input.cwd,            relativePath: input.relativePath,            operation: "workspaceFileSystem.makeDirectory",            detail: cause.message,            cause,          }),      ),    );    yield* fileSystem.writeFileString(target.absolutePath, input.contents).pipe(      Effect.mapError(        (cause) =>          new WorkspaceFileSystemError({            cwd: input.cwd,            relativePath: input.relativePath,            operation: "workspaceFileSystem.writeFile",            detail: cause.message,            cause,          }),      ),    );    yield* workspaceEntries.invalidate(input.cwd);    return { relativePath: target.relativePath };  });  return { writeFile } satisfies WorkspaceFileSystemShape;}); export const WorkspaceFileSystemLive = Layer.effect(WorkspaceFileSystem, makeWorkspaceFileSystem);