Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { getPlaywrightConfig } from '@sentry-internal/test-utils';

type Runtime = 'cloudflare' | 'node' | 'bun';

const RUNTIME = (process.env.RUNTIME || 'cloudflare') as Runtime;
import { RUNTIME, type Runtime } from './tests/constants';

const testEnv = process.env.TEST_ENV;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,30 @@
import { Hono } from 'hono';
import { failingMiddleware, middlewareA, middlewareB } from '../middleware';

const testMiddleware = new Hono();
const middlewareRoutes = new Hono();

testMiddleware.get('/named', c => c.json({ middleware: 'named' }));
testMiddleware.get('/anonymous', c => c.json({ middleware: 'anonymous' }));
testMiddleware.get('/multi', c => c.json({ middleware: 'multi' }));
testMiddleware.get('/error', c => c.text('should not reach'));
middlewareRoutes.get('/named', c => c.json({ middleware: 'named' }));
middlewareRoutes.get('/anonymous', c => c.json({ middleware: 'anonymous' }));
middlewareRoutes.get('/multi', c => c.json({ middleware: 'multi' }));
middlewareRoutes.get('/error', c => c.text('should not reach'));

export { testMiddleware };
// Self-contained sub-app registering its own middleware
const subAppWithMiddleware = new Hono();

subAppWithMiddleware.use('/named/*', middlewareA);
subAppWithMiddleware.use('/anonymous/*', async (c, next) => {
c.header('X-Custom', 'anonymous');
await next();
});
subAppWithMiddleware.use('/multi/*', middlewareA, middlewareB);
subAppWithMiddleware.use('/error/*', failingMiddleware);

// .all() produces the same method:'ALL' as .use() in Hono's route record.
// Wrapping it is harmless (onlyIfParent:true) — this route exists to prove that.
subAppWithMiddleware.all('/all-handler', async function allCatchAll(c) {
return c.json({ handler: 'all' });
});

subAppWithMiddleware.route('/', middlewareRoutes);

export { middlewareRoutes, subAppWithMiddleware };
12 changes: 6 additions & 6 deletions dev-packages/e2e-tests/test-applications/hono-4/src/routes.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Hono } from 'hono';
import { HTTPException } from 'hono/http-exception';
import { testMiddleware } from './route-groups/test-middleware';
import { middlewareA, middlewareB, failingMiddleware } from './middleware';
import { failingMiddleware, middlewareA, middlewareB } from './middleware';
import { middlewareRoutes, subAppWithMiddleware } from './route-groups/test-middleware';

export function addRoutes(app: Hono<{ Bindings?: { E2E_TEST_DSN: string } }>): void {
app.get('/', c => {
Expand All @@ -24,16 +24,16 @@ export function addRoutes(app: Hono<{ Bindings?: { E2E_TEST_DSN: string } }>): v
throw new HTTPException(code, { message: `HTTPException ${code}` });
});

// === Middleware ===
// Middleware is registered on the main app (the patched instance) via `app.use()`
// TODO: In the future, we may want to support middleware registration on sub-apps (route groups)
// Root-app middleware: registered on the patched main app instance
app.use('/test-middleware/named/*', middlewareA);
app.use('/test-middleware/anonymous/*', async (c, next) => {
c.header('X-Custom', 'anonymous');
await next();
});
app.use('/test-middleware/multi/*', middlewareA, middlewareB);
app.use('/test-middleware/error/*', failingMiddleware);
app.route('/test-middleware', middlewareRoutes);

app.route('/test-middleware', testMiddleware);
// Sub-app middleware: registered on the sub-app, wrapped at mount time by route() patching
app.route('/test-subapp-middleware', subAppWithMiddleware);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type Runtime = 'cloudflare' | 'node' | 'bun';

export const RUNTIME = (process.env.RUNTIME || 'cloudflare') as Runtime;
export const isNode = RUNTIME === 'node';

export const APP_NAME = 'hono-4';
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { expect, test } from '@playwright/test';
import { waitForError } from '@sentry-internal/test-utils';

const APP_NAME = 'hono-4';
import { APP_NAME } from './constants';

test('captures error thrown in route handler', async ({ baseURL }) => {
const errorWaiter = waitForError(APP_NAME, event => {
Expand Down
Loading
Loading