EmailAttachmentLogApp.tsx3 matches
41const fetchAttachments = async () => {
42try {
43const response = await fetch("/api/attachments");
44if (!response.ok) {
45throw new Error("Failed to fetch attachments");
166<div className="flex space-x-2">
167<a
168href={`/api/attachments/${selectedAttachment}?download=true`}
169download
170className="px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 flex items-center"
198</div>
199<iframe
200src={`/api/attachments/${selectedAttachment}`}
201className={`w-full ${isFullscreen ? 'h-[calc(100vh-60px)]' : 'h-[75vh]'} border-0`}
202title="Document Viewer"
1import { createRoute } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { ErrorSchema, UpdateUserSchema, UserIdPathParamSchema, UserSchema } from "../schema.ts";
3
fiberplaneHonoZodStarterschema.ts13 matches
1import { z } from "https://esm.sh/@hono/zod-openapi@0.18.4";
23// Schema that defines presence of an ID in the path
6.coerce
7.number()
8.openapi({ example: 1 }),
9});
1012export const NewUserSchema = z
13.object({
14name: z.string().min(2).max(50).openapi({ example: "Mark Scout" }),
15email: z.string().email().openapi({ example: "mark@lumen.co" }),
16age: z.number().int().min(18).max(120).openapi({ example: 35 }),
17}).openapi("NewUser");
1819// Schema that defines the response of a request to get a user
21.object({
22id: z.number().int(),
23name: z.string().openapi({ example: "Mark Scout" }),
24email: z.string().email().openapi({ example: "mark@lumen.co" }),
25age: z.number().int().openapi({ example: 35 }),
26}).openapi("User");
2728export const UpdateUserSchema = z
29.object({
30name: z.string().optional().openapi({
31example: "Marcus Scoutius",
32}),
33age: z.number().int().optional().openapi({
34example: 53,
35}),
36})
37.openapi("UpdateUser");
3839// Error schema
fiberplaneHonoZodStarterREADME.md9 matches
1**Example Hono-Zod-OpenAPI app with a Fiberplane API explorer.**
23> For an example with regular-old Hono, see: https://www.val.town/v/fiberplane/fiberplaneHonoStarter
8```
9102. Expose your OpenAPI spec
11```ts
12app.doc("/doc", {
13openapi: "3.0.0",
14info: {
15title: "User Management API",
16version: "v1.0.0",
17},
19```
20213. Mount the api explorer
2223This will mount it at the root `/*`, but you can mount it to another route, like `/fp/*` if you
24are using `/` for your main app. We recommend `/` if your Hono app is an API without a frontend.
2526```ts
28"/*",
29createFiberplane({
30openapi: { url: "/doc" },
31}),
32);
33```
34354. Visit your Val's root route to play with the API explorer!
3637## How it Works
3839`createFiberplane` mounts Fiberpalne at the root route (`/`), which can be used to explore the api's routes and make requests.
40Think of it like an embedded, lightweight postman.
1import { createRoute, z } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { UserSchema } from "../schema.ts";
3
fiberplaneHonoZodStarterindex.ts17 matches
1import { createFiberplane } from "https://esm.sh/@fiberplane/hono@0.4.4";
2import { swaggerUI } from "https://esm.sh/@hono/swagger-ui@0.2.0";
3import { OpenAPIHono } from "https://esm.sh/@hono/zod-openapi@0.18.4";
4import { HTTPException } from "https://esm.sh/hono@4.7.0/http-exception";
56import { createUser, deleteUser, filterUsersByName, findUserById, updateUser } from "./helpers.ts";
7import { superProtectedApi } from "./protected/api.ts";
8import { createUserRoute } from "./routes/create-user.ts";
9import { deleteUserRoute } from "./routes/delete-user.ts";
14import type { AppType } from "./types.ts";
1516const app = new OpenAPIHono<AppType>();
1718app.openapi(getUserRoute, (c) => {
19// This id is coerced to a number by the Zod schema for path parameters
20// See: `UserIdPathParamSchema` in `schema.ts`
30});
3132app.openapi(listUsersRoute, (c) => {
33const { name } = c.req.valid("query");
3438});
3940app.openapi(createUserRoute, (c) => {
41const { name, email, age } = c.req.valid("json");
4246});
4748app.openapi(updateUserRoute, (c) => {
49const { id } = c.req.valid("param");
50const { name, age } = c.req.valid("json");
59});
6061app.openapi(deleteUserRoute, (c) => {
62const { id } = c.req.valid("param");
6373});
7475// Mount an API with bearer auth
76app.route("/protected", superProtectedApi);
7778// Create OpenAPI documentation
79app.doc("/openapi.json", {
80openapi: "3.0.0",
81info: {
82title: "User Management API",
83version: "v1.0.0",
84},
8687// Swagger UI
88app.get("/docs", swaggerUI({ url: "/openapi.json" }));
8990// Mount the Fiberplane UI at the root to be able to test api endpoints
91app.use(
92"/*",
93createFiberplane({
94openapi: { url: "/openapi.json" },
95}),
96);
1import { z } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { UserSchema } from "./schema.ts";
3
1import { createRoute } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { ErrorSchema, UserIdPathParamSchema, UserSchema } from "../schema.ts";
3
1import { createRoute } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { ErrorSchema, UserIdPathParamSchema } from "../schema.ts";
3
1import { createRoute } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { ErrorSchema, NewUserSchema, UserIdPathParamSchema, UserSchema } from "../schema.ts";
3