Many improvements
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Fabian Stamm
2021-01-11 15:06:02 +01:00
parent 79bcef0698
commit 6fe3ddbd37
16 changed files with 79 additions and 56 deletions

View File

@ -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);
}