Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/dev/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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[] };

Expand Down
8 changes: 1 addition & 7 deletions src/dev/file_transformer.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand Down Expand Up @@ -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 });
Expand All @@ -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;
Expand Down
59 changes: 21 additions & 38 deletions src/dev/file_transformer_test.ts
Original file line number Diff line number Diff line change
@@ -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<string, string>) {
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<ArrayBuffer>,
);
});
}

function consumeResult(result: ProcessedFile[]) {
Expand Down Expand Up @@ -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 {
Expand All @@ -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);
Expand All @@ -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 {
Expand All @@ -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 {
Expand Down Expand Up @@ -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 [{
Expand Down Expand Up @@ -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$/ }, () => {
Expand Down Expand Up @@ -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 [{
Expand Down
4 changes: 0 additions & 4 deletions src/fs.ts
Original file line number Diff line number Diff line change
@@ -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<WalkEntry>;
isDirectory(path: string | URL): Promise<boolean>;
mkdirp(dir: string): Promise<void>;
readFile(path: string | URL): Promise<Uint8Array>;
}

export const fsAdapter: FsAdapter = {
walk,
cwd: Deno.cwd,
async isDirectory(path) {
try {
const stat = await Deno.stat(path);
Expand All @@ -32,5 +29,4 @@ export const fsAdapter: FsAdapter = {
}
}
},
readFile: Deno.readFile,
};
2 changes: 1 addition & 1 deletion src/plugins/fs_routes/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export async function fsRoutes<State>(
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");
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/fs_routes/mod_test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<T>(
files: Record<string, string | Uint8Array | FreshFsItem<T>>,
): Promise<FakeServer> {
const app = new App<T>();
using _stub = stub(Deno, "cwd", () => ".");

await fsRoutes(
app,
Expand Down
2 changes: 0 additions & 2 deletions src/test_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ export function serveMiddleware<T>(

export function createFakeFs(files: Record<string, unknown>): FsAdapter {
return {
cwd: () => ".",
async *walk(_root) {
// FIXME: ignore
for (const file of Object.keys(files)) {
Expand All @@ -112,7 +111,6 @@ export function createFakeFs(files: Record<string, unknown>): FsAdapter {
},
async mkdirp(_dir: string) {
},
readFile: Deno.readFile,
};
}

Expand Down
Loading