├── static └── output.css ├── src ├── MiddlewareStradegy.ts ├── XerusFileRouterOpts.ts ├── middleware │ └── middleware.ts ├── InitModule.ts ├── components │ └── components.tsx ├── layouts │ └── layouts.tsx ├── XerusFileRouter.ts ├── RouteModule.ts ├── ServerManager.ts ├── AppFile.ts └── AppDir.ts ├── app ├── +init.tsx ├── +route.tsx ├── user │ └── :id │ │ └── +route.tsx └── about │ ├── +route.tsx │ └── again │ └── +route.tsx ├── index.ts ├── .gitignore ├── package.json ├── tsconfig.json ├── example.ts ├── README.md └── bun.lock /static/output.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: black; 3 | color: white; 4 | } 5 | -------------------------------------------------------------------------------- /src/MiddlewareStradegy.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export enum MiddlwareStradegy { 4 | Isolate, 5 | Cascade, 6 | } -------------------------------------------------------------------------------- /src/XerusFileRouterOpts.ts: -------------------------------------------------------------------------------- 1 | 2 | export type XerusFileRouterOpts = { 3 | src: string; 4 | port: number; 5 | }; -------------------------------------------------------------------------------- /app/+init.tsx: -------------------------------------------------------------------------------- 1 | import { InitModule } from "../src/InitModule"; 2 | import { logger, Xerus } from "xerus/xerus"; 3 | 4 | let module = new InitModule(); 5 | 6 | module.init(async (app: Xerus) => { 7 | app.use(logger); 8 | app.static("static"); 9 | }); 10 | 11 | export default module; 12 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export * from './src/AppDir' 2 | export * from './src/AppFile' 3 | export * from './src/InitModule' 4 | export * from './src/MiddlewareStradegy' 5 | export * from './src/RouteModule' 6 | export * from './src/ServerManager' 7 | export * from './src/XerusFileRouter' 8 | export * from './src/XerusFileRouterOpts' 9 | -------------------------------------------------------------------------------- /src/middleware/middleware.ts: -------------------------------------------------------------------------------- 1 | import { HTTPContext, Middleware, type MiddlewareNextFn } from "xerus/xerus"; 2 | 3 | export const testmw = new Middleware( 4 | async (c: HTTPContext, next: MiddlewareNextFn) => { 5 | console.log("before"); 6 | await next(); 7 | console.log("after"); 8 | }, 9 | ); 10 | -------------------------------------------------------------------------------- /src/InitModule.ts: -------------------------------------------------------------------------------- 1 | import type { Xerus } from "xerus/xerus"; 2 | 3 | export class InitModule { 4 | initFunc: undefined | ((app: Xerus) => Promise); 5 | endpoint: string = '/' 6 | constructor() {} 7 | async init(callback: (app: Xerus) => Promise) { 8 | this.initFunc = callback; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/components/components.tsx: -------------------------------------------------------------------------------- 1 | export const Header = (props: { text: string }) => { 2 | return ( 3 |
4 |

{props.text}

5 |
6 | ); 7 | }; 8 | 9 | export const Footer = (props: { text: string }) => { 10 | return ( 11 |
12 |

{props.text}

13 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /app/+route.tsx: -------------------------------------------------------------------------------- 1 | import type { HTTPContext } from "xerus/xerus"; 2 | import { cascade, isolate, RouteModule } from "../src/RouteModule"; 3 | import { GuestLayout } from "../src/layouts/layouts"; 4 | import { testmw } from "../src/middleware/middleware"; 5 | 6 | let module = new RouteModule(); 7 | 8 | module.get(async (c: HTTPContext) => { 9 | return c.jsx( 10 | 11 |

Home Page!

12 |
, 13 | ); 14 | }, isolate(testmw)); 15 | 16 | export default module; 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies (bun install) 2 | node_modules 3 | 4 | # output 5 | out 6 | dist 7 | *.tgz 8 | 9 | # code coverage 10 | coverage 11 | *.lcov 12 | 13 | # logs 14 | logs 15 | _.log 16 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 17 | 18 | # dotenv environment variable files 19 | .env 20 | .env.development.local 21 | .env.test.local 22 | .env.production.local 23 | .env.local 24 | 25 | # caches 26 | .eslintcache 27 | .cache 28 | *.tsbuildinfo 29 | 30 | # IntelliJ based IDEs 31 | .idea 32 | 33 | # Finder (MacOS) folder config 34 | .DS_Store 35 | -------------------------------------------------------------------------------- /app/user/:id/+route.tsx: -------------------------------------------------------------------------------- 1 | import type { HTTPContext } from "xerus/xerus"; 2 | import { GuestLayout } from "../../../src/layouts/layouts"; 3 | import { testmw } from "../../../src/middleware/middleware"; 4 | import { RouteModule, isolate } from "../../../src/RouteModule"; 5 | 6 | let module = new RouteModule(); 7 | 8 | module.get(async (c: HTTPContext) => { 9 | return c.jsx( 10 | 11 |

User {c.getParam('id')}

12 |
, 13 | ); 14 | }, isolate(testmw)); 15 | 16 | export default module; 17 | -------------------------------------------------------------------------------- /src/layouts/layouts.tsx: -------------------------------------------------------------------------------- 1 | import { Footer, Header } from "../components/components"; 2 | 3 | export const GuestLayout = (props: { 4 | title: string; 5 | children?: React.ReactNode; 6 | }) => { 7 | return ( 8 | 9 | 10 | {props.title} 11 | 12 | 13 | 14 |
15 | {props.children} 16 |