Skip to Content
Packages@loop/hono

@loop/hono

Shared Hono utilities for building Loop Health API services. Provides app factory, middleware, response helpers, and checkout token management.

Installation

pnpm add @loop/hono

App Factory

import { createApp } from '@loop/hono'; const app = createApp(); // Pre-configured with: CORS, request ID, error handler

Middleware

Authentication

import { requireAuth, optionalAuth, requireTier, requireRole } from '@loop/hono'; // Require authenticated user app.use('/api/*', requireAuth); // Optional auth (user may or may not be logged in) app.use('/public/*', optionalAuth); // Require specific tier app.use('/premium/*', requireTier('pro')); // Require specific role app.use('/admin/*', requireRole('admin'));

Rate Limiting

import { rateLimit } from '@loop/hono'; app.use('/*', rateLimit({ max: 100, window: 60 }));

Validation

import { validator } from '@loop/hono'; import { z } from 'zod'; app.post('/profiles', validator('json', createProfileSchema), async (c) => { const data = c.req.valid('json'); // data is fully typed from the Zod schema });

Request ID

import { requestId } from '@loop/hono'; app.use('/*', requestId); // Adds X-Request-Id header to responses

Error Handler

import { errorHandler } from '@loop/hono'; app.onError(errorHandler); // Catches errors and returns consistent JSON error responses

Response Helpers

import { success, error, paginated, created, noContent } from '@loop/hono'; // Success response app.get('/users/:id', async (c) => { const user = await getUser(c.req.param('id')); return success(c, user); }); // Created response (201) app.post('/users', async (c) => { const user = await createUser(data); return created(c, user, `/users/${user.id}`); }); // Paginated response app.get('/users', async (c) => { const { data, total } = await listUsers(query); return paginated(c, data, { page: 1, limit: 20, total }); }); // No content (204) app.delete('/users/:id', async (c) => { await deleteUser(c.req.param('id')); return noContent(c); }); // Error response app.get('/fail', async (c) => { return error(c, 404, 'NOT_FOUND', 'User not found'); });

Checkout Token

Secure checkout token generation and verification:

import { generateCheckoutToken, verifyCheckoutToken } from '@loop/hono/checkout-token'; const token = await generateCheckoutToken({ userId: 'user_123', cartId: 'cart_456' }); const payload = await verifyCheckoutToken(token);

Used By

@loop/hono is used by lightweight API services built with Hono: