Skip to content

Commit b0fc761

Browse files
chore: wip
1 parent 9acc19c commit b0fc761

File tree

4 files changed

+58
-53
lines changed

4 files changed

+58
-53
lines changed

.stacks/core/router/src/index.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,44 @@
1-
import type { Route, RouteCallback, RouteGroupOptions } from '@stacksjs/types'
2-
import { handleRequest } from './server'
1+
import { type Route, type RouteCallback, type RouteGroupOptions } from '@stacksjs/types'
32
import { projectPath } from '@stacksjs/path'
43

4+
import type { StatusCode, RedirectCode } from '@stacksjs/types'
55
export class Router {
66
private routes: Route[] = []
77

8-
private addRoute(method: Route['method'], uri: string, callback: RouteCallback | string | object): void {
8+
private addRoute(method: Route['method'], uri: string, callback: RouteCallback | string | object, statusCode: StatusCode): void {
99
const pattern = new RegExp(`^${uri.replace(/:[a-zA-Z]+/g, (match) => {
1010
return '([a-zA-Z0-9-]+)'
1111
})}$`)
1212

13-
this.routes.push({ method, uri, callback, pattern })
13+
this.routes.push({ method, uri, callback, pattern, statusCode })
1414
}
1515

1616
public get(url: string, callback: RouteCallback): void {
17-
this.addRoute('GET', url, callback)
17+
this.addRoute('GET', url, callback, 200)
1818
}
1919

2020
public post(url: string, callback: RouteCallback): void {
21-
this.addRoute('POST', url, callback)
21+
this.addRoute('POST', url, callback, 201)
2222
}
2323

2424
public view(url: string, callback: RouteCallback): void {
25-
this.addRoute('GET', url, callback)
25+
this.addRoute('GET', url, callback, 200)
2626
}
2727

28-
public redirect(url: string, callback: RouteCallback): void {
29-
this.addRoute('GET', url, callback)
30-
handleRequest(this.getRoutes(), true)
28+
public redirect(url: string, callback: RouteCallback, status?: RedirectCode): void {
29+
this.addRoute('GET', url, callback, 302)
3130
}
3231

3332
public delete(url: string, callback: RouteCallback): void {
34-
this.addRoute('DELETE', url, callback)
33+
this.addRoute('DELETE', url, callback, 204)
3534
}
3635

3736
public patch(url: string, callback: RouteCallback): void {
38-
this.addRoute('PATCH', url, callback)
37+
this.addRoute('PATCH', url, callback, 202)
3938
}
4039

4140
public put(url: string, callback: RouteCallback): void {
42-
this.addRoute('PUT', url, callback)
41+
this.addRoute('PUT', url, callback, 202)
4342
}
4443

4544
public group(options: RouteGroupOptions, callback: () => void): void {
@@ -57,6 +56,9 @@ export class Router {
5756
// For each route added by the callback, adjust the URI and add to the original routes array.
5857
this.routes.forEach((r) => {
5958
r.uri = `${prefix}${r.uri}`
59+
60+
if (middleware.length)
61+
r.middleware = middleware
6062
// Assuming you have a middleware property for each route.
6163

6264
originalRoutes.push(r)
@@ -78,7 +80,6 @@ export class Router {
7880
// const routeFileData = (await readTextFile(projectPath('routes/web.ts'))).data
7981

8082
await import(projectPath('routes/web.ts'))
81-
await import(projectPath('routes/api.ts'))
8283

8384
// run routes/web.ts
8485
// const webRoutesPath = projectPath('routes/web.ts')

.stacks/core/router/src/server.ts

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,34 @@
11
import { URL } from 'node:url'
22
import { extname } from 'node:path'
3-
import { type Route } from '@stacksjs/types'
3+
import { StatusCode, type Route } from '@stacksjs/types'
44
import middlewares from '../../../../app/middleware'
55
import { request } from './request'
66
import { route } from './index'
77

8+
const routesList: Route[] = await route.getRoutes()
89

9-
const routesList: Route[] = route.getRoutes()
10+
Bun.serve({
11+
async fetch(req) {
12+
const url = new URL(req.url)
1013

11-
export function handleRequest(): void {
12-
Bun.serve({
13-
fetch(req) {
14-
const url = new URL(req.url)
14+
const foundRoute: Route = routesList.find((route: Route) => {
15+
const pattern = new RegExp(`^${route.uri.replace(/:\w+/g, '\\w+')}$`)
1516

16-
const foundRoute: Route = routesList.find((route: Route) => {
17-
const pattern = new RegExp(`^${route.uri.replace(/:\w+/g, '\\w+')}$`)
17+
return pattern.test(url.pathname)
18+
}) as Route
1819

19-
return pattern.test(url.pathname)
20-
}) as Route
20+
if (url.pathname === '/favicon.ico')
21+
return new Response('')
2122

22-
if (url.pathname === '/favicon.ico')
23-
return new Response('')
23+
if (!foundRoute)
24+
return new Response('Not found', { status: 404 })
2425

25-
if (!foundRoute)
26-
return new Response('Not found', { status: 404 })
26+
addRouteParamsandQuery(url, foundRoute)
27+
executeMiddleware(foundRoute)
2728

28-
addRouteParamsandQuery(url, foundRoute)
29-
executeMiddleware(foundRoute)
30-
31-
return execute(foundRoute, req)
32-
},
33-
})
34-
}
29+
return execute(foundRoute, req, { statusCode: foundRoute.statusCode })
30+
},
31+
})
3532

3633
function addRouteParamsandQuery(url: URL, route: Route): void {
3734
if (!isObjectNotEmpty(url.searchParams))
@@ -41,8 +38,8 @@ function addRouteParamsandQuery(url: URL, route: Route): void {
4138
}
4239

4340
function executeMiddleware(route: Route): void {
44-
const { middleware } = route
45-
41+
const { middleware = null } = route
42+
4643
if (middleware && middlewares && isObjectNotEmpty(middlewares)) {
4744
if (isString(middleware)) {
4845
const fn = middlewares[middleware]
@@ -59,11 +56,17 @@ function executeMiddleware(route: Route): void {
5956
}
6057
}
6158

62-
function execute(route: Route, request: any): Response {
63-
if (route?.method === 'GET' && isRedirect) {
59+
function execute(route: Route, request: any, { statusCode }: { statusCode: StatusCode }) {
60+
if (route?.method === 'GET' && (statusCode === 301 || statusCode === 302)) {
6461
const callback = String(route.callback)
6562

66-
return Response.redirect(callback, 301)
63+
const response = Response.redirect(callback, statusCode)
64+
65+
response.headers.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
66+
response.headers.set('Pragma', 'no-cache');
67+
response.headers.set('Expires', '0');
68+
69+
return response;
6770
}
6871

6972
if (route?.method !== request.method)

.stacks/core/types/src/router.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,13 @@ export interface Route {
4141
callback: RouteCallback
4242
paramNames: string[]
4343
middleware?: string | string[]
44+
statusCode?: StatusCode
4445
}
4546

47+
export type StatusCode = 200 | 201 | 202 | 204 | 301 | 302 | 304 | 400 | 401 | 403 | 404 | 500
48+
49+
export type RedirectCode = 301 | 302
50+
4651
export type Middleware = () => void
4752

4853
export interface Middlewares {

routes/web.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
11
import { route } from '../.stacks/core/router/src/index.ts'
22
import { request } from '../.stacks/core/router/src/request.ts'
33

4-
route.get('/users/list', getBlogs)
5-
// route.post('/blogs', 'hello world')
4+
route.get('/blogs', 'hello blogs')
65

7-
// route.group({ prefix: '/users', middleware: 'auth' }, () => {
8-
// route.get('/get/:id', getUsers)
6+
route.group({ prefix: '/users', middleware: 'auth' }, () => {
7+
route.get('/get/:id', getUsers)
98

10-
// // route.get('/delete', getUsers)
11-
// })
9+
route.get('/delete', getBlogs)
10+
})
1211

1312
// TODO: Add a way to register a view.
14-
// route.view('/welcome', 'hello world')
15-
route.redirect('/wel', '/welcome')
13+
route.redirect('/user', '/welcome')
14+
route.get('/welcome', 'hello world')
15+
route.get('/users', 'hello users')
1616

1717
function getUsers() {
1818
return request.getParams('id')
1919
}
2020

21-
// function getUserId() {
22-
// return request.getParams('id')
23-
// }
24-
2521
function getBlogs() {
26-
return request.all()
22+
return 'hello blogs function'
2723
}

0 commit comments

Comments
 (0)