diff --git a/src/dev/builder.ts b/src/dev/builder.ts index bfa6c91f293..a32c4b5fa87 100644 --- a/src/dev/builder.ts +++ b/src/dev/builder.ts @@ -5,7 +5,6 @@ import { type ListenOptions, setBuildCache, } from "../app.ts"; -import { fsAdapter } from "../fs.ts"; import * as path from "@std/path"; import * as colors from "@std/fmt/colors"; import { bundleJs } from "./esbuild.ts"; @@ -44,7 +43,7 @@ export interface FreshBuilder { } export class Builder implements FreshBuilder { - #transformer = new FreshFileTransformer(fsAdapter); + #transformer = new FreshFileTransformer(); #addedInternalTransforms = false; #options: { target: string | string[] }; diff --git a/src/dev/file_transformer.ts b/src/dev/file_transformer.ts index 190a54a4328..f9ad1fd0d4a 100644 --- a/src/dev/file_transformer.ts +++ b/src/dev/file_transformer.ts @@ -1,4 +1,3 @@ -import type { FsAdapter } from "../fs.ts"; import { BUILD_ID } from "../runtime/build_id.ts"; import { assetInternal } from "../runtime/shared_internal.tsx"; @@ -56,11 +55,6 @@ interface TransformReq { export class FreshFileTransformer { #transformers: Transformer[] = []; - #fs: FsAdapter; - - constructor(fs: FsAdapter) { - this.#fs = fs; - } onTransform(options: OnTransformOptions, callback: TransformFn): void { this.#transformers.push({ options, fn: callback }); @@ -86,7 +80,7 @@ export class FreshFileTransformer { let content: Uint8Array; try { - content = await this.#fs.readFile(filePath); + content = await Deno.readFile(filePath); } catch (err) { if (err instanceof Deno.errors.NotFound) { return null; diff --git a/src/dev/file_transformer_test.ts b/src/dev/file_transformer_test.ts index e8537fa2f41..293c6a40555 100644 --- a/src/dev/file_transformer_test.ts +++ b/src/dev/file_transformer_test.ts @@ -1,27 +1,17 @@ import { expect } from "@std/expect"; -import type { FsAdapter } from "../fs.ts"; import { FreshFileTransformer, type ProcessedFile, } from "./file_transformer.ts"; import { delay } from "../test_utils.ts"; +import { stub } from "@std/testing/mock"; -function testTransformer(files: Record) { - const mockFs: FsAdapter = { - cwd: () => "/", - isDirectory: () => Promise.resolve(false), - mkdirp: () => Promise.resolve(), - walk: async function* foo() { - }, - readFile: (file) => { - if (file instanceof URL) throw new Error("Not supported"); - // deno-lint-ignore no-explicit-any - const content = (files as any)[file]; - const buf = new TextEncoder().encode(content); - return Promise.resolve(buf); - }, - }; - return new FreshFileTransformer(mockFs); +function stubDenoReadFile(content: string) { + return stub(Deno, "readFile", () => { + return Promise.resolve( + new TextEncoder().encode(content) as Uint8Array, + ); + }); } function consumeResult(result: ProcessedFile[]) { @@ -52,9 +42,8 @@ function consumeResult(result: ProcessedFile[]) { } Deno.test("FileTransformer - transform sync", async () => { - const transformer = testTransformer({ - "foo.txt": "foo", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("foo"); transformer.onTransform({ pluginName: "foo", filter: /.*/ }, (args) => { return { @@ -70,9 +59,8 @@ Deno.test("FileTransformer - transform sync", async () => { }); Deno.test("FileTransformer - transform async", async () => { - const transformer = testTransformer({ - "foo.txt": "foo", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("foo"); transformer.onTransform({ pluginName: "foo", filter: /.*/ }, async (args) => { await delay(1); @@ -89,9 +77,8 @@ Deno.test("FileTransformer - transform async", async () => { }); Deno.test("FileTransformer - transform return Uint8Array", async () => { - const transformer = testTransformer({ - "foo.txt": "foo", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("foo"); transformer.onTransform({ pluginName: "foo", filter: /.*/ }, () => { return { @@ -107,9 +94,8 @@ Deno.test("FileTransformer - transform return Uint8Array", async () => { }); Deno.test("FileTransformer - pass transformed content", async () => { - const transformer = testTransformer({ - "input.txt": "input", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("input"); transformer.onTransform({ pluginName: "A", filter: /.*/ }, (args) => { return { @@ -137,9 +123,8 @@ Deno.test("FileTransformer - pass transformed content", async () => { Deno.test( "FileTransformer - pass transformed content with multiple", async () => { - const transformer = testTransformer({ - "input.txt": "input", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("input"); transformer.onTransform({ pluginName: "A", filter: /.*/ }, (args) => { return [{ @@ -167,9 +152,8 @@ Deno.test( ); Deno.test("FileTransformer - return multiple results", async () => { - const transformer = testTransformer({ - "foo.txt": "foo", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("foo"); const received: string[] = []; transformer.onTransform({ pluginName: "A", filter: /foo\.txt$/ }, () => { @@ -197,9 +181,8 @@ Deno.test("FileTransformer - return multiple results", async () => { Deno.test( "FileTransformer - track input files through temporary results", async () => { - const transformer = testTransformer({ - "foo.txt": "foo", - }); + const transformer = new FreshFileTransformer(); + using _stub = stubDenoReadFile("foo"); transformer.onTransform({ pluginName: "A", filter: /foo\.txt$/ }, () => { return [{ diff --git a/src/fs.ts b/src/fs.ts index 51a48ea455f..48216dff5e9 100644 --- a/src/fs.ts +++ b/src/fs.ts @@ -1,19 +1,16 @@ import { walk, type WalkEntry, type WalkOptions } from "@std/fs/walk"; export interface FsAdapter { - cwd(): string; walk( root: string | URL, options?: WalkOptions, ): AsyncIterableIterator; isDirectory(path: string | URL): Promise; mkdirp(dir: string): Promise; - readFile(path: string | URL): Promise; } export const fsAdapter: FsAdapter = { walk, - cwd: Deno.cwd, async isDirectory(path) { try { const stat = await Deno.stat(path); @@ -32,5 +29,4 @@ export const fsAdapter: FsAdapter = { } } }, - readFile: Deno.readFile, }; diff --git a/src/plugins/fs_routes/mod.ts b/src/plugins/fs_routes/mod.ts index 9a7c985587b..35d6d7c0970 100644 --- a/src/plugins/fs_routes/mod.ts +++ b/src/plugins/fs_routes/mod.ts @@ -72,7 +72,7 @@ export async function fsRoutes( const fs = options._fs ?? fsAdapter; const dir = options.dir - ? parseRootPath(options.dir, fs.cwd()) + ? parseRootPath(options.dir, Deno.cwd()) : app.config.root; const islandDir = path.join(dir, "islands"); const routesDir = path.join(dir, "routes"); diff --git a/src/plugins/fs_routes/mod_test.tsx b/src/plugins/fs_routes/mod_test.tsx index c1e957b4a4e..d1f872a8f92 100644 --- a/src/plugins/fs_routes/mod_test.tsx +++ b/src/plugins/fs_routes/mod_test.tsx @@ -13,11 +13,13 @@ import { type HandlerByMethod, type HandlerFn, page } from "../../handlers.ts"; import type { Method } from "../../router.ts"; import { parseHtml } from "../../../tests/test_utils.tsx"; import type { FreshContext } from "fresh"; +import { stub } from "@std/testing/mock"; async function createServer( files: Record>, ): Promise { const app = new App(); + using _stub = stub(Deno, "cwd", () => "."); await fsRoutes( app, diff --git a/src/test_utils.ts b/src/test_utils.ts index 68e678cc0f8..e525aeb769b 100644 --- a/src/test_utils.ts +++ b/src/test_utils.ts @@ -92,7 +92,6 @@ export function serveMiddleware( export function createFakeFs(files: Record): FsAdapter { return { - cwd: () => ".", async *walk(_root) { // FIXME: ignore for (const file of Object.keys(files)) { @@ -112,7 +111,6 @@ export function createFakeFs(files: Record): FsAdapter { }, async mkdirp(_dir: string) { }, - readFile: Deno.readFile, }; }