This commit is contained in:
@ -1,8 +1,12 @@
|
||||
/// <reference path="./types/jsx.d.ts" />
|
||||
import { React, jsx } from "./deps.ts";
|
||||
// / <reference path="./types/jsx.d.ts" />
|
||||
import { Pico } from "./deps.ts";
|
||||
|
||||
import config from "./config.ts";
|
||||
|
||||
const React = {
|
||||
createElement: Pico.h.bind(Pico),
|
||||
};
|
||||
|
||||
class StringReader implements Deno.Reader {
|
||||
private data: Uint8Array;
|
||||
private offset = 0;
|
||||
@ -25,15 +29,37 @@ class StringReader implements Deno.Reader {
|
||||
}
|
||||
}
|
||||
|
||||
type ELM = any;
|
||||
|
||||
type Component = () => ELM;
|
||||
|
||||
const componentCache = new Map<string, Component>();
|
||||
|
||||
async function loadComponent(name: string) {
|
||||
let mod = componentCache.get(name);
|
||||
if (!mod || config.general.dev) {
|
||||
mod = (await import(`./views/${name}.tsx`)).default;
|
||||
if (!mod) throw new Error("Invalid component " + name);
|
||||
componentCache.set(name, mod);
|
||||
}
|
||||
|
||||
return mod;
|
||||
}
|
||||
|
||||
const preLoad = ["index", "package", "browse_folder", "browse_file"];
|
||||
|
||||
preLoad.forEach((page) =>
|
||||
loadComponent(page).catch((err) => console.error("Error preloading", page))
|
||||
);
|
||||
|
||||
export default async function render(
|
||||
name: string,
|
||||
data: any
|
||||
): Promise<Deno.Reader> {
|
||||
const component: {
|
||||
default: () => JSX.IntrinsicElements | Promise<JSX.IntrinsicElements>;
|
||||
} = await import(`./views/${name}.tsx`);
|
||||
const Component = await loadComponent(name);
|
||||
|
||||
const res = await (<component.default {...data} />).render();
|
||||
//@ts-ignore
|
||||
const res = await Pico.renderSSR(<Component {...data} />);
|
||||
|
||||
return new StringReader("<!DOCTYPE html>\n" + (res as string));
|
||||
return new StringReader("<!DOCTYPE html>\n" + res);
|
||||
}
|
||||
|
Reference in New Issue
Block a user