/server

100% typesafe wrapper around Express.js

Primary LanguageTypeScriptMIT LicenseMIT

@typeofweb/server

All Contributors

codecov npm

Docs

Sponsors

<your name here>

See opencollective.com/typeofweb or github.com/sponsors/typeofweb! ❤️

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Michał Miszczyszyn

💻 🚧 📆 👀

This project follows the all-contributors specification. Contributions of any kind welcome!

Example

import { createApp } from '@typeofweb/server';

import { dbPlugin } from './dbPlugin';
import { authPlugin } from './authPlugin';

const app = await createApp({
  host: 'localhost',
  port: 3000,
});

app.plugin(dbPlugin);
app.plugin(authPlugin);

app.route({
  path: '/health-check/:count',
  method: 'GET',
  validation: {
    query: {},
    params: {
      count: number(),
    },
    payload: {},
    response: {},
  },
  async handler(request) {
    if (!request.plugins.auth.session) {
      throw new HttpError(HttpStatusCode.Unauthorized);
    }

    const { params } = request;
    const result = await request.server.plugins.db.user.findOne(params.count);

    request.events.emit('found', result);

    return result;
  },
});

const server = await app.listen();
// dbPlugin.ts

import { createPlugin } from '@typeofweb/server';

declare module '@typeofweb/server' {
  interface TypeOfWebServerMeta {
    readonly db: PrismaClient;
  }

  interface TypeOfWebRequestMeta {
    readonly auth: { readonly session: Session };
  }

  interface TypeOfWebServerEvents {
    readonly found: User;
  }
}

export const dbPlugin = createPlugin('db', async (app) => {
  return {
    server: new Prisma(),
  };
});
// authPlugin.ts

import { createPlugin } from '@typeofweb/server';

export const authPlugin = createPlugin('auth', async (app) => {
  return {
    request(request) {
      const session = await request.plugins.db.session.findOne({ id: request.cookies.session });
      return { session };
    },
  };
});