89 lines · 2.9 KB · TypeScript
RawDownload
import * as NodeServices from "@effect/platform-node/NodeServices";import { it, describe, expect } from "@effect/vitest";import * as Effect from "effect/Effect";import * as FileSystem from "effect/FileSystem";import * as Layer from "effect/Layer";import * as Option from "effect/Option";import * as Path from "effect/Path"; import * as T3ProjectFileLoader from "./T3ProjectFileLoader.ts"; const TestLayer = Layer.empty.pipe(  Layer.provideMerge(T3ProjectFileLoader.layer),  Layer.provideMerge(NodeServices.layer),); const makeTempDir = Effect.gen(function* () {  const fileSystem = yield* FileSystem.FileSystem;  return yield* fileSystem.makeTempDirectoryScoped({    prefix: "t3code-project-file-",  });}); const writeProjectFile = Effect.fn("writeProjectFile")(function* (cwd: string, contents: string) {  const fileSystem = yield* FileSystem.FileSystem;  const path = yield* Path.Path;  yield* fileSystem.writeFileString(path.join(cwd, "t3.json"), contents).pipe(Effect.orDie);}); it.layer(TestLayer)("T3ProjectFileLoader", (it) => {  describe("load", () => {    it.effect("loads and decodes a valid t3.json", () =>      Effect.gen(function* () {        const loader = yield* T3ProjectFileLoader.T3ProjectFileLoader;        const cwd = yield* makeTempDir;        yield* writeProjectFile(          cwd,          `{            // JSONC is tolerated            "iconPath": "assets/logo.svg",            "scripts": [{ "name": "Dev", "command": "pnpm dev" }],          }`,        );         const loaded = yield* loader.load(cwd);         expect(Option.isSome(loaded)).toBe(true);        if (Option.isSome(loaded)) {          expect(loaded.value.iconPath).toBe("assets/logo.svg");          expect(loaded.value.scripts).toEqual([{ name: "Dev", command: "pnpm dev" }]);        }      }),    );     it.effect("returns none when t3.json is missing", () =>      Effect.gen(function* () {        const loader = yield* T3ProjectFileLoader.T3ProjectFileLoader;        const cwd = yield* makeTempDir;         const loaded = yield* loader.load(cwd);         expect(Option.isNone(loaded)).toBe(true);      }),    );     it.effect("returns none for malformed JSON without failing", () =>      Effect.gen(function* () {        const loader = yield* T3ProjectFileLoader.T3ProjectFileLoader;        const cwd = yield* makeTempDir;        yield* writeProjectFile(cwd, "{ not json");         const loaded = yield* loader.load(cwd);         expect(Option.isNone(loaded)).toBe(true);      }),    );     it.effect("returns none for schema-invalid files without failing", () =>      Effect.gen(function* () {        const loader = yield* T3ProjectFileLoader.T3ProjectFileLoader;        const cwd = yield* makeTempDir;        yield* writeProjectFile(cwd, '{ "scripts": [{ "name": "Dev" }] }');         const loaded = yield* loader.load(cwd);         expect(Option.isNone(loaded)).toBe(true);      }),    );  });});