Routing

Routing is the most important thing, check this out

Introduction

In the versatile world of JavaScript, wrap plays a key role in harmonizing the language’s polymorphic nature with Vixeny’s functional approach. It ensures scalability and maintains code purity, crucial for efficient web development.

// name of this file: api.ts
import { wrap } from "vixeny";
//routing options
import { options } from "somewhere.ts"; 

const api = wrap({
  //setting up options
  ...options,
  startWith: "/api",
})()
//creating a petition
  .stdPetition({
    path: "/ping",
    f: () => "pong",
  })

export { api }

Simplifing handling diverse HTTP requests, offering a structured, side-effect-free programming environment. This makes building, maintaining, and scaling web applications more intuitive and manageable, showcasing wrap as an essential tool in the Vixeny toolkit.

import { wrap, vixeny } from "vixeny";
import { options } from "somewhere.ts"; 
import { api } from "api.ts"; 

const router = wrap(options)()
  .stdPetition({
    path: "/",
    f: () => "hello world",
  })
  //joining `api` to this wrap
  .union(api.unwrap())
  // console logging:
  // outputs: '/'
  //          '/api/ping'
  .logPaths()

// unwrapping all the petitions giving them to the router
vixeny(options)(router.unwrap())

Petitions

Let’s create a Petition without wrap and export it an create new differents routes out of it.

import { Petition } from "vixeny/optimizer/types";

const surprise: Petition = {
    path: "/meow",
    headings: {
        status: 307,
        statusText: "Temporary Redirect",
        headers: {
            Location: "https://www.youtube.com/watch?v=_e9yMqmXWo0"
        }
    },
    f: (c) => ""
}

export { surprise }

In another file:

import { surprise }  from 'somewhere.ts'

export default wrap(options)()
  .stdPetition(surprise)
  .stdPetition({...surprise, path: '/woof'})
  .stdPetition({...surprise, path: '/woooow'})
  // console logging:
  // outputs: '/meow'
  //          '/woof'
  //          '/woooow'
  .logPaths()

Applies to any other key in the object.

Types

There are two type of petitions:

  • stdPetition: where you have to return a BodyInt or Promise<BodyInt>
  • customPetition: where you have to return a Response or Promise<Response>
wrap(options)()
  .stdPetition({
    path: "/",
    f: () => "hello world",
  })
  .customPetition({
    path: "/response/who/:name",
    f: (c) =>  new Response(c.param.name)
  })

It is important to note that wrap only supports these types although there are more types which serve different purposes which must be directly inserted.

vixeny(options)([
    //importing all the paths
    ...wrap(options)()
      .union(root.unwrap())
      .union(api.unwrap())
      .unwrap(),
    //adding the static server
    {
      type: "fileServer",
      path: "./public/",
      name: "/public/",
    },
    // petition without ctx
    {
      path: "/responseType",
      type: "response",
      r: () => new Response('Hello')
    }
  ])