Skip to content
On this page

Schema

Schema is used to define the strict type for the KingWorld handler.

Schema is not an event but a value used in a validation event.

To strictly type and validate an incoming request and outgoing response.

Schema is consists of:

  • body
  • query
  • params
  • header
  • response

Schema is defined as:

  • Locally: in a handler
  • Globally: limits to the scope

Local Schema

Local schema tied to a specific route in local handler.

To define a schema, import t, a schema builder re-exported from @sinclair/typebox:

typescript
import { KingWorld, t } from 'kingworld'

new KingWorld()
    .post('/mirror', ({ body }) => body, {
        schema: {
            body: t.Object({
                username: t.String(),
                password: t.String()
            })
        }
    })

This will strictly validate incoming body and infer body type in handler as:

typescript
// Inferred type
interface Body {
    username: string
    password: string
}

Means that you will get strict type defining once from schema and get inferred type to TypeScript without needing to write a single of TypeScript.

Global and scope

Global schema will define all type of handler in the scope.

typescript
app.guard({
    schema: {
        response: t.String()
    }
}, app => app
    .get('/', () => 'Hi')
    // Invalid: will throws error, and TypeScript will report error
    .get('/invalid', () => 1)
)

Global type will be overwrite by nearest schema to the handler.

In the otherword, inherits schema is rewrite by the inner scope.

typescript
app.guard({
    schema: {
        response: t.String()
    }
}, app => app.guard({
        schema: {
            response: t.Number()
        }
    }, app => app
        // Invalid: will throws error, and TypeScript will report error
        .get('/', () => 'Hi')
        .get('/invalid', () => 1)
    )
)

group and guard will define scope limit, so the type will not get out of the scope handler.