Skip to main content Link Search Menu Expand Document (external link)

Router overview

Added in v1.0.0


Table of contents


combinators

catchAll

Signature

export declare const catchAll: {
  <E, R2, E2>(
    f: (e: E) => Route.Handler<R2, E2>
  ): <R>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R2, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E2
  >
  <R, E, R2, E2>(
    self: Router<R, E>,
    f: (e: E) => Route.Handler<R2, E2>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R2, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E2
  >
}

Added in v1.0.0

catchAllCause

Signature

export declare const catchAllCause: {
  <E, R2, E2>(
    f: (e: Cause.Cause<E>) => Route.Handler<R2, E2>
  ): <R>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R2, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E2
  >
  <R, E, R2, E2>(
    self: Router<R, E>,
    f: (e: Cause.Cause<E>) => Route.Handler<R2, E2>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R2, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E2
  >
}

Added in v1.0.0

catchTag

Signature

export declare const catchTag: {
  <K extends E extends { _tag: string } ? E["_tag"] : never, E, R1, E1>(
    k: K,
    f: (e: Extract<E, { _tag: K }>) => Route.Handler<R1, E1>
  ): <R>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | Exclude<E, { _tag: K }>
  >
  <R, E, K extends E extends { _tag: string } ? E["_tag"] : never, R1, E1>(
    self: Router<R, E>,
    k: K,
    f: (e: Extract<E, { _tag: K }>) => Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | Exclude<E, { _tag: K }>
  >
}

Added in v1.0.0

catchTags

Signature

export declare const catchTags: {
  <
    E,
    Cases extends E extends { _tag: string }
      ? { [K in E["_tag"]]+?: ((error: Extract<E, { _tag: K }>) => Route.Handler<any, any>) | undefined }
      : {}
  >(
    cases: Cases
  ): <R>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<
        {
          [K in keyof Cases]: Cases[K] extends (...args: Array<any>) => Effect.Effect<infer R, any, any> ? R : never
        }[keyof Cases],
        Scope.Scope | ServerRequest.ServerRequest | RouteContext
      >,
    | Exclude<E, { _tag: keyof Cases }>
    | {
        [K in keyof Cases]: Cases[K] extends (...args: Array<any>) => Effect.Effect<any, infer E, any> ? E : never
      }[keyof Cases]
  >
  <
    R,
    E,
    Cases extends E extends { _tag: string }
      ? { [K in E["_tag"]]+?: ((error: Extract<E, { _tag: K }>) => Route.Handler<any, any>) | undefined }
      : {}
  >(
    self: Router<R, E>,
    cases: Cases
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<
        {
          [K in keyof Cases]: Cases[K] extends (...args: Array<any>) => Effect.Effect<infer R, any, any> ? R : never
        }[keyof Cases],
        Scope.Scope | ServerRequest.ServerRequest | RouteContext
      >,
    | Exclude<E, { _tag: keyof Cases }>
    | {
        [K in keyof Cases]: Cases[K] extends (...args: Array<any>) => Effect.Effect<any, infer E, any> ? E : never
      }[keyof Cases]
  >
}

Added in v1.0.0

concat

Signature

export declare const concat: {
  <R1, E1>(that: Router<R1, E1>): <R, E>(self: Router<R, E>) => Router<R1 | R, E1 | E>
  <R, E, R1, E1>(self: Router<R, E>, that: Router<R1, E1>): Router<R | R1, E | E1>
}

Added in v1.0.0

prefixAll

Signature

export declare const prefixAll: {
  (prefix: PathInput): <R, E>(self: Router<R, E>) => Router<R, E>
  <R, E>(self: Router<R, E>, prefix: PathInput): Router<R, E>
}

Added in v1.0.0

provideService

Signature

export declare const provideService: {
  <T extends Context.Tag<any, any>>(
    tag: T,
    service: Context.Tag.Service<T>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    Exclude<Exclude<R, Context.Tag.Identifier<T>>, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E
  >
  <R, E, T extends Context.Tag<any, any>>(
    self: Router<R, E>,
    tag: T,
    service: Context.Tag.Service<T>
  ): Router<Exclude<Exclude<R, Context.Tag.Identifier<T>>, Scope.Scope | ServerRequest.ServerRequest | RouteContext>, E>
}

Added in v1.0.0

provideServiceEffect

Signature

export declare const provideServiceEffect: {
  <T extends Context.Tag<any, any>, R1, E1>(
    tag: T,
    effect: Effect.Effect<R1, E1, Context.Tag.Service<T>>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<Exclude<R, Context.Tag.Identifier<T>>, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, T extends Context.Tag<any, any>, R1, E1>(
    self: Router<R, E>,
    tag: T,
    effect: Effect.Effect<R1, E1, Context.Tag.Service<T>>
  ): Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<Exclude<R, Context.Tag.Identifier<T>>, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

use

Signature

export declare const use: {
  <R, E, R1, E1>(
    f: (self: Route.Handler<R, E>) => App.Default<R1, E1>
  ): (self: Router<R, E>) => Router<Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>, E1>
  <R, E, R1, E1>(
    self: Router<R, E>,
    f: (self: Route.Handler<R, E>) => App.Default<R1, E1>
  ): Router<Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>, E1>
}

Added in v1.0.0

constructors

empty

Signature

export declare const empty: Router<never, never>

Added in v1.0.0

fromIterable

Signature

export declare const fromIterable: <R, E>(routes: Iterable<Route<R, E>>) => Router<R, E>

Added in v1.0.0

makeRoute

Signature

export declare const makeRoute: <R, E>(
  method: Method.Method,
  path: PathInput,
  handler: Route.Handler<R, E>,
  prefix?: Option.Option<string>
) => Route<Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>, E>

Added in v1.0.0

models

PathInput (type alias)

Signature

export type PathInput = `/${string}` | "*"

Added in v1.0.0

Route (interface)

Signature

export interface Route<R, E> {
  readonly [RouteTypeId]: RouteTypeId
  readonly method: Method.Method | "*"
  readonly path: PathInput
  readonly handler: Route.Handler<R, E>
  readonly prefix: Option.Option<string>
}

Added in v1.0.0

RouteContext (interface)

Signature

export interface RouteContext {
  readonly [RouteContextTypeId]: RouteContextTypeId
  readonly params: Readonly<Record<string, string | undefined>>
  readonly searchParams: Readonly<Record<string, string>>
}

Added in v1.0.0

Router (interface)

Signature

export interface Router<R, E> extends App.Default<Exclude<R, RouteContext>, E | Error.RouteNotFound> {
  readonly [TypeId]: TypeId
  readonly routes: Chunk.Chunk<Route<R, E>>
  readonly mounts: Chunk.Chunk<readonly [string, App.Default<R, E>]>
}

Added in v1.0.0

route context

RouteContext

Signature

export declare const RouteContext: Context.Tag<RouteContext, RouteContext>

Added in v1.0.0

params

Signature

export declare const params: Effect.Effect<RouteContext, never, Readonly<Record<string, string | undefined>>>

Added in v1.0.0

schemaParams

Signature

export declare const schemaParams: <I extends Readonly<Record<string, string>>, A>(
  schema: Schema.Schema<I, A>
) => Effect.Effect<RouteContext, ParseResult.ParseError, A>

Added in v1.0.0

schemaPathParams

Signature

export declare const schemaPathParams: <I extends Readonly<Record<string, string>>, A>(
  schema: Schema.Schema<I, A>
) => Effect.Effect<RouteContext, ParseResult.ParseError, A>

Added in v1.0.0

schemaSearchParams

Signature

export declare const schemaSearchParams: <I extends Readonly<Record<string, string>>, A>(
  schema: Schema.Schema<I, A>
) => Effect.Effect<RouteContext, ParseResult.ParseError, A>

Added in v1.0.0

searchParams

Signature

export declare const searchParams: Effect.Effect<RouteContext, never, Readonly<Record<string, string>>>

Added in v1.0.0

routing

all

Signature

export declare const all: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

del

Signature

export declare const del: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

get

Signature

export declare const get: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

Signature

export declare const head: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

mount

Signature

export declare const mount: {
  <R1, E1>(path: `/${string}`, that: Router<R1, E1>): <R, E>(self: Router<R, E>) => Router<R1 | R, E1 | E>
  <R, E, R1, E1>(self: Router<R, E>, path: `/${string}`, that: Router<R1, E1>): Router<R | R1, E | E1>
}

Added in v1.0.0

mountApp

Signature

export declare const mountApp: {
  <R1, E1>(
    path: `/${string}`,
    that: App.Default<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: `/${string}`,
    that: App.Default<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

options

Signature

export declare const options: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

patch

Signature

export declare const patch: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

post

Signature

export declare const post: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

put

Signature

export declare const put: {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

route

Signature

export declare const route: (method: Method.Method | "*") => {
  <R1, E1>(
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): <R, E>(
    self: Router<R, E>
  ) => Router<
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E1 | E
  >
  <R, E, R1, E1>(
    self: Router<R, E>,
    path: PathInput,
    handler: Route.Handler<R1, E1>
  ): Router<
    | Exclude<R, Scope.Scope | ServerRequest.ServerRequest | RouteContext>
    | Exclude<R1, Scope.Scope | ServerRequest.ServerRequest | RouteContext>,
    E | E1
  >
}

Added in v1.0.0

type ids

RouteContextTypeId

Signature

export declare const RouteContextTypeId: typeof RouteContextTypeId

Added in v1.0.0

RouteContextTypeId (type alias)

Signature

export type RouteContextTypeId = typeof RouteContextTypeId

Added in v1.0.0

RouteTypeId

Signature

export declare const RouteTypeId: typeof RouteTypeId

Added in v1.0.0

RouteTypeId (type alias)

Signature

export type RouteTypeId = typeof RouteTypeId

Added in v1.0.0

TypeId

Signature

export declare const TypeId: typeof TypeId

Added in v1.0.0

TypeId (type alias)

Signature

export type TypeId = typeof TypeId

Added in v1.0.0

utils

Route (namespace)

Added in v1.0.0

Handler (type alias)

Signature

export type Handler<R, E> = Effect.Effect<
  R | RouteContext | ServerRequest.ServerRequest,
  E,
  ServerResponse.ServerResponse
>

Added in v1.0.0

Router (namespace)

Added in v1.0.0

ExcludeProvided (type alias)

Signature

export type ExcludeProvided<A> = Exclude<A, RouteContext | ServerRequest.ServerRequest | Scope.Scope>

Added in v1.0.0