@@ -17,23 +17,44 @@ export type WaveKitContext = {
1717 json : typeof WaveKitResponse . json ;
1818 redirect : typeof WaveKitResponse . redirect ;
1919 store : Map < string , unknown > ;
20+ base : string ;
2021} ;
2122
2223export type WaveKitHandler = (
2324 c : WaveKitContext ,
24- ) => Response | Promise < Response > ;
25+ ) => WaveKitResponse | Promise < WaveKitResponse > ;
2526
26- type BuildRoutesProps = {
27- routes : Record < string , string > ;
27+ export type WaveKit = {
28+ routes : Record < string , RouterTypes . RouteHandlerObject < string > > ;
29+ store : Map < string , unknown > ;
30+ } ;
31+
32+ export type WaveKitHooks = {
33+ beforeHandler ?: (
34+ c : WaveKitContext ,
35+ ) => Promise < WaveKitContext | WaveKitResponse > ;
36+ afterHandler ?: ( response : WaveKitResponse ) => Promise < WaveKitResponse > ;
37+ } ;
38+
39+ export type CreateWaveKitProps = {
40+ base ?: string | undefined ;
41+ routesDir ?: string | undefined ;
42+ hooks ?: WaveKitHooks ;
2843} ;
2944
30- export async function buildRoutes ( {
31- routes,
32- } : BuildRoutesProps ) : Promise <
33- Record < string , RouterTypes . RouteHandlerObject < string > >
34- > {
45+ export async function createWaveKit ( {
46+ base,
47+ routesDir,
48+ hooks,
49+ } : CreateWaveKitProps = { } ) : Promise < WaveKit > {
50+ const safeBase = ( base ?? "/" ) === "/" ? "" : ( base ?? "" ) ;
51+ const router = new Bun . FileSystemRouter ( {
52+ style : "nextjs" ,
53+ dir : routesDir ?? defaultRoutesDir ,
54+ assetPrefix : "_public" ,
55+ } ) ;
3556 const contextStore = new Map ( ) ;
36- const rawRoutes = Object . entries ( routes ) ;
57+ const rawRoutes = Object . entries ( router . routes ) ;
3758 const routesWithHandlers = rawRoutes . map ( async ( [ path , handlerPath ] ) => {
3859 const handler = ( await import (
3960 handlerPath
@@ -44,43 +65,51 @@ export async function buildRoutes({
4465 method as RouterTypes . HTTPMethod
4566 ] as unknown as WaveKitHandler ;
4667 if ( ! methodHandler ) return ;
47- contextHandler [ method as RouterTypes . HTTPMethod ] = (
68+ contextHandler [ method as RouterTypes . HTTPMethod ] = async (
4869 req : BunRequest ,
4970 server : Server ,
5071 ) => {
5172 const res = new WaveKitResponse ( ) ;
52- const context = {
73+ let context = {
5374 req,
5475 res,
5576 html : WaveKitResponse . html ,
5677 json : WaveKitResponse . json ,
5778 redirect : WaveKitResponse . redirect ,
5879 store : contextStore ,
80+ base : safeBase ,
5981 } ;
60- return methodHandler ( context ) ;
82+ let beforeHandlerResult : WaveKitResponse | WaveKitContext ;
83+ if ( hooks ?. beforeHandler ) {
84+ beforeHandlerResult = await hooks . beforeHandler ( context ) ;
85+ if ( beforeHandlerResult instanceof Response )
86+ return beforeHandlerResult ;
87+ context = beforeHandlerResult as WaveKitContext ;
88+ }
89+ let result : WaveKitResponse = new WaveKitResponse ( ) ;
90+ result = await methodHandler ( context ) ;
91+ if (
92+ hooks ?. afterHandler &&
93+ result &&
94+ result instanceof WaveKitResponse
95+ ) {
96+ result = await hooks . afterHandler ( result ) ;
97+ }
98+ return result ;
6199 } ;
62100 }
63- return [ path , contextHandler ] ;
101+ return [ safeBase + path , contextHandler ] ;
64102 } ) ;
65- return Object . fromEntries (
103+ const filteredRoutes = Object . fromEntries (
66104 ( await Promise . all ( routesWithHandlers ) ) . filter ( Boolean ) as [
67105 string ,
68106 RouterTypes . RouteHandlerObject < string > ,
69107 ] [ ] ,
70108 ) ;
71- }
72-
73- export type CreateWaveKitProps = {
74- routesDir ?: string | undefined ;
75- } ;
76-
77- export async function createWaveKit ( { routesDir } : CreateWaveKitProps = { } ) {
78- const router = new Bun . FileSystemRouter ( {
79- style : "nextjs" ,
80- dir : routesDir ?? defaultRoutesDir ,
81- assetPrefix : "_public" ,
82- } ) ;
83- return buildRoutes ( { routes : router . routes } ) ;
109+ return {
110+ routes : filteredRoutes ,
111+ store : contextStore ,
112+ } ;
84113}
85114
86115function sanitizeRoutePath ( routePath : string ) {
@@ -89,13 +118,19 @@ function sanitizeRoutePath(routePath: string) {
89118}
90119
91120export type SsgRenderProps = {
121+ base ?: string | undefined ;
92122 routesDir ?: string | undefined ;
93123 outDir ?: string | undefined ;
94124} ;
95125
96- export async function ssgRender ( { routesDir, outDir } : SsgRenderProps = { } ) {
97- const routes = await createWaveKit ( { routesDir } ) ;
126+ export async function ssgRender ( {
127+ base,
128+ routesDir,
129+ outDir,
130+ } : SsgRenderProps = { } ) {
131+ const { routes } = await createWaveKit ( { base, routesDir } ) ;
98132 const server = Bun . serve ( {
133+ port : 3000 ,
99134 routes,
100135 } ) ;
101136 let renderedRoutes = 0 ;
0 commit comments