0.1.5•Updated 6 months ago
import { join, walk } from "$fresh/src/server/deps.ts";
import { relative, resolve } from "jsr:@std/path@^1.0.8";
import { existsSync } from "jsr:@std/fs";
import type { Manifest } from "$fresh/server.ts";
const route_file_pattern = /\.tsx?$/;
export const create_manifest = async (baseUrl: string): Promise<Manifest> => {
const qualifiedURL = new URL('./', baseUrl).href;
const manifest: Manifest = {routes: {}, islands: {}, baseUrl};
const basePath = join(qualifiedURL.replace('file:///', ''));
if(!existsSync(basePath)) return manifest;
const routes_path = resolve(join(basePath, '/app/routes'));
if(existsSync(routes_path)) {
for await (const dirEntry of walk(routes_path, { includeDirs: false })) {
if(!route_file_pattern.test(dirEntry.name)) continue;
let relative_path = `/${relative(basePath, dirEntry.path)}`.replace(/\\+/g, '/');
if(relative_path.endsWith('/index')) relative_path = relative_path.replace(/\/index$/, '');
manifest.routes['.'+relative_path] = await import(`file:///${dirEntry.path}`);
}
}
const islands_path = resolve(join(basePath, '/islands'));
if(existsSync(islands_path)) {
for await (const dirEntry of walk(islands_path, { includeDirs: false })) {
if(!route_file_pattern.test(dirEntry.name)) continue;
let relative_path = `/${relative(basePath, dirEntry.path)}`.replace(/\\+/g, '/');
if(relative_path.endsWith('/index')) relative_path = relative_path.replace(/\/index$/, '');
manifest.islands['.'+relative_path] = await import(`file:///${dirEntry.path}`);
}
}
return manifest;
}