3export const tableName = "reactHonoStarter_messages";
4
5export async function createTables() {
6 await sqlite.batch([
7 `CREATE TABLE IF NOT EXISTS ${tableName} (
3import type { Message } from "../shared/types.ts";
4
5export function MessageInput({ onSubmit }: { onSubmit: () => void }) {
6 const [message, setMessage] = React.useState("");
7
4import { MessageInput } from "./MessageInput.tsx";
5
6export function App(
7 { initialMessages = [], thisProjectURL }: { initialMessages?: Message[]; thisProjectURL?: string },
8) {
41}
42
43function MessageList({ messages }: { messages: Message[] }) {
44 const displayedMessages = messages.slice(0, MESSAGE_LIMIT);
45 return (
50}
51
52function MessageItem({ message }) {
53 const formattedDate = new Date(message.timestamp).toLocaleString();
54
13interface TestCase {
14 name: string;
15 function: () => void;
16}
17
18interface TestCaseResult {
19 name: string;
20 function: () => void;
21 passed: boolean;
22 duration: number;
23}
24
25async function runTest(test: TestCase) {
26 let pass, message;
27 let start = performance.now();
28 try {
29 await test.function();
30 pass = true;
31 } catch (e: any) {
40}
41
42function renderBadge({ label, passedCount, testCount }: { label?: string; passedCount: number; testCount: number }) {
43 return makeBadge({
44 label: label ?? "Tests",
48}
49
50function Badge({ label, passedCount, testCount }: { label?: string; passedCount: number; testCount: number }) {
51 const svgMarkup = renderBadge({ label, passedCount, testCount });
52 const srcDoc = `<body style="margin: 0"}>${svgMarkup}</body>`;
62}
63
64function renderTestResults(testGroups: TestGroup[], outputs: { [groupName: string]: TestOutput[] }) {
65 const totalPassed = Object.values(outputs).flat().filter((output: TestOutput) => output.pass).length;
66 const totalTests = testGroups.reduce((sum, group) => sum + group.tests.length, 0);
8 {
9 name: "no-op",
10 function: () => {
11 return true;
12 },
14 {
15 name: "passing test",
16 function: () => {
17 expect(1).toBe(1);
18 },
20 {
21 name: "Failing test",
22 function: () => {
23 expect(1).toBe(2);
24 },
31 {
32 name: "passing test 2",
33 function: () => {
34 expect(1).toBe(1);
35 },
1export default function server(req: Request): Response {
2 const html = `
3<!DOCTYPE html>
28 animate();
29
30 function init() {
31 scene = new THREE.Scene();
32 scene.background = new THREE.Color(0x505050);
88 }
89
90 function onSelectStart(event) {
91 this.userData.isSelecting = true;
92 }
93
94 function onSelectEnd(event) {
95 this.userData.isSelecting = false;
96 }
97
98 function onWindowResize() {
99 camera.aspect = window.innerWidth / window.innerHeight;
100 camera.updateProjectionMatrix();
102 }
103
104 function animate() {
105 renderer.setAnimationLoop(render);
106 }
107
108 function handleController(inputSource) {
109 const gamepad = inputSource.gamepad;
110 if (gamepad) {
117 }
118
119 function render() {
120 const session = renderer.xr.getSession();
121
15];
16
17function App() {
18 const [noClicks, setNoClicks] = useState(0);
19 const [isValentine, setIsValentine] = useState(false);
101}
102
103function client() {
104 createRoot(document.getElementById("root")).render(<App />);
105}
106if (typeof document !== "undefined") { client(); }
107
108export default async function server(request: Request): Promise<Response> {
109 return new Response(
110 `
5import { Layout } from "./Layout.tsx";
6
7function PostComponent({ markdown, link }: { markdown: string; link?: string }) {
8 return (
9 <div style={{ border: "1px solid gray", padding: "10px", marginBottom: "20px", borderRadius: "5px" }}>
14}
15
16export default async function(req: Request): Promise<Response> {
17 const url = new URL(req.url);
18 if (url.pathname === "/") {
44}
45
46function html(children: React.ReactNode) {
47 return new Response(
48 renderToString(
16const [steve, tom, andre] = team;
17
18export default async function(e: Email) {
19 console.log(JSON.stringify(e, null, 2));
20
1export default async function (req: Request): Promise<Response> {
2 return Response.json({ ok: true })
3}