38 lines
990 B
TypeScript
38 lines
990 B
TypeScript
|
/// <reference path="./types/jsx.d.ts" />
|
||
|
import { React, jsx } from "./deps.ts";
|
||
|
|
||
|
class StringReader implements Deno.Reader {
|
||
|
private data: Uint8Array;
|
||
|
private offset = 0;
|
||
|
constructor(text: string) {
|
||
|
this.data = new TextEncoder().encode(text);
|
||
|
}
|
||
|
|
||
|
async read(p: Uint8Array): Promise<number | null> {
|
||
|
if (this.offset >= this.data.byteLength) return null;
|
||
|
|
||
|
const forLength = Math.min(p.length, this.data.length - this.offset);
|
||
|
|
||
|
for (let i = 0; i < forLength; i++) {
|
||
|
p[i] = this.data[i + this.offset];
|
||
|
}
|
||
|
|
||
|
this.offset += forLength;
|
||
|
|
||
|
return forLength;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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 res = await (<component.default {...data} />).render();
|
||
|
console.log(res);
|
||
|
return new StringReader(res as string);
|
||
|
}
|