This is the full developer documentation for Shokupan
# Shokupan
> The web framework that feels like a fresh start.
## Features
[Section titled “Features”](#features)
Type Safe
End-to-end type safety with decorators. Pass data around without ever losing your types.
Zero Config
Stop configuring build tools. Shokupan just works, letting you focus on your product.
Debug Dashboard
Visualize your routes and debug requests with a beautiful built-in dashboard.
Snappy Performance
Built on Bun for instant startup times and low-latency responses.
Auto OpenAPI
Generate [OpenAPI](https://www.openapis.org/) specs automatically from your routes
Rich Plugin System
CORS, Sessions, Auth, Validation, Rate Limiting, and more out of the box
Flexible Routing
Express-style routes or decorator-based controllers - your choice
Express Compatible
Works with [Express](https://expressjs.com/) middleware patterns you already know
Built-in Telemetry
[OpenTelemetry](https://opentelemetry.io/) instrumentation out of the box
OAuth2 Support
GitHub, Google, Microsoft, Apple, Auth0, Okta ready to go
Multi-validator Support
Zod, Ajv, TypeBox, Valibot - use what you prefer
Beautiful Docs
Beautiful OpenAPI documentation with [Scalar](https://scalar.dev/)
Easy Migration
Simple migration from [Express](https://expressjs.com/) or [NestJS](https://nestjs.com/)
## Quick Start
[Section titled “Quick Start”](#quick-start)
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
port: 3000,
development: true
});
app.get('/', (ctx) => {
return { message: 'Hello, World!' };
});
app.listen();
```
That’s it! Your server is running at `http://localhost:3000` 🎉
Alpha Status
Shokupan is still in alpha and is not guaranteed to be stable. Please use with caution. We will be adding more features and APIs in the future. Please file an issue if you find any bugs or have suggestions for improvement.
## Why Shokupan?
[Section titled “Why Shokupan?”](#why-shokupan)
Shokupan (食パン - Japanese for “white bread”) provides the foundation for your web applications - simple, reliable, and essential. It combines:
* **Familiarity**: Express.js-like API that feels natural
* **Modern Architecture**: NestJS-style decorators and dependency injection
* **Performance**: Built on Bun for exceptional speed
* **Developer Experience**: Full TypeScript support with excellent type inference
* **Ecosystem**: Compatible with the vast Express plugin ecosystem
## Next Steps
[Section titled “Next Steps”](#next-steps)
Installation
[Install Shokupan](/getting-started/installation/) and set up your first project
Core Concepts
Learn about [routing](/core/routing/), [controllers](/core/controllers/), and [middleware](/core/middleware/)
Plugins
Explore the [plugin system](/plugins/cors/) for adding features
Migration
Migrate from [Express](/migration/from-express/), [Koa](/migration/from-koa/), or [NestJS](/migration/from-nestjs/)
# AuthPlugin
Defined in: [src/plugins/application/auth.ts:128](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L128)
Authentication plugin
## Extends
[Section titled “Extends”](#extends)
* `ShokupanRouter`<`any`>
## Implements
[Section titled “Implements”](#implements)
* [`ShokupanPlugin`](/api/interfaces/shokupanplugin/)
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new AuthPlugin**(`authConfig`): `AuthPlugin`
Defined in: [src/plugins/application/auth.ts:131](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L131)
#### Parameters
[Section titled “Parameters”](#parameters)
##### authConfig
[Section titled “authConfig”](#authconfig)
[`AuthConfig`](/api/interfaces/authconfig/)
#### Returns
[Section titled “Returns”](#returns)
`AuthPlugin`
#### Overrides
[Section titled “Overrides”](#overrides)
`ShokupanRouter.constructor`
## Properties
[Section titled “Properties”](#properties)
### \[$childControllers]
[Section titled “\[$childControllers\]”](#childcontrollers)
> **\[$childControllers]**: [`ShokupanController`](/api/type-aliases/shokupancontroller/)\[] = `[]`
Defined in: [src/router.ts:89](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L89)
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`ShokupanRouter.[$childControllers]`
***
### \[$childRouters]
[Section titled “\[$childRouters\]”](#childrouters)
> **\[$childRouters]**: `ShokupanRouter`<`any`>\[] = `[]`
Defined in: [src/router.ts:88](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L88)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`ShokupanRouter.[$childRouters]`
***
### \[$mountPath]
[Section titled “\[$mountPath\]”](#mountpath)
> **\[$mountPath]**: `string` = `"/"`
Defined in: [src/router.ts:85](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L85)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`ShokupanRouter.[$mountPath]`
***
### \[$routes]
[Section titled “\[$routes\]”](#routes)
> **\[$routes]**: [`ShokupanRoute`](/api/type-aliases/shokupanroute/)\[] = `[]`
Defined in: [src/router.ts:103](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L103)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`ShokupanRouter.[$routes]`
***
### config?
[Section titled “config?”](#config)
> `readonly` `optional` **config**: `object`
Defined in: [src/router.ts:183](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L183)
#### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
##### Default
[Section titled “Default”](#default)
```ts
false
```
#### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests.
#### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
##### Default
[Section titled “Default”](#default-1)
```ts
false
```
#### group?
[Section titled “group?”](#group)
> `optional` **group**: `string`
#### hooks?
[Section titled “hooks?”](#hooks)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Hooks for this route/router.
#### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
#### openapi?
[Section titled “openapi?”](#openapi)
> `optional` **openapi**: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `consumes?`: `string`\[]; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; `description?`: `string`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; } | {\[`key`: `string`]: `any`; `$ref?`: `string`; `allowEmptyValue?`: `boolean`; `collectionFormat?`: `string`; `default?`: `any`; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `in?`: `ParameterLocation`; `items?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { type?: string; format?: string; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | …; collectionFormat?: string; default?: any; … 12 more …; $ref?: string; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `name?`: `string`; `pattern?`: `string`; `required?`: `boolean`; `type?`: `string`; `uniqueItems?`: `boolean`; })\[]; `produces?`: `string`\[]; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; `default?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; }; `schemes?`: `string`\[]; `security?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `object`; }; }; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `headers?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `security?`: `object`\[]; `servers?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `parameters?`: ({ `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `servers?`: `object`\[]; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; }; }; }; `parameters?`: ({ `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `servers?`: `object`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `additionalOperations?`: {\[`key`: `string`]: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `parameters?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `query?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; }; }; `parameters?`: ({\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `dataValue?`: `any`; `description?`: `string`; `externalValue?`: `string`; `serializedValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: (`"array"` | `NonArraySchemaObjectType`)\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `dataValue?`: …; `description?`: …; `externalValue?`: …; `serializedValue?`: …; `summary?`: …; `value?`: …; }; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: `string`]: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; }; `explode?`: `boolean`; `headers?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; }; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: …]: …; }; `explode?`: `boolean`; `headers?`: {\[`key`: …]: …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: …\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: … | …; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `name?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; `summary?`: `string`; }; }; `servers?`: `object`\[]; }
#### renderer?
[Section titled “renderer?”](#renderer)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
Custom renderer for this route.
#### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout)
> `optional` **requestTimeout**: `number`
Timeout for this specific route (milliseconds).
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`ShokupanRouter.config`
***
### metadata?
[Section titled “metadata?”](#metadata)
> `optional` **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
Defined in: [src/router.ts:105](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L105)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`ShokupanRouter.metadata`
***
### middleware
[Section titled “middleware”](#middleware)
> **middleware**: [`Middleware`](/api/type-aliases/middleware/)\[] = `[]`
Defined in: [src/router.ts:94](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L94)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`ShokupanRouter.middleware`
***
### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-1)
> `optional` **requestTimeout**: `number`
Defined in: [src/router.ts:792](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L792)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`ShokupanRouter.requestTimeout`
## Accessors
[Section titled “Accessors”](#accessors)
### root
[Section titled “root”](#root)
#### Get Signature
[Section titled “Get Signature”](#get-signature)
> **get** **root**(): [`Shokupan`](/api/classes/shokupan/)<`any`>
Defined in: [src/router.ts:99](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L99)
##### Returns
[Section titled “Returns”](#returns-1)
[`Shokupan`](/api/classes/shokupan/)<`any`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`ShokupanRouter.root`
***
### rootConfig
[Section titled “rootConfig”](#rootconfig)
#### Get Signature
[Section titled “Get Signature”](#get-signature-1)
> **get** **rootConfig**(): `object`
Defined in: [src/router.ts:96](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L96)
##### Returns
[Section titled “Returns”](#returns-2)
###### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback-1)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
###### Default
[Section titled “Default”](#default-2)
```ts
false
```
###### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel-1)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests (429).
###### Default
[Section titled “Default”](#default-3)
```ts
60
```
###### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly-1)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
###### Default
[Section titled “Default”](#default-4)
```ts
false
```
###### development?
[Section titled “development?”](#development)
> `optional` **development**: `boolean`
Whether to run in development mode.
###### Default
[Section titled “Default”](#default-5)
```ts
process.env.NODE_ENV !== "production"
```
###### enableAsyncLocalStorage?
[Section titled “enableAsyncLocalStorage?”](#enableasynclocalstorage)
> `optional` **enableAsyncLocalStorage**: `boolean`
Whether to enable AsyncLocalStorage. (Request local storage)
###### Default
[Section titled “Default”](#default-6)
```ts
false
```
###### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking)
> `optional` **enableMiddlewareTracking**: `boolean`
Whether to enable middleware and handler tracking. When enabled, `ctx.handlerStack` will be populated with the handlers the request has passed through. Also, `ctx.state` will be a Proxy that tracks changes made by each handler.
###### Default
[Section titled “Default”](#default-7)
```ts
false
```
###### enableOpenApiGen?
[Section titled “enableOpenApiGen?”](#enableopenapigen)
> `optional` **enableOpenApiGen**: `boolean`
Whether to enable OpenAPI generation.
###### Default
[Section titled “Default”](#default-8)
```ts
true
```
###### enableTracing?
[Section titled “enableTracing?”](#enabletracing)
> `optional` **enableTracing**: `boolean`
Whether to enable OpenTelemetry tracing.
###### Default
[Section titled “Default”](#default-9)
```ts
false
```
###### hooks?
[Section titled “hooks?”](#hooks-1)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Lifecycle hooks.
###### hostname?
[Section titled “hostname?”](#hostname)
> `optional` **hostname**: `string`
The hostname to be used for the server.
###### Default
[Section titled “Default”](#default-10)
```ts
"localhost"
```
###### httpLogger()?
[Section titled “httpLogger()?”](#httplogger)
> `optional` **httpLogger**: (`ctx`) => `void`
HTTP logger function.
###### Parameters
[Section titled “Parameters”](#parameters-1)
###### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`Record`<`string`, `any`>>
###### Returns
[Section titled “Returns”](#returns-3)
`void`
###### jsonParser?
[Section titled “jsonParser?”](#jsonparser)
> `optional` **jsonParser**: `"native"` | `"parse-json"` | `"secure-json-parse"`
JSON parser to use for parsing request bodies.
Options:
* `'native'`: Use the built-in JSON.parse (fastest, default)
* `'parse-json'`: Use the parse-json library for better error messages with minimal performance overhead (\~5% slower than native)
* `'secure-json-parse'`: Use secure-json-parse for protection against prototype pollution (20-30% slower than native)
Performance implications based on benchmarks:
* `native`: Fastest option, excellent for production
* `parse-json`: Nearly identical performance to native with better error messages, good for development
* `secure-json-parse`: Provides security at the cost of performance, use only for untrusted input
###### Default
[Section titled “Default”](#default-11)
```ts
'native'
```
###### logger?
[Section titled “logger?”](#logger)
> `optional` **logger**: `object`
Logger object.
###### logger.debug()?
[Section titled “logger.debug()?”](#loggerdebug)
> `optional` **debug**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-2)
###### msg
[Section titled “msg”](#msg)
`string`
###### props
[Section titled “props”](#props)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-4)
`void`
###### logger.error()?
[Section titled “logger.error()?”](#loggererror)
> `optional` **error**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-3)
###### msg
[Section titled “msg”](#msg-1)
`string`
###### props
[Section titled “props”](#props-1)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-5)
`void`
###### logger.fatal()?
[Section titled “logger.fatal()?”](#loggerfatal)
> `optional` **fatal**: (`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### Parameters
[Section titled “Parameters”](#parameters-4)
###### msg
[Section titled “msg”](#msg-2)
`string`
###### props
[Section titled “props”](#props-2)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-6)
`void`
###### logger.info()?
[Section titled “logger.info()?”](#loggerinfo)
> `optional` **info**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-5)
###### msg
[Section titled “msg”](#msg-3)
`string`
###### props
[Section titled “props”](#props-3)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-7)
`void`
###### logger.verbose?
[Section titled “logger.verbose?”](#loggerverbose)
> `optional` **verbose**: `boolean`
###### logger.warning()?
[Section titled “logger.warning()?”](#loggerwarning)
> `optional` **warning**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-6)
###### msg
[Section titled “msg”](#msg-4)
`string`
###### props
[Section titled “props”](#props-4)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-8)
`void`
###### middlewareTrackingMaxCapacity?
[Section titled “middlewareTrackingMaxCapacity?”](#middlewaretrackingmaxcapacity)
> `optional` **middlewareTrackingMaxCapacity**: `number`
Maximum number of middleware executions to store in the datastore. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-12)
```ts
10000
```
###### middlewareTrackingTTL?
[Section titled “middlewareTrackingTTL?”](#middlewaretrackingttl)
> `optional` **middlewareTrackingTTL**: `number`
Time-to-live for middleware tracking entries in milliseconds. Entries older than this will be cleaned up. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-13)
```ts
86400000 (1 day)
```
###### port?
[Section titled “port?”](#port)
> `optional` **port**: `number`
The port to be used for the server.
###### Default
[Section titled “Default”](#default-14)
```ts
3000
```
###### readTimeout?
[Section titled “readTimeout?”](#readtimeout)
> `optional` **readTimeout**: `number`
Timeout for reading the request body (milliseconds). Maps to Bun’s `idleTimeout`.
###### Default
[Section titled “Default”](#default-15)
```ts
30000
```
###### renderer?
[Section titled “renderer?”](#renderer-1)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX Rendering function.
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-2)
> `optional` **requestTimeout**: `number`
Timeout for processing the request (milliseconds). Maps to `server.timeout(req, seconds)`.
###### Default
[Section titled “Default”](#default-16)
```ts
0 (disabled)
```
###### reusePort?
[Section titled “reusePort?”](#reuseport)
> `optional` **reusePort**: `boolean`
Whether to reuse the port.
###### Default
[Section titled “Default”](#default-17)
```ts
false
```
###### serverFactory?
[Section titled “serverFactory?”](#serverfactory)
> `optional` **serverFactory**: [`ServerFactory`](/api/interfaces/serverfactory/)
Factory function to create the server instance. Defaults to Bun.serve.
###### validateStatusCodes?
[Section titled “validateStatusCodes?”](#validatestatuscodes)
> `optional` **validateStatusCodes**: `boolean`
Whether to validate response status codes.
###### Default
[Section titled “Default”](#default-18)
```ts
true
```
###### writeTimeout?
[Section titled “writeTimeout?”](#writetimeout)
> `optional` **writeTimeout**: `number`
Timeout for writing the response (milliseconds). Not currently supported by Bun.serve natively.
Experimental
This API should not be used in production and may be trimmed from a public release.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`ShokupanRouter.rootConfig`
## Methods
[Section titled “Methods”](#methods)
### add()
[Section titled “add()”](#add)
> **add**(`arg`): `AuthPlugin`
Defined in: [src/router.ts:808](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L808)
Adds a route to the router.
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### arg
[Section titled “arg”](#arg)
Route configuration object
###### controller?
[Section titled “controller?”](#controller)
`any`
Controller for the route
###### group?
[Section titled “group?”](#group-1)
`string`
Group for the route
###### handler
[Section titled “handler”](#handler)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Route handler function
###### method
[Section titled “method”](#method)
[`Method`](/api/type-aliases/method/)
HTTP method
###### path
[Section titled “path”](#path)
`string`
URL path
###### regex?
[Section titled “regex?”](#regex)
`RegExp`
Custom regex for path matching
###### renderer?
[Section titled “renderer?”](#renderer-2)
[`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX renderer for the route
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-3)
`number`
Timeout for this route in milliseconds
###### spec?
[Section titled “spec?”](#spec)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
#### Returns
[Section titled “Returns”](#returns-9)
`AuthPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-10)
`ShokupanRouter.add`
***
### delete()
[Section titled “delete()”](#delete)
#### Call Signature
[Section titled “Call Signature”](#call-signature)
> **delete**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1079](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1079)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters)
###### Path
[Section titled “Path”](#path-1)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-8)
###### path
[Section titled “path”](#path-2)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-10)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-11)
`ShokupanRouter.delete`
#### Call Signature
[Section titled “Call Signature”](#call-signature-1)
> **delete**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1087](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1087)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
###### Path
[Section titled “Path”](#path-3)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-9)
###### path
[Section titled “path”](#path-4)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-1)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-1)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-11)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-12)
`ShokupanRouter.delete`
***
### find()
[Section titled “find()”](#find)
> **find**(`method`, `path`): `object`
Defined in: [src/router.ts:726](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L726)
Find a route matching the given method and path.
#### Parameters
[Section titled “Parameters”](#parameters-10)
##### method
[Section titled “method”](#method-1)
`string`
HTTP method
##### path
[Section titled “path”](#path-5)
`string`
Request path
#### Returns
[Section titled “Returns”](#returns-12)
`object`
Route handler and parameters if found, otherwise null
##### handler
[Section titled “handler”](#handler-1)
> **handler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
##### params
[Section titled “params”](#params)
> **params**: `Record`<`string`, `string`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-13)
`ShokupanRouter.find`
***
### generateApiSpec()
[Section titled “generateApiSpec()”](#generateapispec)
> **generateApiSpec**(`options`): `any`
Defined in: [src/router.ts:1306](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1306)
Generates an OpenAPI 3.1 Document by recursing through the router and its descendants. Now includes runtime analysis of handler functions to infer request/response types.
#### Parameters
[Section titled “Parameters”](#parameters-11)
##### options
[Section titled “options”](#options)
[`OpenAPIOptions`](/api/interfaces/openapioptions/) = `{}`
#### Returns
[Section titled “Returns”](#returns-13)
`any`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-14)
`ShokupanRouter.generateApiSpec`
***
### get()
[Section titled “get()”](#get)
#### Call Signature
[Section titled “Call Signature”](#call-signature-2)
> **get**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1019](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1019)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
###### Path
[Section titled “Path”](#path-6)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-12)
###### path
[Section titled “path”](#path-7)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-2)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-14)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-15)
`ShokupanRouter.get`
#### Call Signature
[Section titled “Call Signature”](#call-signature-3)
> **get**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1027](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1027)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-3)
###### Path
[Section titled “Path”](#path-8)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-13)
###### path
[Section titled “path”](#path-9)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-2)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-3)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-15)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-16)
`ShokupanRouter.get`
***
### getComponentRegistry()
[Section titled “getComponentRegistry()”](#getcomponentregistry)
> **getComponentRegistry**(): `object`
Defined in: [src/router.ts:110](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L110)
#### Returns
[Section titled “Returns”](#returns-16)
`object`
##### controllers
[Section titled “controllers”](#controllers)
> **controllers**: `object`\[]
##### metadata
[Section titled “metadata”](#metadata-1)
> **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
##### middleware
[Section titled “middleware”](#middleware-1)
> **middleware**: `object`\[]
##### routers
[Section titled “routers”](#routers)
> **routers**: `object`\[]
##### routes
[Section titled “routes”](#routes-1)
> **routes**: `object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-17)
`ShokupanRouter.getComponentRegistry`
***
### getMiddleware()
[Section titled “getMiddleware()”](#getmiddleware)
> **getMiddleware**(): (`ctx`, `next`) => `Promise`<`any`>
Defined in: [src/plugins/application/auth.ts:393](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L393)
Middleware to verify JWT
#### Returns
[Section titled “Returns”](#returns-17)
> (`ctx`, `next`): `Promise`<`any`>
##### Parameters
[Section titled “Parameters”](#parameters-14)
###### ctx
[Section titled “ctx”](#ctx-1)
[`ShokupanContext`](/api/classes/shokupancontext/)
###### next
[Section titled “next”](#next)
() => `Promise`<`any`>
##### Returns
[Section titled “Returns”](#returns-18)
`Promise`<`any`>
***
### getRoutes()
[Section titled “getRoutes()”](#getroutes)
> **getRoutes**(): `object`\[]
Defined in: [src/router.ts:229](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L229)
Returns all routes attached to this router and its descendants.
#### Returns
[Section titled “Returns”](#returns-19)
`object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-18)
`ShokupanRouter.getRoutes`
***
### guard()
[Section titled “guard()”](#guard)
#### Call Signature
[Section titled “Call Signature”](#call-signature-4)
> **guard**(`handler`): `void`
Defined in: [src/router.ts:1159](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1159)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-15)
###### handler
[Section titled “handler”](#handler-2)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-20)
`void`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-19)
`ShokupanRouter.guard`
#### Call Signature
[Section titled “Call Signature”](#call-signature-5)
> **guard**(`spec`, `handler`): `any`
Defined in: [src/router.ts:1167](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1167)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-16)
###### spec
[Section titled “spec”](#spec-3)
[`GuardAPISpec`](/api/type-aliases/guardapispec/)
OpenAPI specification for the guard
###### handler
[Section titled “handler”](#handler-3)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-21)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-20)
`ShokupanRouter.guard`
***
### head()
[Section titled “head()”](#head)
#### Call Signature
[Section titled “Call Signature”](#call-signature-6)
> **head**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1139](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1139)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-4)
###### Path
[Section titled “Path”](#path-10)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-17)
###### path
[Section titled “path”](#path-11)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-4)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-22)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-21)
`ShokupanRouter.head`
#### Call Signature
[Section titled “Call Signature”](#call-signature-7)
> **head**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1147](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1147)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-5)
###### Path
[Section titled “Path”](#path-12)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-18)
###### path
[Section titled “path”](#path-13)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-4)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-5)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-23)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-22)
`ShokupanRouter.head`
***
### internalRequest()
[Section titled “internalRequest()”](#internalrequest)
> **internalRequest**(`arg`): `Promise`<`Response`>
Defined in: [src/router.ts:261](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L261)
Makes an internal request through this router’s full routing pipeline. This is useful for calling other routes internally and supports streaming responses.
#### Parameters
[Section titled “Parameters”](#parameters-19)
##### arg
[Section titled “arg”](#arg-1)
`string` | { `body?`: `any`; `headers?`: [`HeadersInit`](/api/type-aliases/headersinit/); `method?`: [`Method`](/api/type-aliases/method/); `path`: `string`; }
#### Returns
[Section titled “Returns”](#returns-24)
`Promise`<`Response`>
The raw Response object.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-23)
`ShokupanRouter.internalRequest`
***
### mount()
[Section titled “mount()”](#mount)
> **mount**(`prefix`, `controller`): `AuthPlugin`
Defined in: [src/router.ts:205](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L205)
Mounts a controller instance to a path prefix.
Controller can be a convection router or an arbitrary class.
Routes are derived from method names:
* get(ctx) -> GET /prefix/
* getUsers(ctx) -> GET /prefix/users
* postCreate(ctx) -> POST /prefix/create
#### Parameters
[Section titled “Parameters”](#parameters-20)
##### prefix
[Section titled “prefix”](#prefix)
`string`
##### controller
[Section titled “controller”](#controller-1)
`Record`<`string`, `any`> | `ShokupanRouter`<`any`> | [`ShokupanController`](/api/type-aliases/shokupancontroller/) | `ShokupanRouter`<`Record`<`string`, `any`>> | [`ShokupanController`](/api/type-aliases/shokupancontroller/)<`any`>
#### Returns
[Section titled “Returns”](#returns-25)
`AuthPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-24)
`ShokupanRouter.mount`
***
### onInit()
[Section titled “onInit()”](#oninit)
> **onInit**(`app`, `options?`): `void`
Defined in: [src/plugins/application/auth.ts:140](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L140)
#### Parameters
[Section titled “Parameters”](#parameters-21)
##### app
[Section titled “app”](#app)
[`Shokupan`](/api/classes/shokupan/)
##### options?
[Section titled “options?”](#options-1)
[`ShokupanPluginOptions`](/api/interfaces/shokupanpluginoptions/)
#### Returns
[Section titled “Returns”](#returns-26)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of)
[`ShokupanPlugin`](/api/interfaces/shokupanplugin/).[`onInit`](/api/interfaces/shokupanplugin/#oninit)
***
### options()
[Section titled “options()”](#options-2)
#### Call Signature
[Section titled “Call Signature”](#call-signature-8)
> **options**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1119)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-6)
###### Path
[Section titled “Path”](#path-14)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-22)
###### path
[Section titled “path”](#path-15)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-6)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-27)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-25)
`ShokupanRouter.options`
#### Call Signature
[Section titled “Call Signature”](#call-signature-9)
> **options**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1127](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1127)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-7)
###### Path
[Section titled “Path”](#path-16)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-23)
###### path
[Section titled “path”](#path-17)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-5)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-7)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-28)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-26)
`ShokupanRouter.options`
***
### patch()
[Section titled “patch()”](#patch)
#### Call Signature
[Section titled “Call Signature”](#call-signature-10)
> **patch**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1099](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1099)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-8)
###### Path
[Section titled “Path”](#path-18)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-24)
###### path
[Section titled “path”](#path-19)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-8)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-29)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-27)
`ShokupanRouter.patch`
#### Call Signature
[Section titled “Call Signature”](#call-signature-11)
> **patch**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1107](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1107)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-9)
###### Path
[Section titled “Path”](#path-20)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-25)
###### path
[Section titled “path”](#path-21)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-6)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-9)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-30)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-28)
`ShokupanRouter.patch`
***
### post()
[Section titled “post()”](#post)
#### Call Signature
[Section titled “Call Signature”](#call-signature-12)
> **post**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1039](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1039)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-10)
###### Path
[Section titled “Path”](#path-22)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-26)
###### path
[Section titled “path”](#path-23)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-10)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-31)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-29)
`ShokupanRouter.post`
#### Call Signature
[Section titled “Call Signature”](#call-signature-13)
> **post**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1047](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1047)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-11)
###### Path
[Section titled “Path”](#path-24)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-27)
###### path
[Section titled “path”](#path-25)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-7)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-11)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-32)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-30)
`ShokupanRouter.post`
***
### put()
[Section titled “put()”](#put)
#### Call Signature
[Section titled “Call Signature”](#call-signature-14)
> **put**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1059](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1059)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-12)
###### Path
[Section titled “Path”](#path-26)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-28)
###### path
[Section titled “path”](#path-27)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-12)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-33)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-31)
`ShokupanRouter.put`
#### Call Signature
[Section titled “Call Signature”](#call-signature-15)
> **put**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1067](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1067)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-13)
###### Path
[Section titled “Path”](#path-28)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-29)
###### path
[Section titled “path”](#path-29)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-8)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-13)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-34)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-32)
`ShokupanRouter.put`
***
### runHooks()
[Section titled “runHooks()”](#runhooks)
> **runHooks**(`name`, …`args`): `Promise`<`void`>
Defined in: [src/router.ts:1339](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1339)
#### Parameters
[Section titled “Parameters”](#parameters-30)
##### name
[Section titled “name”](#name-1)
keyof [`ShokupanHooks`](/api/interfaces/shokupanhooks/)<`any`>
##### args
[Section titled “args”](#args)
…`any`\[]
#### Returns
[Section titled “Returns”](#returns-35)
`Promise`<`void`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-33)
`ShokupanRouter.runHooks`
***
### static()
[Section titled “static()”](#static)
> **static**(`uriPath`, `options`): `AuthPlugin`
Defined in: [src/router.ts:1217](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1217)
Statically serves a directory with standard options.
#### Parameters
[Section titled “Parameters”](#parameters-31)
##### uriPath
[Section titled “uriPath”](#uripath)
`string`
URL path prefix
##### options
[Section titled “options”](#options-3)
Configuration options or root directory string
`string` | [`StaticServeOptions`](/api/interfaces/staticserveoptions/)<`any`>
#### Returns
[Section titled “Returns”](#returns-36)
`AuthPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-34)
`ShokupanRouter.static`
***
### testRequest()
[Section titled “testRequest()”](#testrequest)
> **testRequest**(`options`): `Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
Defined in: [src/router.ts:293](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L293)
Processes a request for testing purposes. Returns a simplified { status, headers, data } object instead of a Response.
#### Parameters
[Section titled “Parameters”](#parameters-32)
##### options
[Section titled “options”](#options-4)
[`RequestOptions`](/api/interfaces/requestoptions/)
#### Returns
[Section titled “Returns”](#returns-37)
`Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-35)
`ShokupanRouter.testRequest`
# ClusterPlugin
Defined in: [src/plugins/application/cluster.ts:34](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L34)
Cluster Plugin
Automatically manages clustering for Node.js and Bun.
## Implements
[Section titled “Implements”](#implements)
* [`ShokupanPlugin`](/api/interfaces/shokupanplugin/)
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new ClusterPlugin**(`options`): `ClusterPlugin`
Defined in: [src/plugins/application/cluster.ts:35](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L35)
#### Parameters
[Section titled “Parameters”](#parameters)
##### options
[Section titled “options”](#options)
[`ClusterOptions`](/api/interfaces/clusteroptions/) = `{}`
#### Returns
[Section titled “Returns”](#returns)
`ClusterPlugin`
## Methods
[Section titled “Methods”](#methods)
### onInit()
[Section titled “onInit()”](#oninit)
> **onInit**(`app`): `void`
Defined in: [src/plugins/application/cluster.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L37)
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### app
[Section titled “app”](#app)
[`Shokupan`](/api/classes/shokupan/)
#### Returns
[Section titled “Returns”](#returns-1)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of)
[`ShokupanPlugin`](/api/interfaces/shokupanplugin/).[`onInit`](/api/interfaces/shokupanplugin/#oninit)
# Container
Defined in: [src/util/di.ts:5](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L5)
Simple Dependency Injection Container
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new Container**(): `Container`
#### Returns
[Section titled “Returns”](#returns)
`Container`
## Methods
[Section titled “Methods”](#methods)
### get()
[Section titled “get()”](#get)
> `static` **get**<`T`>(`target`): `T`
Defined in: [src/util/di.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L12)
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters)
##### T
[Section titled “T”](#t)
`T`
#### Parameters
[Section titled “Parameters”](#parameters)
##### target
[Section titled “target”](#target)
(…`args`) => `T`
#### Returns
[Section titled “Returns”](#returns-1)
`T`
***
### has()
[Section titled “has()”](#has)
> `static` **has**(`target`): `boolean`
Defined in: [src/util/di.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L16)
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### target
[Section titled “target”](#target-1)
`any`
#### Returns
[Section titled “Returns”](#returns-2)
`boolean`
***
### register()
[Section titled “register()”](#register)
> `static` **register**<`T`>(`target`, `instance`): `void`
Defined in: [src/util/di.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L8)
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
##### T
[Section titled “T”](#t-1)
`T`
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### target
[Section titled “target”](#target-2)
(…`args`) => `T`
##### instance
[Section titled “instance”](#instance)
`T`
#### Returns
[Section titled “Returns”](#returns-3)
`void`
***
### resolve()
[Section titled “resolve()”](#resolve)
> `static` **resolve**<`T`>(`target`): `T`
Defined in: [src/util/di.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L20)
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
##### T
[Section titled “T”](#t-2)
`T`
#### Parameters
[Section titled “Parameters”](#parameters-3)
##### target
[Section titled “target”](#target-3)
(…`args`) => `T`
#### Returns
[Section titled “Returns”](#returns-4)
`T`
# MemoryStore
Defined in: [src/plugins/middleware/session.ts:187](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L187)
## Extends
[Section titled “Extends”](#extends)
* `EventEmitter`
## Implements
[Section titled “Implements”](#implements)
* [`Store`](/api/interfaces/store/)
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new MemoryStore**(`options?`): `MemoryStore`
Defined in: node\_modules/@types/node/events.d.ts:134
#### Parameters
[Section titled “Parameters”](#parameters)
##### options?
[Section titled “options?”](#options)
`EventEmitterOptions`
#### Returns
[Section titled “Returns”](#returns)
`MemoryStore`
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`EventEmitter.constructor`
## Properties
[Section titled “Properties”](#properties)
### captureRejections
[Section titled “captureRejections”](#capturerejections)
> `static` **captureRejections**: `boolean`
Defined in: node\_modules/@types/node/events.d.ts:458
Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type)
Change the default `captureRejections` option on all new `EventEmitter` objects.
#### Since
[Section titled “Since”](#since)
v13.4.0, v12.16.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`EventEmitter.captureRejections`
***
### captureRejectionSymbol
[Section titled “captureRejectionSymbol”](#capturerejectionsymbol)
> `readonly` `static` **captureRejectionSymbol**: *typeof* [`captureRejectionSymbol`](/api/classes/memorystore/#capturerejectionsymbol)
Defined in: node\_modules/@types/node/events.d.ts:451
Value: `Symbol.for('nodejs.rejection')`
See how to write a custom `rejection handler`.
#### Since
[Section titled “Since”](#since-1)
v13.4.0, v12.16.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`EventEmitter.captureRejectionSymbol`
***
### defaultMaxListeners
[Section titled “defaultMaxListeners”](#defaultmaxlisteners)
> `static` **defaultMaxListeners**: `number`
Defined in: node\_modules/@types/node/events.d.ts:497
By default, a maximum of `10` listeners can be registered for any single event. This limit can be changed for individual `EventEmitter` instances using the `emitter.setMaxListeners(n)` method. To change the default for *all*`EventEmitter` instances, the `events.defaultMaxListeners` property can be used. If this value is not a positive number, a `RangeError` is thrown.
Take caution when setting the `events.defaultMaxListeners` because the change affects *all* `EventEmitter` instances, including those created before the change is made. However, calling `emitter.setMaxListeners(n)` still has precedence over `events.defaultMaxListeners`.
This is not a hard limit. The `EventEmitter` instance will allow more listeners to be added but will output a trace warning to stderr indicating that a “possible EventEmitter memory leak” has been detected. For any single `EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to temporarily avoid this warning:
```js
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
```
The `--trace-warnings` command-line flag can be used to display the stack trace for such warnings.
The emitted warning can be inspected with `process.on('warning')` and will have the additional `emitter`, `type`, and `count` properties, referring to the event emitter instance, the event’s name and the number of attached listeners, respectively. Its `name` property is set to `'MaxListenersExceededWarning'`.
#### Since
[Section titled “Since”](#since-2)
v0.11.2
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`EventEmitter.defaultMaxListeners`
***
### errorMonitor
[Section titled “errorMonitor”](#errormonitor)
> `readonly` `static` **errorMonitor**: *typeof* [`errorMonitor`](/api/classes/memorystore/#errormonitor)
Defined in: node\_modules/@types/node/events.d.ts:444
This symbol shall be used to install a listener for only monitoring `'error'` events. Listeners installed using this symbol are called before the regular `'error'` listeners are called.
Installing a listener using this symbol does not change the behavior once an `'error'` event is emitted. Therefore, the process will still crash if no regular `'error'` listener is installed.
#### Since
[Section titled “Since”](#since-3)
v13.6.0, v12.17.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`EventEmitter.errorMonitor`
## Methods
[Section titled “Methods”](#methods)
### \[captureRejectionSymbol]\()?
[Section titled “\[captureRejectionSymbol\]()?”](#capturerejectionsymbol-1)
> `optional` **\[captureRejectionSymbol]**<`K`>(`error`, `event`, …`args`): `void`
Defined in: node\_modules/@types/node/events.d.ts:136
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters)
##### K
[Section titled “K”](#k)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### error
[Section titled “error”](#error)
`Error`
##### event
[Section titled “event”](#event)
`string` | `symbol`
##### args
[Section titled “args”](#args)
…`AnyRest`
#### Returns
[Section titled “Returns”](#returns-1)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of)
[`Store`](/api/interfaces/store/).[`[captureRejectionSymbol]`](/api/interfaces/store/#capturerejectionsymbol)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`EventEmitter.[captureRejectionSymbol]`
***
### addListener()
[Section titled “addListener()”](#addlistener)
> **addListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:596
Alias for `emitter.on(eventName, listener)`.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
##### K
[Section titled “K”](#k-1)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### eventName
[Section titled “eventName”](#eventname)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-2)
`this`
#### Since
[Section titled “Since”](#since-4)
v0.1.26
#### Implementation of
[Section titled “Implementation of”](#implementation-of-1)
[`Store`](/api/interfaces/store/).[`addListener`](/api/interfaces/store/#addlistener)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`EventEmitter.addListener`
***
### all()
[Section titled “all()”](#all)
> **all**(`cb`): `void`
Defined in: [src/plugins/middleware/session.ts:225](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L225)
Retrieves all sessions.
#### Parameters
[Section titled “Parameters”](#parameters-3)
##### cb
[Section titled “cb”](#cb)
(`err`, `obj?`) => `void`
#### Returns
[Section titled “Returns”](#returns-3)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-2)
[`Store`](/api/interfaces/store/).[`all`](/api/interfaces/store/#all)
***
### clear()
[Section titled “clear()”](#clear)
> **clear**(`cb?`): `void`
Defined in: [src/plugins/middleware/session.ts:237](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L237)
Clears all sessions.
#### Parameters
[Section titled “Parameters”](#parameters-4)
##### cb?
[Section titled “cb?”](#cb-1)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-4)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-3)
[`Store`](/api/interfaces/store/).[`clear`](/api/interfaces/store/#clear)
***
### destroy()
[Section titled “destroy()”](#destroy)
> **destroy**(`sid`, `cb?`): `void`
Defined in: [src/plugins/middleware/session.ts:210](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L210)
Destroys a session.
#### Parameters
[Section titled “Parameters”](#parameters-5)
##### sid
[Section titled “sid”](#sid)
`string`
##### cb?
[Section titled “cb?”](#cb-2)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-5)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-4)
[`Store`](/api/interfaces/store/).[`destroy`](/api/interfaces/store/#destroy)
***
### emit()
[Section titled “emit()”](#emit)
> **emit**<`K`>(`eventName`, …`args`): `boolean`
Defined in: node\_modules/@types/node/events.d.ts:858
Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments to each.
Returns `true` if the event had listeners, `false` otherwise.
```js
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
##### K
[Section titled “K”](#k-2)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-6)
##### eventName
[Section titled “eventName”](#eventname-1)
`string` | `symbol`
##### args
[Section titled “args”](#args-1)
…`AnyRest`
#### Returns
[Section titled “Returns”](#returns-6)
`boolean`
#### Since
[Section titled “Since”](#since-5)
v0.1.26
#### Implementation of
[Section titled “Implementation of”](#implementation-of-5)
[`Store`](/api/interfaces/store/).[`emit`](/api/interfaces/store/#emit)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`EventEmitter.emit`
***
### eventNames()
[Section titled “eventNames()”](#eventnames)
> **eventNames**(): (`string` | `symbol`)\[]
Defined in: node\_modules/@types/node/events.d.ts:921
Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or `Symbol`s.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
```
#### Returns
[Section titled “Returns”](#returns-7)
(`string` | `symbol`)\[]
#### Since
[Section titled “Since”](#since-6)
v6.0.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-6)
[`Store`](/api/interfaces/store/).[`eventNames`](/api/interfaces/store/#eventnames)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`EventEmitter.eventNames`
***
### get()
[Section titled “get()”](#get)
> **get**(`sid`, `cb`): `void`
Defined in: [src/plugins/middleware/session.ts:190](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L190)
Retrieves a session by ID.
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### sid
[Section titled “sid”](#sid-1)
`string`
##### cb
[Section titled “cb”](#cb-3)
(`err`, `session?`) => `void`
#### Returns
[Section titled “Returns”](#returns-8)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-7)
[`Store`](/api/interfaces/store/).[`get`](/api/interfaces/store/#get)
***
### getMaxListeners()
[Section titled “getMaxListeners()”](#getmaxlisteners)
> **getMaxListeners**(): `number`
Defined in: node\_modules/@types/node/events.d.ts:773
Returns the current max listener value for the `EventEmitter` which is either set by `emitter.setMaxListeners(n)` or defaults to [EventEmitter.defaultMaxListeners](/api/classes/memorystore/#defaultmaxlisteners).
#### Returns
[Section titled “Returns”](#returns-9)
`number`
#### Since
[Section titled “Since”](#since-7)
v1.0.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-8)
[`Store`](/api/interfaces/store/).[`getMaxListeners`](/api/interfaces/store/#getmaxlisteners)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`EventEmitter.getMaxListeners`
***
### listenerCount()
[Section titled “listenerCount()”](#listenercount)
> **listenerCount**<`K`>(`eventName`, `listener?`): `number`
Defined in: node\_modules/@types/node/events.d.ts:867
Returns the number of listeners listening for the event named `eventName`. If `listener` is provided, it will return how many times the listener is found in the list of the listeners of the event.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-3)
##### K
[Section titled “K”](#k-3)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-8)
##### eventName
[Section titled “eventName”](#eventname-2)
The name of the event being listened for
`string` | `symbol`
##### listener?
[Section titled “listener?”](#listener-1)
`Function`
The event handler function
#### Returns
[Section titled “Returns”](#returns-10)
`number`
#### Since
[Section titled “Since”](#since-8)
v3.2.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-9)
[`Store`](/api/interfaces/store/).[`listenerCount`](/api/interfaces/store/#listenercount)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-10)
`EventEmitter.listenerCount`
***
### listeners()
[Section titled “listeners()”](#listeners)
> **listeners**<`K`>(`eventName`): `Function`\[]
Defined in: node\_modules/@types/node/events.d.ts:786
Returns a copy of the array of listeners for the event named `eventName`.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-4)
##### K
[Section titled “K”](#k-4)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-9)
##### eventName
[Section titled “eventName”](#eventname-3)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-11)
`Function`\[]
#### Since
[Section titled “Since”](#since-9)
v0.1.26
#### Implementation of
[Section titled “Implementation of”](#implementation-of-10)
[`Store`](/api/interfaces/store/).[`listeners`](/api/interfaces/store/#listeners)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-11)
`EventEmitter.listeners`
***
### off()
[Section titled “off()”](#off)
> **off**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:746
Alias for `emitter.removeListener()`.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-5)
##### K
[Section titled “K”](#k-5)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-10)
##### eventName
[Section titled “eventName”](#eventname-4)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-2)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-12)
`this`
#### Since
[Section titled “Since”](#since-10)
v10.0.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-11)
[`Store`](/api/interfaces/store/).[`off`](/api/interfaces/store/#off)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-12)
`EventEmitter.off`
***
### on()
[Section titled “on()”](#on)
> **on**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:628
Adds the `listener` function to the end of the listeners array for the event named `eventName`. No checks are made to see if the `listener` has already been added. Multiple calls passing the same combination of `eventName` and `listener` will result in the `listener` being added, and called, multiple times.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-6)
##### K
[Section titled “K”](#k-6)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-11)
##### eventName
[Section titled “eventName”](#eventname-5)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-3)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-13)
`this`
#### Since
[Section titled “Since”](#since-11)
v0.1.101
#### Implementation of
[Section titled “Implementation of”](#implementation-of-12)
[`Store`](/api/interfaces/store/).[`on`](/api/interfaces/store/#on)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-13)
`EventEmitter.on`
***
### once()
[Section titled “once()”](#once)
> **once**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:658
Adds a **one-time** `listener` function for the event named `eventName`. The next time `eventName` is triggered, this listener is removed and then invoked.
```js
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-7)
##### K
[Section titled “K”](#k-7)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-12)
##### eventName
[Section titled “eventName”](#eventname-6)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-4)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-14)
`this`
#### Since
[Section titled “Since”](#since-12)
v0.3.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-13)
[`Store`](/api/interfaces/store/).[`once`](/api/interfaces/store/#once)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-14)
`EventEmitter.once`
***
### prependListener()
[Section titled “prependListener()”](#prependlistener)
> **prependListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:885
Adds the `listener` function to the *beginning* of the listeners array for the event named `eventName`. No checks are made to see if the `listener` has already been added. Multiple calls passing the same combination of `eventName` and `listener` will result in the `listener` being added, and called, multiple times.
```js
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-8)
##### K
[Section titled “K”](#k-8)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-13)
##### eventName
[Section titled “eventName”](#eventname-7)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-5)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-15)
`this`
#### Since
[Section titled “Since”](#since-13)
v6.0.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-14)
[`Store`](/api/interfaces/store/).[`prependListener`](/api/interfaces/store/#prependlistener)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-15)
`EventEmitter.prependListener`
***
### prependOnceListener()
[Section titled “prependOnceListener()”](#prependoncelistener)
> **prependOnceListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:901
Adds a **one-time**`listener` function for the event named `eventName` to the *beginning* of the listeners array. The next time `eventName` is triggered, this listener is removed, and then invoked.
```js
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-9)
##### K
[Section titled “K”](#k-9)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-14)
##### eventName
[Section titled “eventName”](#eventname-8)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-6)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-16)
`this`
#### Since
[Section titled “Since”](#since-14)
v6.0.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-15)
[`Store`](/api/interfaces/store/).[`prependOnceListener`](/api/interfaces/store/#prependoncelistener)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-16)
`EventEmitter.prependOnceListener`
***
### rawListeners()
[Section titled “rawListeners()”](#rawlisteners)
> **rawListeners**<`K`>(`eventName`): `Function`\[]
Defined in: node\_modules/@types/node/events.d.ts:817
Returns a copy of the array of listeners for the event named `eventName`, including any wrappers (such as those created by `.once()`).
```js
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-10)
##### K
[Section titled “K”](#k-10)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-15)
##### eventName
[Section titled “eventName”](#eventname-9)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-17)
`Function`\[]
#### Since
[Section titled “Since”](#since-15)
v9.4.0
#### Implementation of
[Section titled “Implementation of”](#implementation-of-16)
[`Store`](/api/interfaces/store/).[`rawListeners`](/api/interfaces/store/#rawlisteners)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-17)
`EventEmitter.rawListeners`
***
### removeAllListeners()
[Section titled “removeAllListeners()”](#removealllisteners)
> **removeAllListeners**(`eventName?`): `this`
Defined in: node\_modules/@types/node/events.d.ts:757
Removes all listeners, or those of the specified `eventName`.
It is bad practice to remove listeners added elsewhere in the code, particularly when the `EventEmitter` instance was created by some other component or module (e.g. sockets or file streams).
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Parameters
[Section titled “Parameters”](#parameters-16)
##### eventName?
[Section titled “eventName?”](#eventname-10)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-18)
`this`
#### Since
[Section titled “Since”](#since-16)
v0.1.26
#### Implementation of
[Section titled “Implementation of”](#implementation-of-17)
[`Store`](/api/interfaces/store/).[`removeAllListeners`](/api/interfaces/store/#removealllisteners)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-18)
`EventEmitter.removeAllListeners`
***
### removeListener()
[Section titled “removeListener()”](#removelistener)
> **removeListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:741
Removes the specified `listener` from the listener array for the event named `eventName`.
```js
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
```
`removeListener()` will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the listener array for the specified `eventName`, then `removeListener()` must be called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls *after* emitting and *before* the last listener finishes execution will not remove them from`emit()` in progress. Subsequent events behave as expected.
```js
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
```
Because listeners are managed using an internal array, calling this will change the position indices of any listener registered *after* the listener being removed. This will not impact the order in which listeners are called, but it means that any copies of the listener array as returned by the `emitter.listeners()` method will need to be recreated.
When a single function has been added as a handler multiple times for a single event (as in the example below), `removeListener()` will remove the most recently added instance. In the example the `once('ping')` listener is removed:
```js
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-11)
##### K
[Section titled “K”](#k-11)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-17)
##### eventName
[Section titled “eventName”](#eventname-11)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-7)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-19)
`this`
#### Since
[Section titled “Since”](#since-17)
v0.1.26
#### Implementation of
[Section titled “Implementation of”](#implementation-of-18)
[`Store`](/api/interfaces/store/).[`removeListener`](/api/interfaces/store/#removelistener)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-19)
`EventEmitter.removeListener`
***
### set()
[Section titled “set()”](#set)
> **set**(`sid`, `sess`, `cb?`): `void`
Defined in: [src/plugins/middleware/session.ts:205](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L205)
Stores a session.
#### Parameters
[Section titled “Parameters”](#parameters-18)
##### sid
[Section titled “sid”](#sid-2)
`string`
##### sess
[Section titled “sess”](#sess)
[`SessionData`](/api/interfaces/sessiondata/)
##### cb?
[Section titled “cb?”](#cb-4)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-20)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-19)
[`Store`](/api/interfaces/store/).[`set`](/api/interfaces/store/#set)
***
### setMaxListeners()
[Section titled “setMaxListeners()”](#setmaxlisteners)
> **setMaxListeners**(`n`): `this`
Defined in: node\_modules/@types/node/events.d.ts:767
By default `EventEmitter`s will print a warning if more than `10` listeners are added for a particular event. This is a useful default that helps finding memory leaks. The `emitter.setMaxListeners()` method allows the limit to be modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners.
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Parameters
[Section titled “Parameters”](#parameters-19)
##### n
[Section titled “n”](#n)
`number`
#### Returns
[Section titled “Returns”](#returns-21)
`this`
#### Since
[Section titled “Since”](#since-18)
v0.3.5
#### Implementation of
[Section titled “Implementation of”](#implementation-of-20)
[`Store`](/api/interfaces/store/).[`setMaxListeners`](/api/interfaces/store/#setmaxlisteners)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-20)
`EventEmitter.setMaxListeners`
***
### touch()
[Section titled “touch()”](#touch)
> **touch**(`sid`, `sess`, `cb?`): `void`
Defined in: [src/plugins/middleware/session.ts:215](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L215)
Touches a session.
#### Parameters
[Section titled “Parameters”](#parameters-20)
##### sid
[Section titled “sid”](#sid-3)
`string`
##### sess
[Section titled “sess”](#sess-1)
[`SessionData`](/api/interfaces/sessiondata/)
##### cb?
[Section titled “cb?”](#cb-5)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-22)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of-21)
[`Store`](/api/interfaces/store/).[`touch`](/api/interfaces/store/#touch)
***
### addAbortListener()
[Section titled “addAbortListener()”](#addabortlistener)
> `static` **addAbortListener**(`signal`, `resource`): `Disposable`
Defined in: node\_modules/@types/node/events.d.ts:436
Listens once to the `abort` event on the provided `signal`.
Listening to the `abort` event on abort signals is unsafe and may lead to resource leaks since another third party with the signal can call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change this since it would violate the web standard. Additionally, the original API makes it easy to forget to remove listeners.
This API allows safely using `AbortSignal`s in Node.js APIs by solving these two issues by listening to the event such that `stopImmediatePropagation` does not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
```js
import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
```
#### Parameters
[Section titled “Parameters”](#parameters-21)
##### signal
[Section titled “signal”](#signal)
`AbortSignal`
##### resource
[Section titled “resource”](#resource)
(`event`) => `void`
#### Returns
[Section titled “Returns”](#returns-23)
`Disposable`
Disposable that removes the `abort` listener.
#### Since
[Section titled “Since”](#since-19)
v20.5.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-21)
`EventEmitter.addAbortListener`
***
### getEventListeners()
[Section titled “getEventListeners()”](#geteventlisteners)
> `static` **getEventListeners**(`emitter`, `name`): `Function`\[]
Defined in: node\_modules/@types/node/events.d.ts:358
Returns a copy of the array of listeners for the event named `eventName`.
For `EventEmitter`s this behaves exactly the same as calling `.listeners` on the emitter.
For `EventTarget`s this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.
```js
import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
```
#### Parameters
[Section titled “Parameters”](#parameters-22)
##### emitter
[Section titled “emitter”](#emitter)
`EventTarget` | `EventEmitter`<`DefaultEventMap`>
##### name
[Section titled “name”](#name)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-24)
`Function`\[]
#### Since
[Section titled “Since”](#since-20)
v15.2.0, v14.17.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-22)
`EventEmitter.getEventListeners`
***
### getMaxListeners()
[Section titled “getMaxListeners()”](#getmaxlisteners-1)
> `static` **getMaxListeners**(`emitter`): `number`
Defined in: node\_modules/@types/node/events.d.ts:387
Returns the currently set max amount of listeners.
For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on the emitter.
For `EventTarget`s this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.
```js
import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
```
#### Parameters
[Section titled “Parameters”](#parameters-23)
##### emitter
[Section titled “emitter”](#emitter-1)
`EventTarget` | `EventEmitter`<`DefaultEventMap`>
#### Returns
[Section titled “Returns”](#returns-25)
`number`
#### Since
[Section titled “Since”](#since-21)
v19.9.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-23)
`EventEmitter.getMaxListeners`
***
### ~~listenerCount()~~
[Section titled “listenerCount()”](#listenercount-1)
> `static` **listenerCount**(`emitter`, `eventName`): `number`
Defined in: node\_modules/@types/node/events.d.ts:330
A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`.
```js
import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
```
Deprecated
Since v3.2.0 - Use `listenerCount` instead.
#### Parameters
[Section titled “Parameters”](#parameters-24)
##### emitter
[Section titled “emitter”](#emitter-2)
`EventEmitter`
The emitter to query
##### eventName
[Section titled “eventName”](#eventname-12)
The event name
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-26)
`number`
#### Since
[Section titled “Since”](#since-22)
v0.9.12
#### Inherited from
[Section titled “Inherited from”](#inherited-from-24)
`EventEmitter.listenerCount`
***
### on()
[Section titled “on()”](#on-1)
#### Call Signature
[Section titled “Call Signature”](#call-signature)
> `static` **on**(`emitter`, `eventName`, `options?`): `AsyncIterator`<`any`\[]>
Defined in: node\_modules/@types/node/events.d.ts:303
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
```
Returns an `AsyncIterator` that iterates `eventName` events. It will throw if the `EventEmitter` emits `'error'`. It removes all listeners when exiting the loop. The `value` returned by each iteration is an array composed of the emitted event arguments.
An `AbortSignal` can be used to cancel waiting on events:
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
```
Use the `close` option to specify an array of event names that will end the iteration:
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
```
##### Parameters
[Section titled “Parameters”](#parameters-25)
###### emitter
[Section titled “emitter”](#emitter-3)
`EventEmitter`
###### eventName
[Section titled “eventName”](#eventname-13)
`string` | `symbol`
###### options?
[Section titled “options?”](#options-1)
`StaticEventEmitterIteratorOptions`
##### Returns
[Section titled “Returns”](#returns-27)
`AsyncIterator`<`any`\[]>
An `AsyncIterator` that iterates `eventName` events emitted by the `emitter`
##### Since
[Section titled “Since”](#since-23)
v13.6.0, v12.16.0
##### Inherited from
[Section titled “Inherited from”](#inherited-from-25)
`EventEmitter.on`
#### Call Signature
[Section titled “Call Signature”](#call-signature-1)
> `static` **on**(`emitter`, `eventName`, `options?`): `AsyncIterator`<`any`\[]>
Defined in: node\_modules/@types/node/events.d.ts:308
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
```
Returns an `AsyncIterator` that iterates `eventName` events. It will throw if the `EventEmitter` emits `'error'`. It removes all listeners when exiting the loop. The `value` returned by each iteration is an array composed of the emitted event arguments.
An `AbortSignal` can be used to cancel waiting on events:
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
```
Use the `close` option to specify an array of event names that will end the iteration:
```js
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
```
##### Parameters
[Section titled “Parameters”](#parameters-26)
###### emitter
[Section titled “emitter”](#emitter-4)
`EventTarget`
###### eventName
[Section titled “eventName”](#eventname-14)
`string`
###### options?
[Section titled “options?”](#options-2)
`StaticEventEmitterIteratorOptions`
##### Returns
[Section titled “Returns”](#returns-28)
`AsyncIterator`<`any`\[]>
An `AsyncIterator` that iterates `eventName` events emitted by the `emitter`
##### Since
[Section titled “Since”](#since-24)
v13.6.0, v12.16.0
##### Inherited from
[Section titled “Inherited from”](#inherited-from-26)
`EventEmitter.on`
***
### once()
[Section titled “once()”](#once-1)
#### Call Signature
[Section titled “Call Signature”](#call-signature-2)
> `static` **once**(`emitter`, `eventName`, `options?`): `Promise`<`any`\[]>
Defined in: node\_modules/@types/node/events.d.ts:217
Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given event or that is rejected if the `EventEmitter` emits `'error'` while waiting. The `Promise` will resolve with an array of all the arguments emitted to the given event.
This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event semantics and does not listen to the `'error'` event.
```js
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
```
The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the ‘`error'` event itself, then it is treated as any other kind of event without special handling:
```js
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
```
An `AbortSignal` can be used to cancel waiting for the event:
```js
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
```
##### Parameters
[Section titled “Parameters”](#parameters-27)
###### emitter
[Section titled “emitter”](#emitter-5)
`EventEmitter`
###### eventName
[Section titled “eventName”](#eventname-15)
`string` | `symbol`
###### options?
[Section titled “options?”](#options-3)
`StaticEventEmitterOptions`
##### Returns
[Section titled “Returns”](#returns-29)
`Promise`<`any`\[]>
##### Since
[Section titled “Since”](#since-25)
v11.13.0, v10.16.0
##### Inherited from
[Section titled “Inherited from”](#inherited-from-27)
`EventEmitter.once`
#### Call Signature
[Section titled “Call Signature”](#call-signature-3)
> `static` **once**(`emitter`, `eventName`, `options?`): `Promise`<`any`\[]>
Defined in: node\_modules/@types/node/events.d.ts:222
Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given event or that is rejected if the `EventEmitter` emits `'error'` while waiting. The `Promise` will resolve with an array of all the arguments emitted to the given event.
This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event semantics and does not listen to the `'error'` event.
```js
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
```
The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the ‘`error'` event itself, then it is treated as any other kind of event without special handling:
```js
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
```
An `AbortSignal` can be used to cancel waiting for the event:
```js
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
```
##### Parameters
[Section titled “Parameters”](#parameters-28)
###### emitter
[Section titled “emitter”](#emitter-6)
`EventTarget`
###### eventName
[Section titled “eventName”](#eventname-16)
`string`
###### options?
[Section titled “options?”](#options-4)
`StaticEventEmitterOptions`
##### Returns
[Section titled “Returns”](#returns-30)
`Promise`<`any`\[]>
##### Since
[Section titled “Since”](#since-26)
v11.13.0, v10.16.0
##### Inherited from
[Section titled “Inherited from”](#inherited-from-28)
`EventEmitter.once`
***
### setMaxListeners()
[Section titled “setMaxListeners()”](#setmaxlisteners-1)
> `static` **setMaxListeners**(`n?`, …`eventTargets?`): `void`
Defined in: node\_modules/@types/node/events.d.ts:402
```js
import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
```
#### Parameters
[Section titled “Parameters”](#parameters-29)
##### n?
[Section titled “n?”](#n-1)
`number`
A non-negative number. The maximum number of listeners per `EventTarget` event.
##### eventTargets?
[Section titled “eventTargets?”](#eventtargets)
…(`EventTarget` | `EventEmitter`<`DefaultEventMap`>)\[]
Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} objects.
#### Returns
[Section titled “Returns”](#returns-31)
`void`
#### Since
[Section titled “Since”](#since-27)
v15.4.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-29)
`EventEmitter.setMaxListeners`
# ScalarPlugin
Defined in: [src/plugins/application/scalar.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L37)
Scalar plugin. This plugin provides an API reference interface for your API.
## Param
[Section titled “Param”](#param)
Scalar plugin options
## Extends
[Section titled “Extends”](#extends)
* `ShokupanRouter`<`any`>
## Implements
[Section titled “Implements”](#implements)
* [`ShokupanPlugin`](/api/interfaces/shokupanplugin/)
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new ScalarPlugin**(`pluginOptions`): `ScalarPlugin`
Defined in: [src/plugins/application/scalar.ts:38](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L38)
#### Parameters
[Section titled “Parameters”](#parameters)
##### pluginOptions
[Section titled “pluginOptions”](#pluginoptions)
[`ScalarPluginOptions`](/api/type-aliases/scalarpluginoptions/) = `{}`
#### Returns
[Section titled “Returns”](#returns)
`ScalarPlugin`
#### Overrides
[Section titled “Overrides”](#overrides)
`ShokupanRouter.constructor`
## Properties
[Section titled “Properties”](#properties)
### \[$childControllers]
[Section titled “\[$childControllers\]”](#childcontrollers)
> **\[$childControllers]**: [`ShokupanController`](/api/type-aliases/shokupancontroller/)\[] = `[]`
Defined in: [src/router.ts:89](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L89)
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`ShokupanRouter.[$childControllers]`
***
### \[$childRouters]
[Section titled “\[$childRouters\]”](#childrouters)
> **\[$childRouters]**: `ShokupanRouter`<`any`>\[] = `[]`
Defined in: [src/router.ts:88](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L88)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`ShokupanRouter.[$childRouters]`
***
### \[$mountPath]
[Section titled “\[$mountPath\]”](#mountpath)
> **\[$mountPath]**: `string` = `"/"`
Defined in: [src/router.ts:85](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L85)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`ShokupanRouter.[$mountPath]`
***
### \[$routes]
[Section titled “\[$routes\]”](#routes)
> **\[$routes]**: [`ShokupanRoute`](/api/type-aliases/shokupanroute/)\[] = `[]`
Defined in: [src/router.ts:103](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L103)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`ShokupanRouter.[$routes]`
***
### config?
[Section titled “config?”](#config)
> `readonly` `optional` **config**: `object`
Defined in: [src/router.ts:183](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L183)
#### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
##### Default
[Section titled “Default”](#default)
```ts
false
```
#### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests.
#### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
##### Default
[Section titled “Default”](#default-1)
```ts
false
```
#### group?
[Section titled “group?”](#group)
> `optional` **group**: `string`
#### hooks?
[Section titled “hooks?”](#hooks)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Hooks for this route/router.
#### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
#### openapi?
[Section titled “openapi?”](#openapi)
> `optional` **openapi**: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `consumes?`: `string`\[]; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; `description?`: `string`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; } | {\[`key`: `string`]: `any`; `$ref?`: `string`; `allowEmptyValue?`: `boolean`; `collectionFormat?`: `string`; `default?`: `any`; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `in?`: `ParameterLocation`; `items?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { type?: string; format?: string; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | …; collectionFormat?: string; default?: any; … 12 more …; $ref?: string; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `name?`: `string`; `pattern?`: `string`; `required?`: `boolean`; `type?`: `string`; `uniqueItems?`: `boolean`; })\[]; `produces?`: `string`\[]; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; `default?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; }; `schemes?`: `string`\[]; `security?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `object`; }; }; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `headers?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `security?`: `object`\[]; `servers?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `parameters?`: ({ `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `servers?`: `object`\[]; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; }; }; }; `parameters?`: ({ `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `servers?`: `object`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `additionalOperations?`: {\[`key`: `string`]: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `parameters?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `query?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; }; }; `parameters?`: ({\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `dataValue?`: `any`; `description?`: `string`; `externalValue?`: `string`; `serializedValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: (`"array"` | `NonArraySchemaObjectType`)\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `dataValue?`: …; `description?`: …; `externalValue?`: …; `serializedValue?`: …; `summary?`: …; `value?`: …; }; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: `string`]: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; }; `explode?`: `boolean`; `headers?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; }; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: …]: …; }; `explode?`: `boolean`; `headers?`: {\[`key`: …]: …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: …\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: … | …; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `name?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; `summary?`: `string`; }; }; `servers?`: `object`\[]; }
#### renderer?
[Section titled “renderer?”](#renderer)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
Custom renderer for this route.
#### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout)
> `optional` **requestTimeout**: `number`
Timeout for this specific route (milliseconds).
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`ShokupanRouter.config`
***
### metadata?
[Section titled “metadata?”](#metadata)
> `optional` **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
Defined in: [src/router.ts:105](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L105)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`ShokupanRouter.metadata`
***
### middleware
[Section titled “middleware”](#middleware)
> **middleware**: [`Middleware`](/api/type-aliases/middleware/)\[] = `[]`
Defined in: [src/router.ts:94](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L94)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`ShokupanRouter.middleware`
***
### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-1)
> `optional` **requestTimeout**: `number`
Defined in: [src/router.ts:792](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L792)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`ShokupanRouter.requestTimeout`
## Accessors
[Section titled “Accessors”](#accessors)
### root
[Section titled “root”](#root)
#### Get Signature
[Section titled “Get Signature”](#get-signature)
> **get** **root**(): [`Shokupan`](/api/classes/shokupan/)<`any`>
Defined in: [src/router.ts:99](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L99)
##### Returns
[Section titled “Returns”](#returns-1)
[`Shokupan`](/api/classes/shokupan/)<`any`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`ShokupanRouter.root`
***
### rootConfig
[Section titled “rootConfig”](#rootconfig)
#### Get Signature
[Section titled “Get Signature”](#get-signature-1)
> **get** **rootConfig**(): `object`
Defined in: [src/router.ts:96](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L96)
##### Returns
[Section titled “Returns”](#returns-2)
###### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback-1)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
###### Default
[Section titled “Default”](#default-2)
```ts
false
```
###### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel-1)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests (429).
###### Default
[Section titled “Default”](#default-3)
```ts
60
```
###### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly-1)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
###### Default
[Section titled “Default”](#default-4)
```ts
false
```
###### development?
[Section titled “development?”](#development)
> `optional` **development**: `boolean`
Whether to run in development mode.
###### Default
[Section titled “Default”](#default-5)
```ts
process.env.NODE_ENV !== "production"
```
###### enableAsyncLocalStorage?
[Section titled “enableAsyncLocalStorage?”](#enableasynclocalstorage)
> `optional` **enableAsyncLocalStorage**: `boolean`
Whether to enable AsyncLocalStorage. (Request local storage)
###### Default
[Section titled “Default”](#default-6)
```ts
false
```
###### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking)
> `optional` **enableMiddlewareTracking**: `boolean`
Whether to enable middleware and handler tracking. When enabled, `ctx.handlerStack` will be populated with the handlers the request has passed through. Also, `ctx.state` will be a Proxy that tracks changes made by each handler.
###### Default
[Section titled “Default”](#default-7)
```ts
false
```
###### enableOpenApiGen?
[Section titled “enableOpenApiGen?”](#enableopenapigen)
> `optional` **enableOpenApiGen**: `boolean`
Whether to enable OpenAPI generation.
###### Default
[Section titled “Default”](#default-8)
```ts
true
```
###### enableTracing?
[Section titled “enableTracing?”](#enabletracing)
> `optional` **enableTracing**: `boolean`
Whether to enable OpenTelemetry tracing.
###### Default
[Section titled “Default”](#default-9)
```ts
false
```
###### hooks?
[Section titled “hooks?”](#hooks-1)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Lifecycle hooks.
###### hostname?
[Section titled “hostname?”](#hostname)
> `optional` **hostname**: `string`
The hostname to be used for the server.
###### Default
[Section titled “Default”](#default-10)
```ts
"localhost"
```
###### httpLogger()?
[Section titled “httpLogger()?”](#httplogger)
> `optional` **httpLogger**: (`ctx`) => `void`
HTTP logger function.
###### Parameters
[Section titled “Parameters”](#parameters-1)
###### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`Record`<`string`, `any`>>
###### Returns
[Section titled “Returns”](#returns-3)
`void`
###### jsonParser?
[Section titled “jsonParser?”](#jsonparser)
> `optional` **jsonParser**: `"native"` | `"parse-json"` | `"secure-json-parse"`
JSON parser to use for parsing request bodies.
Options:
* `'native'`: Use the built-in JSON.parse (fastest, default)
* `'parse-json'`: Use the parse-json library for better error messages with minimal performance overhead (\~5% slower than native)
* `'secure-json-parse'`: Use secure-json-parse for protection against prototype pollution (20-30% slower than native)
Performance implications based on benchmarks:
* `native`: Fastest option, excellent for production
* `parse-json`: Nearly identical performance to native with better error messages, good for development
* `secure-json-parse`: Provides security at the cost of performance, use only for untrusted input
###### Default
[Section titled “Default”](#default-11)
```ts
'native'
```
###### logger?
[Section titled “logger?”](#logger)
> `optional` **logger**: `object`
Logger object.
###### logger.debug()?
[Section titled “logger.debug()?”](#loggerdebug)
> `optional` **debug**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-2)
###### msg
[Section titled “msg”](#msg)
`string`
###### props
[Section titled “props”](#props)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-4)
`void`
###### logger.error()?
[Section titled “logger.error()?”](#loggererror)
> `optional` **error**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-3)
###### msg
[Section titled “msg”](#msg-1)
`string`
###### props
[Section titled “props”](#props-1)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-5)
`void`
###### logger.fatal()?
[Section titled “logger.fatal()?”](#loggerfatal)
> `optional` **fatal**: (`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### Parameters
[Section titled “Parameters”](#parameters-4)
###### msg
[Section titled “msg”](#msg-2)
`string`
###### props
[Section titled “props”](#props-2)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-6)
`void`
###### logger.info()?
[Section titled “logger.info()?”](#loggerinfo)
> `optional` **info**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-5)
###### msg
[Section titled “msg”](#msg-3)
`string`
###### props
[Section titled “props”](#props-3)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-7)
`void`
###### logger.verbose?
[Section titled “logger.verbose?”](#loggerverbose)
> `optional` **verbose**: `boolean`
###### logger.warning()?
[Section titled “logger.warning()?”](#loggerwarning)
> `optional` **warning**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-6)
###### msg
[Section titled “msg”](#msg-4)
`string`
###### props
[Section titled “props”](#props-4)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-8)
`void`
###### middlewareTrackingMaxCapacity?
[Section titled “middlewareTrackingMaxCapacity?”](#middlewaretrackingmaxcapacity)
> `optional` **middlewareTrackingMaxCapacity**: `number`
Maximum number of middleware executions to store in the datastore. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-12)
```ts
10000
```
###### middlewareTrackingTTL?
[Section titled “middlewareTrackingTTL?”](#middlewaretrackingttl)
> `optional` **middlewareTrackingTTL**: `number`
Time-to-live for middleware tracking entries in milliseconds. Entries older than this will be cleaned up. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-13)
```ts
86400000 (1 day)
```
###### port?
[Section titled “port?”](#port)
> `optional` **port**: `number`
The port to be used for the server.
###### Default
[Section titled “Default”](#default-14)
```ts
3000
```
###### readTimeout?
[Section titled “readTimeout?”](#readtimeout)
> `optional` **readTimeout**: `number`
Timeout for reading the request body (milliseconds). Maps to Bun’s `idleTimeout`.
###### Default
[Section titled “Default”](#default-15)
```ts
30000
```
###### renderer?
[Section titled “renderer?”](#renderer-1)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX Rendering function.
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-2)
> `optional` **requestTimeout**: `number`
Timeout for processing the request (milliseconds). Maps to `server.timeout(req, seconds)`.
###### Default
[Section titled “Default”](#default-16)
```ts
0 (disabled)
```
###### reusePort?
[Section titled “reusePort?”](#reuseport)
> `optional` **reusePort**: `boolean`
Whether to reuse the port.
###### Default
[Section titled “Default”](#default-17)
```ts
false
```
###### serverFactory?
[Section titled “serverFactory?”](#serverfactory)
> `optional` **serverFactory**: [`ServerFactory`](/api/interfaces/serverfactory/)
Factory function to create the server instance. Defaults to Bun.serve.
###### validateStatusCodes?
[Section titled “validateStatusCodes?”](#validatestatuscodes)
> `optional` **validateStatusCodes**: `boolean`
Whether to validate response status codes.
###### Default
[Section titled “Default”](#default-18)
```ts
true
```
###### writeTimeout?
[Section titled “writeTimeout?”](#writetimeout)
> `optional` **writeTimeout**: `number`
Timeout for writing the response (milliseconds). Not currently supported by Bun.serve natively.
Experimental
This API should not be used in production and may be trimmed from a public release.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`ShokupanRouter.rootConfig`
## Methods
[Section titled “Methods”](#methods)
### add()
[Section titled “add()”](#add)
> **add**(`arg`): `ScalarPlugin`
Defined in: [src/router.ts:808](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L808)
Adds a route to the router.
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### arg
[Section titled “arg”](#arg)
Route configuration object
###### controller?
[Section titled “controller?”](#controller)
`any`
Controller for the route
###### group?
[Section titled “group?”](#group-1)
`string`
Group for the route
###### handler
[Section titled “handler”](#handler)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Route handler function
###### method
[Section titled “method”](#method)
[`Method`](/api/type-aliases/method/)
HTTP method
###### path
[Section titled “path”](#path)
`string`
URL path
###### regex?
[Section titled “regex?”](#regex)
`RegExp`
Custom regex for path matching
###### renderer?
[Section titled “renderer?”](#renderer-2)
[`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX renderer for the route
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-3)
`number`
Timeout for this route in milliseconds
###### spec?
[Section titled “spec?”](#spec)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
#### Returns
[Section titled “Returns”](#returns-9)
`ScalarPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-10)
`ShokupanRouter.add`
***
### delete()
[Section titled “delete()”](#delete)
#### Call Signature
[Section titled “Call Signature”](#call-signature)
> **delete**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1079](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1079)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters)
###### Path
[Section titled “Path”](#path-1)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-8)
###### path
[Section titled “path”](#path-2)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-10)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-11)
`ShokupanRouter.delete`
#### Call Signature
[Section titled “Call Signature”](#call-signature-1)
> **delete**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1087](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1087)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
###### Path
[Section titled “Path”](#path-3)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-9)
###### path
[Section titled “path”](#path-4)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-1)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-1)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-11)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-12)
`ShokupanRouter.delete`
***
### find()
[Section titled “find()”](#find)
> **find**(`method`, `path`): `object`
Defined in: [src/router.ts:726](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L726)
Find a route matching the given method and path.
#### Parameters
[Section titled “Parameters”](#parameters-10)
##### method
[Section titled “method”](#method-1)
`string`
HTTP method
##### path
[Section titled “path”](#path-5)
`string`
Request path
#### Returns
[Section titled “Returns”](#returns-12)
`object`
Route handler and parameters if found, otherwise null
##### handler
[Section titled “handler”](#handler-1)
> **handler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
##### params
[Section titled “params”](#params)
> **params**: `Record`<`string`, `string`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-13)
`ShokupanRouter.find`
***
### generateApiSpec()
[Section titled “generateApiSpec()”](#generateapispec)
> **generateApiSpec**(`options`): `any`
Defined in: [src/router.ts:1306](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1306)
Generates an OpenAPI 3.1 Document by recursing through the router and its descendants. Now includes runtime analysis of handler functions to infer request/response types.
#### Parameters
[Section titled “Parameters”](#parameters-11)
##### options
[Section titled “options”](#options)
[`OpenAPIOptions`](/api/interfaces/openapioptions/) = `{}`
#### Returns
[Section titled “Returns”](#returns-13)
`any`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-14)
`ShokupanRouter.generateApiSpec`
***
### get()
[Section titled “get()”](#get)
#### Call Signature
[Section titled “Call Signature”](#call-signature-2)
> **get**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1019](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1019)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
###### Path
[Section titled “Path”](#path-6)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-12)
###### path
[Section titled “path”](#path-7)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-2)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-14)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-15)
`ShokupanRouter.get`
#### Call Signature
[Section titled “Call Signature”](#call-signature-3)
> **get**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1027](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1027)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-3)
###### Path
[Section titled “Path”](#path-8)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-13)
###### path
[Section titled “path”](#path-9)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-2)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-3)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-15)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-16)
`ShokupanRouter.get`
***
### getComponentRegistry()
[Section titled “getComponentRegistry()”](#getcomponentregistry)
> **getComponentRegistry**(): `object`
Defined in: [src/router.ts:110](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L110)
#### Returns
[Section titled “Returns”](#returns-16)
`object`
##### controllers
[Section titled “controllers”](#controllers)
> **controllers**: `object`\[]
##### metadata
[Section titled “metadata”](#metadata-1)
> **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
##### middleware
[Section titled “middleware”](#middleware-1)
> **middleware**: `object`\[]
##### routers
[Section titled “routers”](#routers)
> **routers**: `object`\[]
##### routes
[Section titled “routes”](#routes-1)
> **routes**: `object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-17)
`ShokupanRouter.getComponentRegistry`
***
### getRoutes()
[Section titled “getRoutes()”](#getroutes)
> **getRoutes**(): `object`\[]
Defined in: [src/router.ts:229](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L229)
Returns all routes attached to this router and its descendants.
#### Returns
[Section titled “Returns”](#returns-17)
`object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-18)
`ShokupanRouter.getRoutes`
***
### guard()
[Section titled “guard()”](#guard)
#### Call Signature
[Section titled “Call Signature”](#call-signature-4)
> **guard**(`handler`): `void`
Defined in: [src/router.ts:1159](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1159)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-14)
###### handler
[Section titled “handler”](#handler-2)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-18)
`void`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-19)
`ShokupanRouter.guard`
#### Call Signature
[Section titled “Call Signature”](#call-signature-5)
> **guard**(`spec`, `handler`): `any`
Defined in: [src/router.ts:1167](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1167)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-15)
###### spec
[Section titled “spec”](#spec-3)
[`GuardAPISpec`](/api/type-aliases/guardapispec/)
OpenAPI specification for the guard
###### handler
[Section titled “handler”](#handler-3)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-19)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-20)
`ShokupanRouter.guard`
***
### head()
[Section titled “head()”](#head)
#### Call Signature
[Section titled “Call Signature”](#call-signature-6)
> **head**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1139](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1139)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-4)
###### Path
[Section titled “Path”](#path-10)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-16)
###### path
[Section titled “path”](#path-11)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-4)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-20)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-21)
`ShokupanRouter.head`
#### Call Signature
[Section titled “Call Signature”](#call-signature-7)
> **head**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1147](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1147)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-5)
###### Path
[Section titled “Path”](#path-12)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-17)
###### path
[Section titled “path”](#path-13)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-4)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-5)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-21)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-22)
`ShokupanRouter.head`
***
### internalRequest()
[Section titled “internalRequest()”](#internalrequest)
> **internalRequest**(`arg`): `Promise`<`Response`>
Defined in: [src/router.ts:261](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L261)
Makes an internal request through this router’s full routing pipeline. This is useful for calling other routes internally and supports streaming responses.
#### Parameters
[Section titled “Parameters”](#parameters-18)
##### arg
[Section titled “arg”](#arg-1)
`string` | { `body?`: `any`; `headers?`: [`HeadersInit`](/api/type-aliases/headersinit/); `method?`: [`Method`](/api/type-aliases/method/); `path`: `string`; }
#### Returns
[Section titled “Returns”](#returns-22)
`Promise`<`Response`>
The raw Response object.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-23)
`ShokupanRouter.internalRequest`
***
### mount()
[Section titled “mount()”](#mount)
> **mount**(`prefix`, `controller`): `ScalarPlugin`
Defined in: [src/router.ts:205](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L205)
Mounts a controller instance to a path prefix.
Controller can be a convection router or an arbitrary class.
Routes are derived from method names:
* get(ctx) -> GET /prefix/
* getUsers(ctx) -> GET /prefix/users
* postCreate(ctx) -> POST /prefix/create
#### Parameters
[Section titled “Parameters”](#parameters-19)
##### prefix
[Section titled “prefix”](#prefix)
`string`
##### controller
[Section titled “controller”](#controller-1)
`Record`<`string`, `any`> | `ShokupanRouter`<`any`> | [`ShokupanController`](/api/type-aliases/shokupancontroller/) | `ShokupanRouter`<`Record`<`string`, `any`>> | [`ShokupanController`](/api/type-aliases/shokupancontroller/)<`any`>
#### Returns
[Section titled “Returns”](#returns-23)
`ScalarPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-24)
`ShokupanRouter.mount`
***
### onInit()
[Section titled “onInit()”](#oninit)
> **onInit**(`app`, `options?`): `void`
Defined in: [src/plugins/application/scalar.ts:46](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L46)
#### Parameters
[Section titled “Parameters”](#parameters-20)
##### app
[Section titled “app”](#app)
[`Shokupan`](/api/classes/shokupan/)
##### options?
[Section titled “options?”](#options-1)
[`ShokupanPluginOptions`](/api/interfaces/shokupanpluginoptions/)
#### Returns
[Section titled “Returns”](#returns-24)
`void`
#### Implementation of
[Section titled “Implementation of”](#implementation-of)
[`ShokupanPlugin`](/api/interfaces/shokupanplugin/).[`onInit`](/api/interfaces/shokupanplugin/#oninit)
***
### onMount()
[Section titled “onMount()”](#onmount)
> **onMount**(`parent`): `void`
Defined in: [src/plugins/application/scalar.ts:114](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L114)
#### Parameters
[Section titled “Parameters”](#parameters-21)
##### parent
[Section titled “parent”](#parent)
`ShokupanRouter`<`any`>
#### Returns
[Section titled “Returns”](#returns-25)
`void`
***
### options()
[Section titled “options()”](#options-2)
#### Call Signature
[Section titled “Call Signature”](#call-signature-8)
> **options**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1119)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-6)
###### Path
[Section titled “Path”](#path-14)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-22)
###### path
[Section titled “path”](#path-15)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-6)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-26)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-25)
`ShokupanRouter.options`
#### Call Signature
[Section titled “Call Signature”](#call-signature-9)
> **options**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1127](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1127)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-7)
###### Path
[Section titled “Path”](#path-16)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-23)
###### path
[Section titled “path”](#path-17)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-5)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-7)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-27)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-26)
`ShokupanRouter.options`
***
### patch()
[Section titled “patch()”](#patch)
#### Call Signature
[Section titled “Call Signature”](#call-signature-10)
> **patch**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1099](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1099)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-8)
###### Path
[Section titled “Path”](#path-18)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-24)
###### path
[Section titled “path”](#path-19)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-8)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-28)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-27)
`ShokupanRouter.patch`
#### Call Signature
[Section titled “Call Signature”](#call-signature-11)
> **patch**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1107](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1107)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-9)
###### Path
[Section titled “Path”](#path-20)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-25)
###### path
[Section titled “path”](#path-21)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-6)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-9)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-29)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-28)
`ShokupanRouter.patch`
***
### post()
[Section titled “post()”](#post)
#### Call Signature
[Section titled “Call Signature”](#call-signature-12)
> **post**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1039](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1039)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-10)
###### Path
[Section titled “Path”](#path-22)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-26)
###### path
[Section titled “path”](#path-23)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-10)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-30)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-29)
`ShokupanRouter.post`
#### Call Signature
[Section titled “Call Signature”](#call-signature-13)
> **post**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1047](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1047)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-11)
###### Path
[Section titled “Path”](#path-24)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-27)
###### path
[Section titled “path”](#path-25)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-7)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-11)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-31)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-30)
`ShokupanRouter.post`
***
### put()
[Section titled “put()”](#put)
#### Call Signature
[Section titled “Call Signature”](#call-signature-14)
> **put**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1059](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1059)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-12)
###### Path
[Section titled “Path”](#path-26)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-28)
###### path
[Section titled “path”](#path-27)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-12)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-32)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-31)
`ShokupanRouter.put`
#### Call Signature
[Section titled “Call Signature”](#call-signature-15)
> **put**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1067](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1067)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-13)
###### Path
[Section titled “Path”](#path-28)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-29)
###### path
[Section titled “path”](#path-29)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-8)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-13)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`any`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-33)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-32)
`ShokupanRouter.put`
***
### runHooks()
[Section titled “runHooks()”](#runhooks)
> **runHooks**(`name`, …`args`): `Promise`<`void`>
Defined in: [src/router.ts:1339](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1339)
#### Parameters
[Section titled “Parameters”](#parameters-30)
##### name
[Section titled “name”](#name-1)
keyof [`ShokupanHooks`](/api/interfaces/shokupanhooks/)<`any`>
##### args
[Section titled “args”](#args)
…`any`\[]
#### Returns
[Section titled “Returns”](#returns-34)
`Promise`<`void`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-33)
`ShokupanRouter.runHooks`
***
### static()
[Section titled “static()”](#static)
> **static**(`uriPath`, `options`): `ScalarPlugin`
Defined in: [src/router.ts:1217](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1217)
Statically serves a directory with standard options.
#### Parameters
[Section titled “Parameters”](#parameters-31)
##### uriPath
[Section titled “uriPath”](#uripath)
`string`
URL path prefix
##### options
[Section titled “options”](#options-3)
Configuration options or root directory string
`string` | [`StaticServeOptions`](/api/interfaces/staticserveoptions/)<`any`>
#### Returns
[Section titled “Returns”](#returns-35)
`ScalarPlugin`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-34)
`ShokupanRouter.static`
***
### testRequest()
[Section titled “testRequest()”](#testrequest)
> **testRequest**(`options`): `Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
Defined in: [src/router.ts:293](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L293)
Processes a request for testing purposes. Returns a simplified { status, headers, data } object instead of a Response.
#### Parameters
[Section titled “Parameters”](#parameters-32)
##### options
[Section titled “options”](#options-4)
[`RequestOptions`](/api/interfaces/requestoptions/)
#### Returns
[Section titled “Returns”](#returns-36)
`Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-35)
`ShokupanRouter.testRequest`
# Shokupan
Defined in: [src/shokupan.ts:93](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L93)
Shokupan Application
The main application class for creating a Shokupan web server.
## Template
[Section titled “Template”](#template)
The shape of `ctx.state` for all routes in the application. Use this to provide type safety for state management across middleware and handlers.
## Examples
[Section titled “Examples”](#examples)
```typescript
const app = new Shokupan();
app.get('/hello', (ctx) => ctx.json({ message: 'Hello' }));
await app.listen(3000);
```
```typescript
interface AppState {
userId: string;
tenant: string;
requestId: string;
}
const app = new Shokupan();
// Middleware has typed state access
app.use((ctx, next) => {
ctx.state.userId = 'user-123'; // ✓ Type-safe
ctx.state.requestId = crypto.randomUUID();
return next();
});
// Handlers have typed state access
app.get('/profile', (ctx) => {
const { userId, tenant } = ctx.state; // ✓ TypeScript knows these exist
return ctx.json({ userId, tenant });
});
```
```typescript
import { EmptyState } from 'shokupan';
const app = new Shokupan();
// ctx.state will be an empty object with no properties
```
```typescript
interface RequestState {
userId: string;
permissions: string[];
}
const app = new Shokupan();
app.get('/users/:userId/posts/:postId', (ctx) => {
// Both params and state are fully typed!
const { userId, postId } = ctx.params; // ✓ Path params typed
const { permissions } = ctx.state; // ✓ State typed
return ctx.json({ userId, postId, permissions });
});
```
## Extends
[Section titled “Extends”](#extends)
* `ShokupanRouter`<`T`>
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` = `any`
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new Shokupan**<`T`>(`applicationConfig`): `Shokupan`<`T`>
Defined in: [src/shokupan.ts:104](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L104)
#### Parameters
[Section titled “Parameters”](#parameters)
##### applicationConfig
[Section titled “applicationConfig”](#applicationconfig)
###### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback)
`boolean`
Whether to enable automatic backpressure based on system CPU load.
**Default**
```ts
false
```
###### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel)
`number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests (429).
**Default**
```ts
60
```
###### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly)
`boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
**Default**
```ts
false
```
###### development?
[Section titled “development?”](#development)
`boolean`
Whether to run in development mode.
**Default**
```ts
process.env.NODE_ENV !== "production"
```
###### enableAsyncLocalStorage?
[Section titled “enableAsyncLocalStorage?”](#enableasynclocalstorage)
`boolean`
Whether to enable AsyncLocalStorage. (Request local storage)
**Default**
```ts
false
```
###### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking)
`boolean`
Whether to enable middleware and handler tracking. When enabled, `ctx.handlerStack` will be populated with the handlers the request has passed through. Also, `ctx.state` will be a Proxy that tracks changes made by each handler.
**Default**
```ts
false
```
###### enableOpenApiGen?
[Section titled “enableOpenApiGen?”](#enableopenapigen)
`boolean`
Whether to enable OpenAPI generation.
**Default**
```ts
true
```
###### enableTracing?
[Section titled “enableTracing?”](#enabletracing)
`boolean`
Whether to enable OpenTelemetry tracing.
**Default**
```ts
false
```
###### hooks?
[Section titled “hooks?”](#hooks)
{ `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Lifecycle hooks.
###### hostname?
[Section titled “hostname?”](#hostname)
`string`
The hostname to be used for the server.
**Default**
```ts
"localhost"
```
###### httpLogger?
[Section titled “httpLogger?”](#httplogger)
(`ctx`) => `void`
HTTP logger function.
###### jsonParser?
[Section titled “jsonParser?”](#jsonparser)
`"native"` | `"parse-json"` | `"secure-json-parse"`
JSON parser to use for parsing request bodies.
Options:
* `'native'`: Use the built-in JSON.parse (fastest, default)
* `'parse-json'`: Use the parse-json library for better error messages with minimal performance overhead (\~5% slower than native)
* `'secure-json-parse'`: Use secure-json-parse for protection against prototype pollution (20-30% slower than native)
Performance implications based on benchmarks:
* `native`: Fastest option, excellent for production
* `parse-json`: Nearly identical performance to native with better error messages, good for development
* `secure-json-parse`: Provides security at the cost of performance, use only for untrusted input
**Default**
```ts
'native'
```
###### logger?
[Section titled “logger?”](#logger)
{ `debug?`: (`msg`, `props`) => `void`; `error?`: (`msg`, `props`) => `void`; `fatal?`: (`msg`, `props`) => `void`; `info?`: (`msg`, `props`) => `void`; `verbose?`: `boolean`; `warning?`: (`msg`, `props`) => `void`; }
Logger object.
###### logger.debug?
[Section titled “logger.debug?”](#loggerdebug)
(`msg`, `props`) => `void`
###### logger.error?
[Section titled “logger.error?”](#loggererror)
(`msg`, `props`) => `void`
###### logger.fatal?
[Section titled “logger.fatal?”](#loggerfatal)
(`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### logger.info?
[Section titled “logger.info?”](#loggerinfo)
(`msg`, `props`) => `void`
###### logger.verbose?
[Section titled “logger.verbose?”](#loggerverbose)
`boolean`
###### logger.warning?
[Section titled “logger.warning?”](#loggerwarning)
(`msg`, `props`) => `void`
###### middlewareTrackingMaxCapacity?
[Section titled “middlewareTrackingMaxCapacity?”](#middlewaretrackingmaxcapacity)
`number`
Maximum number of middleware executions to store in the datastore. Only applies when enableMiddlewareTracking is true.
**Default**
```ts
10000
```
###### middlewareTrackingTTL?
[Section titled “middlewareTrackingTTL?”](#middlewaretrackingttl)
`number`
Time-to-live for middleware tracking entries in milliseconds. Entries older than this will be cleaned up. Only applies when enableMiddlewareTracking is true.
**Default**
```ts
86400000 (1 day)
```
###### port?
[Section titled “port?”](#port)
`number`
The port to be used for the server.
**Default**
```ts
3000
```
###### readTimeout?
[Section titled “readTimeout?”](#readtimeout)
`number`
Timeout for reading the request body (milliseconds). Maps to Bun’s `idleTimeout`.
**Default**
```ts
30000
```
###### renderer?
[Section titled “renderer?”](#renderer)
[`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX Rendering function.
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout)
`number`
Timeout for processing the request (milliseconds). Maps to `server.timeout(req, seconds)`.
**Default**
```ts
0 (disabled)
```
###### reusePort?
[Section titled “reusePort?”](#reuseport)
`boolean`
Whether to reuse the port.
**Default**
```ts
false
```
###### serverFactory?
[Section titled “serverFactory?”](#serverfactory)
[`ServerFactory`](/api/interfaces/serverfactory/)
Factory function to create the server instance. Defaults to Bun.serve.
###### validateStatusCodes?
[Section titled “validateStatusCodes?”](#validatestatuscodes)
`boolean`
Whether to validate response status codes.
**Default**
```ts
true
```
###### writeTimeout?
[Section titled “writeTimeout?”](#writetimeout)
`number`
Timeout for writing the response (milliseconds). Not currently supported by Bun.serve natively.
Experimental
This API should not be used in production and may be trimmed from a public release.
#### Returns
[Section titled “Returns”](#returns)
`Shokupan`<`T`>
#### Overrides
[Section titled “Overrides”](#overrides)
`ShokupanRouter.constructor`
## Properties
[Section titled “Properties”](#properties)
### \[$childControllers]
[Section titled “\[$childControllers\]”](#childcontrollers)
> **\[$childControllers]**: [`ShokupanController`](/api/type-aliases/shokupancontroller/)\[] = `[]`
Defined in: [src/router.ts:89](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L89)
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`ShokupanRouter.[$childControllers]`
***
### \[$childRouters]
[Section titled “\[$childRouters\]”](#childrouters)
> **\[$childRouters]**: `ShokupanRouter`<`T`>\[] = `[]`
Defined in: [src/router.ts:88](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L88)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`ShokupanRouter.[$childRouters]`
***
### \[$mountPath]
[Section titled “\[$mountPath\]”](#mountpath)
> **\[$mountPath]**: `string` = `"/"`
Defined in: [src/router.ts:85](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L85)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`ShokupanRouter.[$mountPath]`
***
### \[$routes]
[Section titled “\[$routes\]”](#routes)
> **\[$routes]**: [`ShokupanRoute`](/api/type-aliases/shokupanroute/)\[] = `[]`
Defined in: [src/router.ts:103](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L103)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`ShokupanRouter.[$routes]`
***
### applicationConfig
[Section titled “applicationConfig”](#applicationconfig-1)
> `readonly` **applicationConfig**: `object` = `{}`
Defined in: [src/shokupan.ts:94](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L94)
#### Index Signature
[Section titled “Index Signature”](#index-signature)
\[`key`: `string`]: `any`
#### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback-1)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
##### Default
[Section titled “Default”](#default)
```ts
false
```
#### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel-1)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests (429).
##### Default
[Section titled “Default”](#default-1)
```ts
60
```
#### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly-1)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
##### Default
[Section titled “Default”](#default-2)
```ts
false
```
#### development?
[Section titled “development?”](#development-1)
> `optional` **development**: `boolean`
Whether to run in development mode.
##### Default
[Section titled “Default”](#default-3)
```ts
process.env.NODE_ENV !== "production"
```
#### enableAsyncLocalStorage?
[Section titled “enableAsyncLocalStorage?”](#enableasynclocalstorage-1)
> `optional` **enableAsyncLocalStorage**: `boolean`
Whether to enable AsyncLocalStorage. (Request local storage)
##### Default
[Section titled “Default”](#default-4)
```ts
false
```
#### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking-1)
> `optional` **enableMiddlewareTracking**: `boolean`
Whether to enable middleware and handler tracking. When enabled, `ctx.handlerStack` will be populated with the handlers the request has passed through. Also, `ctx.state` will be a Proxy that tracks changes made by each handler.
##### Default
[Section titled “Default”](#default-5)
```ts
false
```
#### enableOpenApiGen?
[Section titled “enableOpenApiGen?”](#enableopenapigen-1)
> `optional` **enableOpenApiGen**: `boolean`
Whether to enable OpenAPI generation.
##### Default
[Section titled “Default”](#default-6)
```ts
true
```
#### enableTracing?
[Section titled “enableTracing?”](#enabletracing-1)
> `optional` **enableTracing**: `boolean`
Whether to enable OpenTelemetry tracing.
##### Default
[Section titled “Default”](#default-7)
```ts
false
```
#### hooks?
[Section titled “hooks?”](#hooks-1)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Lifecycle hooks.
#### hostname?
[Section titled “hostname?”](#hostname-1)
> `optional` **hostname**: `string`
The hostname to be used for the server.
##### Default
[Section titled “Default”](#default-8)
```ts
"localhost"
```
#### httpLogger()?
[Section titled “httpLogger()?”](#httplogger-1)
> `optional` **httpLogger**: (`ctx`) => `void`
HTTP logger function.
##### Parameters
[Section titled “Parameters”](#parameters-1)
###### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`Record`<`string`, `any`>>
##### Returns
[Section titled “Returns”](#returns-1)
`void`
#### jsonParser?
[Section titled “jsonParser?”](#jsonparser-1)
> `optional` **jsonParser**: `"native"` | `"parse-json"` | `"secure-json-parse"`
JSON parser to use for parsing request bodies.
Options:
* `'native'`: Use the built-in JSON.parse (fastest, default)
* `'parse-json'`: Use the parse-json library for better error messages with minimal performance overhead (\~5% slower than native)
* `'secure-json-parse'`: Use secure-json-parse for protection against prototype pollution (20-30% slower than native)
Performance implications based on benchmarks:
* `native`: Fastest option, excellent for production
* `parse-json`: Nearly identical performance to native with better error messages, good for development
* `secure-json-parse`: Provides security at the cost of performance, use only for untrusted input
##### Default
[Section titled “Default”](#default-9)
```ts
'native'
```
#### logger?
[Section titled “logger?”](#logger-1)
> `optional` **logger**: `object`
Logger object.
##### logger.debug()?
[Section titled “logger.debug()?”](#loggerdebug-1)
> `optional` **debug**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-2)
###### msg
[Section titled “msg”](#msg)
`string`
###### props
[Section titled “props”](#props)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-2)
`void`
##### logger.error()?
[Section titled “logger.error()?”](#loggererror-1)
> `optional` **error**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-3)
###### msg
[Section titled “msg”](#msg-1)
`string`
###### props
[Section titled “props”](#props-1)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-3)
`void`
##### logger.fatal()?
[Section titled “logger.fatal()?”](#loggerfatal-1)
> `optional` **fatal**: (`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### Parameters
[Section titled “Parameters”](#parameters-4)
###### msg
[Section titled “msg”](#msg-2)
`string`
###### props
[Section titled “props”](#props-2)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-4)
`void`
##### logger.info()?
[Section titled “logger.info()?”](#loggerinfo-1)
> `optional` **info**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-5)
###### msg
[Section titled “msg”](#msg-3)
`string`
###### props
[Section titled “props”](#props-3)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-5)
`void`
##### logger.verbose?
[Section titled “logger.verbose?”](#loggerverbose-1)
> `optional` **verbose**: `boolean`
##### logger.warning()?
[Section titled “logger.warning()?”](#loggerwarning-1)
> `optional` **warning**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-6)
###### msg
[Section titled “msg”](#msg-4)
`string`
###### props
[Section titled “props”](#props-4)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-6)
`void`
#### middlewareTrackingMaxCapacity?
[Section titled “middlewareTrackingMaxCapacity?”](#middlewaretrackingmaxcapacity-1)
> `optional` **middlewareTrackingMaxCapacity**: `number`
Maximum number of middleware executions to store in the datastore. Only applies when enableMiddlewareTracking is true.
##### Default
[Section titled “Default”](#default-10)
```ts
10000
```
#### middlewareTrackingTTL?
[Section titled “middlewareTrackingTTL?”](#middlewaretrackingttl-1)
> `optional` **middlewareTrackingTTL**: `number`
Time-to-live for middleware tracking entries in milliseconds. Entries older than this will be cleaned up. Only applies when enableMiddlewareTracking is true.
##### Default
[Section titled “Default”](#default-11)
```ts
86400000 (1 day)
```
#### port?
[Section titled “port?”](#port-1)
> `optional` **port**: `number`
The port to be used for the server.
##### Default
[Section titled “Default”](#default-12)
```ts
3000
```
#### readTimeout?
[Section titled “readTimeout?”](#readtimeout-1)
> `optional` **readTimeout**: `number`
Timeout for reading the request body (milliseconds). Maps to Bun’s `idleTimeout`.
##### Default
[Section titled “Default”](#default-13)
```ts
30000
```
#### renderer?
[Section titled “renderer?”](#renderer-1)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX Rendering function.
#### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-1)
> `optional` **requestTimeout**: `number`
Timeout for processing the request (milliseconds). Maps to `server.timeout(req, seconds)`.
##### Default
[Section titled “Default”](#default-14)
```ts
0 (disabled)
```
#### reusePort?
[Section titled “reusePort?”](#reuseport-1)
> `optional` **reusePort**: `boolean`
Whether to reuse the port.
##### Default
[Section titled “Default”](#default-15)
```ts
false
```
#### serverFactory?
[Section titled “serverFactory?”](#serverfactory-1)
> `optional` **serverFactory**: [`ServerFactory`](/api/interfaces/serverfactory/)
Factory function to create the server instance. Defaults to Bun.serve.
#### validateStatusCodes?
[Section titled “validateStatusCodes?”](#validatestatuscodes-1)
> `optional` **validateStatusCodes**: `boolean`
Whether to validate response status codes.
##### Default
[Section titled “Default”](#default-16)
```ts
true
```
#### writeTimeout?
[Section titled “writeTimeout?”](#writetimeout-1)
> `optional` **writeTimeout**: `number`
Timeout for writing the response (milliseconds). Not currently supported by Bun.serve natively.
Experimental
This API should not be used in production and may be trimmed from a public release.
***
### config?
[Section titled “config?”](#config)
> `readonly` `optional` **config**: `object`
Defined in: [src/router.ts:183](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L183)
#### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback-2)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
##### Default
[Section titled “Default”](#default-17)
```ts
false
```
#### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel-2)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests.
#### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly-2)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
##### Default
[Section titled “Default”](#default-18)
```ts
false
```
#### group?
[Section titled “group?”](#group)
> `optional` **group**: `string`
#### hooks?
[Section titled “hooks?”](#hooks-2)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Hooks for this route/router.
#### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
#### openapi?
[Section titled “openapi?”](#openapi)
> `optional` **openapi**: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `consumes?`: `string`\[]; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; `description?`: `string`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; } | {\[`key`: `string`]: `any`; `$ref?`: `string`; `allowEmptyValue?`: `boolean`; `collectionFormat?`: `string`; `default?`: `any`; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `in?`: `ParameterLocation`; `items?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { type?: string; format?: string; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | …; collectionFormat?: string; default?: any; … 12 more …; $ref?: string; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `name?`: `string`; `pattern?`: `string`; `required?`: `boolean`; `type?`: `string`; `uniqueItems?`: `boolean`; })\[]; `produces?`: `string`\[]; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; `default?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `description?`: `string`; `examples?`: {\[`key`: `string`]: `any`; }; `headers?`: {\[`key`: `string`]: `object`; }; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `` `x-${string}` ``]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 23 more …; $ref?: string; }; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; }; `allOf?`: `object`\[]; `anyOf?`: `object`\[]; `default?`: `any`; `definitions?`: {\[`key`: `string`]: `object`; }; `dependencies?`: {\[`key`: `string`]: …\[] | {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; }; `description?`: `string`; `discriminator?`: `string`; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: {\[`key`: `string`]: `any`; `description?`: `string`; `url?`: `string`; }; `id?`: `string`; `items?`: {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; \[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `length?`: `number`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: … | … | …; `additionalProperties?`: … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `collectionFormat?`: `string`; `default?`: `any`; `definitions?`: {\[`key`: …]: …; }; `dependencies?`: {\[`key`: …]: …; }; `description?`: `string`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; … 22 more …; not?: { …; }; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; `$schema?`: …; `additionalItems?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `definitions?`: …; `dependencies?`: …; `description?`: …; `enum?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `id?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `required?`: …\[]; `title?`: `string`; `type?`: … | …; `uniqueItems?`: `boolean`; } | {\[`key`: `number`]: `object`; `[unscopables]?`: {\[`key`: …]: …; `[iterator]?`: …; `[unscopables]?`: …; `at?`: …; `concat?`: …; `copyWithin?`: …; `entries?`: …; `every?`: …; `fill?`: …; `filter?`: …; `find?`: …; `findIndex?`: …; `findLast?`: …; `findLastIndex?`: …; `flat?`: …; `flatMap?`: …; `forEach?`: …; `includes?`: …; `indexOf?`: …; `join?`: …; `keys?`: …; `lastIndexOf?`: …; `length?`: …; `map?`: …; `pop?`: …; `push?`: …; `reduce?`: …; `reduceRight?`: …; `reverse?`: …; `shift?`: …; `slice?`: …; `some?`: …; `sort?`: …; `splice?`: …; `toLocaleString?`: …; `toReversed?`: …; `toSorted?`: …; `toSpliced?`: …; `toString?`: …; `unshift?`: …; `values?`: …; `with?`: …; }; `$ref?`: `string`; `collectionFormat?`: `string`; `default?`: `any`; `enum?`: …\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `format?`: `string`; `items?`: … | …; `length?`: `number`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `multipleOf?`: `number`; `pattern?`: `string`; `type?`: `string`; `uniqueItems?`: `boolean`; `[iterator]?`: `ArrayIterator`<…>; `at?`: `IJsonSchema`; `concat?`: …\[]; `copyWithin?`: `this`; `entries?`: `ArrayIterator`<…>; `every?`: `this is (...)[]`; `fill?`: `this`; `filter?`: …\[]; `find?`: `S`; `findIndex?`: `number`; `findLast?`: `S`; `findLastIndex?`: `number`; `flat?`: …\[]; `flatMap?`: …\[]; `forEach?`: `void`; `includes?`: `boolean`; `indexOf?`: `number`; `join?`: `string`; `keys?`: `ArrayIterator`<…>; `lastIndexOf?`: `number`; `map?`: …\[]; `pop?`: `IJsonSchema`; `push?`: `number`; `reduce?`: `IJsonSchema`; `reduceRight?`: `IJsonSchema`; `reverse?`: …\[]; `shift?`: `IJsonSchema`; `slice?`: …\[]; `some?`: `boolean`; `sort?`: `this`; `splice?`: …\[]; `toLocaleString?`: `string`; `toReversed?`: …\[]; `toSorted?`: …\[]; `toSpliced?`: …\[]; `toString?`: `string`; `unshift?`: `number`; `values?`: `ArrayIterator`<…>; `with?`: …\[]; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; `$schema?`: `string`; `additionalItems?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `additionalProperties?`: `boolean` | { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `definitions?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `dependencies?`: {\[`key`: `string`]: … | …; }; `description?`: `string`; `enum?`: `any`\[]; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `id?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; } | …\[]; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; id?: string; $schema?: string; title?: string; description?: string; multipleOf?: number; maximum?: number; exclusiveMaximum?: boolean; minimum?: number; exclusiveMinimum?: boolean; … 22 more …; $ref?: string; }; }; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | …\[]; `uniqueItems?`: `boolean`; }; `oneOf?`: `object`\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: `object`; }; `properties?`: {\[`key`: `string`]: `object`; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `string` | `string`\[]; `uniqueItems?`: `boolean`; `xml?`: {\[`key`: `string`]: `any`; `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; }; }; `schemes?`: `string`\[]; `security?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `string`]: `object`; }; }; `deprecated?`: `boolean`; `description?`: `string`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `operationId?`: `string`; `parameters?`: ({\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `headers?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `security?`: `object`\[]; `servers?`: `object`\[]; `summary?`: `string`; `tags?`: `string`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `parameters?`: ({ `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; `servers?`: `object`\[]; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ name?: string; in?: ParameterLocation; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; … 6 more …; content?: { …; }; } | { …; })\[]; requestBody?: { …; } | { …; }; responses?: { …; }; callbacks?: { …; }; s…; }; }; }; `parameters?`: ({ `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { `description?`: `string`; `externalValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; … 33 more …; deprecated?: boolean; }; … 33 more …; deprecated?: boolean; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: `boolean` | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$ref?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `additionalProperties?`: boolean | { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; …; `allOf?`: …\[]; `anyOf?`: …\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: NonArraySchemaObjectType; title?: string; description?: string; format?: string; default?: any; multipleOf?: number; maximum?: number; … 27 more …; deprecated?: boolean; }; `allOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `anyOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `exclusiveMaximum?`: `boolean`; `exclusiveMinimum?`: `boolean`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; `nullable?`: `boolean`; `oneOf?`: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `properties?`: {\[`key`: `string`]: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; type?: “array”; items?: { \[x: \`x-${string}\`]: any; \[x: string]: any; $ref?: string; } | … | { \[x: \`x-${string}\`]: any; \[x: string]: any; … 34 more …; deprecated?: boolean; }; … 33 more …; deprecated…; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: `boolean`; `name?`: `string`; `namespace?`: `string`; `prefix?`: `string`; `wrapped?`: `boolean`; }; }; `style?`: `ParameterStyle`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: `object`; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: `object`; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `$ref?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `nullable?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; }; }; `servers?`: `object`\[]; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `callbacks?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `additionalOperations?`: {\[`key`: `string`]: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; `delete?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `get?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `head?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `options?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `parameters?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `allowEmptyValue?`: …; `allowReserved?`: …; `content?`: …; `deprecated?`: …; `description?`: …; `example?`: …; `examples?`: …; `explode?`: …; `in?`: …; `name?`: …; `required?`: …; `schema?`: …; `style?`: …; })\[]; `patch?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `post?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `put?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `query?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; `trace?`: { \[x: string]: any; \[x: number]: any; parameters?: ({ \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; deprecated?: boolean; content?: { \[x: string]: { schema?: { …; } | … 1 more … | { …; }; example?: any; examples?: { …; }; encoding?: { …; }; }; }; …; }; }; }; `parameters?`: ({\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: `object`; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `dataValue?`: `any`; `description?`: `string`; `externalValue?`: `string`; `serializedValue?`: `string`; `summary?`: `string`; `value?`: `any`; }; }; `explode?`: `boolean`; `in?`: `ParameterLocation`; `name?`: `string`; `required?`: `boolean`; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; } | {\[`key`: `` `x-${string}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: `boolean` | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: boolean | { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: … | … | … | … | … | …; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `allOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `anyOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: `string`; `mapping?`: {\[`key`: `string`]: `string`; }; `propertyName?`: `string`; }; `enum?`: `any`\[]; `example?`: `any`; `examples?`: `object`\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: `string`; `url?`: `string`; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `attribute?`: …; `name?`: …; `namespace?`: …; `prefix?`: …; `wrapped?`: …; }; }; `oneOf?`: ({\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; })\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `properties?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; `readOnly?`: `boolean`; `required?`: `string`\[]; `title?`: `string`; `type?`: (`"array"` | `NonArraySchemaObjectType`)\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: `string`; `namespace?`: `string`; `nodeType?`: `XMLNodeType`; `prefix?`: `string`; }; }; `style?`: `ParameterStyle`; })\[]; `requestBody?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | { `dataValue?`: …; `description?`: …; `externalValue?`: …; `serializedValue?`: …; `summary?`: …; `value?`: …; }; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: `string`]: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; }; `explode?`: `boolean`; `headers?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `valueOf?`: `boolean`; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `"array"`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: `NonArraySchemaObjectType`; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; } | {\[`key`: `` `x-${(...)}` ``]: `any`; \[`key`: `string`]: `any`; `$schema?`: `string`; `additionalProperties?`: … | … | … | … | … | … | … | …; `allOf?`: …\[]; `anyOf?`: …\[]; `const?`: `any`; `contentMediaType?`: `string`; `default?`: `any`; `deprecated?`: `boolean`; `description?`: `string`; `discriminator?`: { `defaultMapping?`: …; `mapping?`: …; `propertyName?`: …; }; `enum?`: …\[]; `example?`: `any`; `examples?`: …\[]; `exclusiveMaximum?`: `number`; `exclusiveMinimum?`: `number`; `externalDocs?`: { `description?`: …; `url?`: …; }; `format?`: `string`; `items?`: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { \[x: \`x-${string}\`]: any; \[x: string]: any; valueOf?: () => boolean; } | { …; } | { …; } | { …; }; `maximum?`: `number`; `maxItems?`: `number`; `maxLength?`: `number`; `maxProperties?`: `number`; `minimum?`: `number`; `minItems?`: `number`; `minLength?`: `number`; `minProperties?`: `number`; `multipleOf?`: `number`; `not?`: … | … | … | … | … | …; `oneOf?`: …\[]; `pattern?`: `string`; `patternProperties?`: {\[`key`: …]: …; }; `properties?`: {\[`key`: …]: …; }; `readOnly?`: `boolean`; `required?`: …\[]; `title?`: `string`; `type?`: …\[]; `uniqueItems?`: `boolean`; `writeOnly?`: `boolean`; `xml?`: { `name?`: …; `namespace?`: …; `nodeType?`: …; `prefix?`: …; }; }; }; }; `description?`: `string`; `required?`: `boolean`; }; `responses?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `content?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `encoding?`: {\[`key`: `string`]: `object`; }; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `itemEncoding?`: { `allowReserved?`: `boolean`; `contentType?`: `string`; `encoding?`: {\[`key`: …]: …; }; `explode?`: `boolean`; `headers?`: {\[`key`: …]: …; }; `itemEncoding?`: { style?: string; explode?: boolean; allowReserved?: boolean; contentType?: string; headers?: { \[x: string]: { \[x: string]: any; \[x: number]: any; summary?: string; description?: string; } | { description?: string; … 9 more …; schema?: { …; } | … 4 more … | { …; }; }; }; encoding?: { …; }; prefixEncodi…; `prefixEncoding?`: …\[]; `style?`: `string`; }; `itemSchema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `prefixEncoding?`: `object`\[]; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; }; }; `headers?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `allowEmptyValue?`: `boolean`; `allowReserved?`: `boolean`; `content?`: {\[`key`: `string`]: … | …; }; `deprecated?`: `boolean`; `description?`: `string`; `example?`: `any`; `examples?`: {\[`key`: `string`]: … | …; }; `explode?`: `boolean`; `required?`: `boolean`; `schema?`: {\[`key`: …]: …; \[`key`: …]: …; `description?`: …; `summary?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `valueOf?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; } | {\[`key`: …]: …; \[`key`: …]: …; `$schema?`: …; `additionalProperties?`: …; `allOf?`: …; `anyOf?`: …; `const?`: …; `contentMediaType?`: …; `default?`: …; `deprecated?`: …; `description?`: …; `discriminator?`: …; `enum?`: …; `example?`: …; `examples?`: …; `exclusiveMaximum?`: …; `exclusiveMinimum?`: …; `externalDocs?`: …; `format?`: …; `items?`: …; `maximum?`: …; `maxItems?`: …; `maxLength?`: …; `maxProperties?`: …; `minimum?`: …; `minItems?`: …; `minLength?`: …; `minProperties?`: …; `multipleOf?`: …; `not?`: …; `oneOf?`: …; `pattern?`: …; `patternProperties?`: …; `properties?`: …; `readOnly?`: …; `required?`: …; `title?`: …; `type?`: …; `uniqueItems?`: …; `writeOnly?`: …; `xml?`: …; }; `style?`: `ParameterStyle`; }; }; `links?`: {\[`key`: `string`]: {\[`key`: `string`]: `any`; \[`key`: `number`]: `any`; `description?`: `string`; `summary?`: `string`; } | { `description?`: `string`; `operationId?`: `string`; `operationRef?`: `string`; `parameters?`: {\[`key`: `string`]: `any`; }; `requestBody?`: `any`; `server?`: { `description?`: `string`; `name?`: `string`; `url?`: `string`; `variables?`: {\[`key`: …]: …; }; }; }; }; `summary?`: `string`; }; }; `servers?`: `object`\[]; }
#### renderer?
[Section titled “renderer?”](#renderer-2)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
Custom renderer for this route.
#### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-2)
> `optional` **requestTimeout**: `number`
Timeout for this specific route (milliseconds).
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`ShokupanRouter.config`
***
### metadata?
[Section titled “metadata?”](#metadata)
> `optional` **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
Defined in: [src/router.ts:105](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L105)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`ShokupanRouter.metadata`
***
### middleware
[Section titled “middleware”](#middleware)
> **middleware**: [`Middleware`](/api/type-aliases/middleware/)\[] = `[]`
Defined in: [src/router.ts:94](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L94)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`ShokupanRouter.middleware`
***
### openApiSpec?
[Section titled “openApiSpec?”](#openapispec)
> `optional` **openApiSpec**: `any`
Defined in: [src/shokupan.ts:95](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L95)
***
### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-3)
> `optional` **requestTimeout**: `number`
Defined in: [src/router.ts:792](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L792)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`ShokupanRouter.requestTimeout`
## Accessors
[Section titled “Accessors”](#accessors)
### logger
[Section titled “logger”](#logger-2)
#### Get Signature
[Section titled “Get Signature”](#get-signature)
> **get** **logger**(): `object`
Defined in: [src/shokupan.ts:100](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L100)
##### Returns
[Section titled “Returns”](#returns-7)
###### debug()?
[Section titled “debug()?”](#debug)
> `optional` **debug**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-7)
###### msg
[Section titled “msg”](#msg-5)
`string`
###### props
[Section titled “props”](#props-5)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-8)
`void`
###### error()?
[Section titled “error()?”](#error)
> `optional` **error**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-8)
###### msg
[Section titled “msg”](#msg-6)
`string`
###### props
[Section titled “props”](#props-6)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-9)
`void`
###### fatal()?
[Section titled “fatal()?”](#fatal)
> `optional` **fatal**: (`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### Parameters
[Section titled “Parameters”](#parameters-9)
###### msg
[Section titled “msg”](#msg-7)
`string`
###### props
[Section titled “props”](#props-7)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-10)
`void`
###### info()?
[Section titled “info()?”](#info)
> `optional` **info**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-10)
###### msg
[Section titled “msg”](#msg-8)
`string`
###### props
[Section titled “props”](#props-8)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-11)
`void`
###### verbose?
[Section titled “verbose?”](#verbose)
> `optional` **verbose**: `boolean`
###### warning()?
[Section titled “warning()?”](#warning)
> `optional` **warning**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-11)
###### msg
[Section titled “msg”](#msg-9)
`string`
###### props
[Section titled “props”](#props-9)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-12)
`void`
***
### root
[Section titled “root”](#root)
#### Get Signature
[Section titled “Get Signature”](#get-signature-1)
> **get** **root**(): `Shokupan`<`any`>
Defined in: [src/router.ts:99](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L99)
##### Returns
[Section titled “Returns”](#returns-13)
`Shokupan`<`any`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`ShokupanRouter.root`
***
### rootConfig
[Section titled “rootConfig”](#rootconfig)
#### Get Signature
[Section titled “Get Signature”](#get-signature-2)
> **get** **rootConfig**(): `object`
Defined in: [src/router.ts:96](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L96)
##### Returns
[Section titled “Returns”](#returns-14)
###### autoBackpressureFeedback?
[Section titled “autoBackpressureFeedback?”](#autobackpressurefeedback-3)
> `optional` **autoBackpressureFeedback**: `boolean`
Whether to enable automatic backpressure based on system CPU load.
###### Default
[Section titled “Default”](#default-19)
```ts
false
```
###### autoBackpressureLevel?
[Section titled “autoBackpressureLevel?”](#autobackpressurelevel-3)
> `optional` **autoBackpressureLevel**: `number`
The CPU usage percentage threshold (0-100) at which to start rejecting requests (429).
###### Default
[Section titled “Default”](#default-20)
```ts
60
```
###### controllersOnly?
[Section titled “controllersOnly?”](#controllersonly-3)
> `optional` **controllersOnly**: `boolean`
Whether to enforce that only controller classes (constructors) are accepted by the router.
###### Default
[Section titled “Default”](#default-21)
```ts
false
```
###### development?
[Section titled “development?”](#development-2)
> `optional` **development**: `boolean`
Whether to run in development mode.
###### Default
[Section titled “Default”](#default-22)
```ts
process.env.NODE_ENV !== "production"
```
###### enableAsyncLocalStorage?
[Section titled “enableAsyncLocalStorage?”](#enableasynclocalstorage-2)
> `optional` **enableAsyncLocalStorage**: `boolean`
Whether to enable AsyncLocalStorage. (Request local storage)
###### Default
[Section titled “Default”](#default-23)
```ts
false
```
###### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking-2)
> `optional` **enableMiddlewareTracking**: `boolean`
Whether to enable middleware and handler tracking. When enabled, `ctx.handlerStack` will be populated with the handlers the request has passed through. Also, `ctx.state` will be a Proxy that tracks changes made by each handler.
###### Default
[Section titled “Default”](#default-24)
```ts
false
```
###### enableOpenApiGen?
[Section titled “enableOpenApiGen?”](#enableopenapigen-2)
> `optional` **enableOpenApiGen**: `boolean`
Whether to enable OpenAPI generation.
###### Default
[Section titled “Default”](#default-25)
```ts
true
```
###### enableTracing?
[Section titled “enableTracing?”](#enabletracing-2)
> `optional` **enableTracing**: `boolean`
Whether to enable OpenTelemetry tracing.
###### Default
[Section titled “Default”](#default-26)
```ts
false
```
###### hooks?
[Section titled “hooks?”](#hooks-3)
> `optional` **hooks**: { `afterValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `beforeValidate?`: (`ctx`, `data`) => `void` | `Promise`<`void`>; `onError?`: (`ctx`, `error`) => `void` | `Promise`<`void`>; `onReadTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestEnd?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestStart?`: (`ctx`) => `void` | `Promise`<`void`>; `onRequestTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; `onResponseEnd?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onResponseStart?`: (`ctx`, `response`) => `void` | `Promise`<`void`>; `onWriteTimeout?`: (`ctx`) => `void` | `Promise`<`void`>; } | `object`\[]
Lifecycle hooks.
###### hostname?
[Section titled “hostname?”](#hostname-2)
> `optional` **hostname**: `string`
The hostname to be used for the server.
###### Default
[Section titled “Default”](#default-27)
```ts
"localhost"
```
###### httpLogger()?
[Section titled “httpLogger()?”](#httplogger-2)
> `optional` **httpLogger**: (`ctx`) => `void`
HTTP logger function.
###### Parameters
[Section titled “Parameters”](#parameters-12)
###### ctx
[Section titled “ctx”](#ctx-1)
[`ShokupanContext`](/api/classes/shokupancontext/)<`Record`<`string`, `any`>>
###### Returns
[Section titled “Returns”](#returns-15)
`void`
###### jsonParser?
[Section titled “jsonParser?”](#jsonparser-2)
> `optional` **jsonParser**: `"native"` | `"parse-json"` | `"secure-json-parse"`
JSON parser to use for parsing request bodies.
Options:
* `'native'`: Use the built-in JSON.parse (fastest, default)
* `'parse-json'`: Use the parse-json library for better error messages with minimal performance overhead (\~5% slower than native)
* `'secure-json-parse'`: Use secure-json-parse for protection against prototype pollution (20-30% slower than native)
Performance implications based on benchmarks:
* `native`: Fastest option, excellent for production
* `parse-json`: Nearly identical performance to native with better error messages, good for development
* `secure-json-parse`: Provides security at the cost of performance, use only for untrusted input
###### Default
[Section titled “Default”](#default-28)
```ts
'native'
```
###### logger?
[Section titled “logger?”](#logger-3)
> `optional` **logger**: `object`
Logger object.
###### logger.debug()?
[Section titled “logger.debug()?”](#loggerdebug-2)
> `optional` **debug**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-13)
###### msg
[Section titled “msg”](#msg-10)
`string`
###### props
[Section titled “props”](#props-10)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-16)
`void`
###### logger.error()?
[Section titled “logger.error()?”](#loggererror-2)
> `optional` **error**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-14)
###### msg
[Section titled “msg”](#msg-11)
`string`
###### props
[Section titled “props”](#props-11)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-17)
`void`
###### logger.fatal()?
[Section titled “logger.fatal()?”](#loggerfatal-2)
> `optional` **fatal**: (`msg`, `props`) => `void`
Something fatally went wrong and the application cannot continue.
###### Parameters
[Section titled “Parameters”](#parameters-15)
###### msg
[Section titled “msg”](#msg-12)
`string`
###### props
[Section titled “props”](#props-12)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-18)
`void`
###### logger.info()?
[Section titled “logger.info()?”](#loggerinfo-2)
> `optional` **info**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-16)
###### msg
[Section titled “msg”](#msg-13)
`string`
###### props
[Section titled “props”](#props-13)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-19)
`void`
###### logger.verbose?
[Section titled “logger.verbose?”](#loggerverbose-2)
> `optional` **verbose**: `boolean`
###### logger.warning()?
[Section titled “logger.warning()?”](#loggerwarning-2)
> `optional` **warning**: (`msg`, `props`) => `void`
###### Parameters
[Section titled “Parameters”](#parameters-17)
###### msg
[Section titled “msg”](#msg-14)
`string`
###### props
[Section titled “props”](#props-14)
`Record`<`string`, `any`>
###### Returns
[Section titled “Returns”](#returns-20)
`void`
###### middlewareTrackingMaxCapacity?
[Section titled “middlewareTrackingMaxCapacity?”](#middlewaretrackingmaxcapacity-2)
> `optional` **middlewareTrackingMaxCapacity**: `number`
Maximum number of middleware executions to store in the datastore. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-29)
```ts
10000
```
###### middlewareTrackingTTL?
[Section titled “middlewareTrackingTTL?”](#middlewaretrackingttl-2)
> `optional` **middlewareTrackingTTL**: `number`
Time-to-live for middleware tracking entries in milliseconds. Entries older than this will be cleaned up. Only applies when enableMiddlewareTracking is true.
###### Default
[Section titled “Default”](#default-30)
```ts
86400000 (1 day)
```
###### port?
[Section titled “port?”](#port-2)
> `optional` **port**: `number`
The port to be used for the server.
###### Default
[Section titled “Default”](#default-31)
```ts
3000
```
###### readTimeout?
[Section titled “readTimeout?”](#readtimeout-2)
> `optional` **readTimeout**: `number`
Timeout for reading the request body (milliseconds). Maps to Bun’s `idleTimeout`.
###### Default
[Section titled “Default”](#default-32)
```ts
30000
```
###### renderer?
[Section titled “renderer?”](#renderer-3)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX Rendering function.
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-4)
> `optional` **requestTimeout**: `number`
Timeout for processing the request (milliseconds). Maps to `server.timeout(req, seconds)`.
###### Default
[Section titled “Default”](#default-33)
```ts
0 (disabled)
```
###### reusePort?
[Section titled “reusePort?”](#reuseport-2)
> `optional` **reusePort**: `boolean`
Whether to reuse the port.
###### Default
[Section titled “Default”](#default-34)
```ts
false
```
###### serverFactory?
[Section titled “serverFactory?”](#serverfactory-2)
> `optional` **serverFactory**: [`ServerFactory`](/api/interfaces/serverfactory/)
Factory function to create the server instance. Defaults to Bun.serve.
###### validateStatusCodes?
[Section titled “validateStatusCodes?”](#validatestatuscodes-2)
> `optional` **validateStatusCodes**: `boolean`
Whether to validate response status codes.
###### Default
[Section titled “Default”](#default-35)
```ts
true
```
###### writeTimeout?
[Section titled “writeTimeout?”](#writetimeout-2)
> `optional` **writeTimeout**: `number`
Timeout for writing the response (milliseconds). Not currently supported by Bun.serve natively.
Experimental
This API should not be used in production and may be trimmed from a public release.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`ShokupanRouter.rootConfig`
## Methods
[Section titled “Methods”](#methods)
### \[$dispatch]\()
[Section titled “\[$dispatch\]()”](#dispatch)
> **\[$dispatch]**(`req`): `Promise`<`Response`>
Defined in: [src/shokupan.ts:288](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L288)
#### Parameters
[Section titled “Parameters”](#parameters-18)
##### req
[Section titled “req”](#req)
[`ShokupanRequest`](/api/type-aliases/shokupanrequest/)<`T`>
#### Returns
[Section titled “Returns”](#returns-21)
`Promise`<`Response`>
***
### add()
[Section titled “add()”](#add)
> **add**(`arg`): `Shokupan`<`T`>
Defined in: [src/router.ts:808](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L808)
Adds a route to the router.
#### Parameters
[Section titled “Parameters”](#parameters-19)
##### arg
[Section titled “arg”](#arg)
Route configuration object
###### controller?
[Section titled “controller?”](#controller)
`any`
Controller for the route
###### group?
[Section titled “group?”](#group-1)
`string`
Group for the route
###### handler
[Section titled “handler”](#handler)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`>
Route handler function
###### method
[Section titled “method”](#method)
[`Method`](/api/type-aliases/method/)
HTTP method
###### path
[Section titled “path”](#path)
`string`
URL path
###### regex?
[Section titled “regex?”](#regex)
`RegExp`
Custom regex for path matching
###### renderer?
[Section titled “renderer?”](#renderer-4)
[`JSXRenderer`](/api/type-aliases/jsxrenderer/)
JSX renderer for the route
###### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout-5)
`number`
Timeout for this route in milliseconds
###### spec?
[Section titled “spec?”](#spec)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
#### Returns
[Section titled “Returns”](#returns-22)
`Shokupan`<`T`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-10)
`ShokupanRouter.add`
***
### delete()
[Section titled “delete()”](#delete)
#### Call Signature
[Section titled “Call Signature”](#call-signature)
> **delete**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1079](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1079)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
###### Path
[Section titled “Path”](#path-1)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-20)
###### path
[Section titled “path”](#path-2)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-23)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-11)
`ShokupanRouter.delete`
#### Call Signature
[Section titled “Call Signature”](#call-signature-1)
> **delete**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1087](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1087)
Adds a DELETE route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
###### Path
[Section titled “Path”](#path-3)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-21)
###### path
[Section titled “path”](#path-4)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-1)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-1)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-24)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-12)
`ShokupanRouter.delete`
***
### fetch()
[Section titled “fetch()”](#fetch)
> **fetch**(`req`, `server?`): `Promise`<`Response`>
Defined in: [src/shokupan.ts:351](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L351)
Handles an incoming request (Bun.serve interface). This logic contains the middleware chain and router dispatch.
#### Parameters
[Section titled “Parameters”](#parameters-22)
##### req
[Section titled “req”](#req-1)
`Request`
The request to handle.
##### server?
[Section titled “server?”](#server)
`Server`
The server instance.
#### Returns
[Section titled “Returns”](#returns-25)
`Promise`<`Response`>
The response to send.
***
### find()
[Section titled “find()”](#find)
> **find**(`method`, `path`): `object`
Defined in: [src/router.ts:726](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L726)
Find a route matching the given method and path.
#### Parameters
[Section titled “Parameters”](#parameters-23)
##### method
[Section titled “method”](#method-1)
`string`
HTTP method
##### path
[Section titled “path”](#path-5)
`string`
Request path
#### Returns
[Section titled “Returns”](#returns-26)
`object`
Route handler and parameters if found, otherwise null
##### handler
[Section titled “handler”](#handler-1)
> **handler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`>
##### params
[Section titled “params”](#params)
> **params**: `Record`<`string`, `string`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-13)
`ShokupanRouter.find`
***
### generateApiSpec()
[Section titled “generateApiSpec()”](#generateapispec)
> **generateApiSpec**(`options`): `any`
Defined in: [src/router.ts:1306](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1306)
Generates an OpenAPI 3.1 Document by recursing through the router and its descendants. Now includes runtime analysis of handler functions to infer request/response types.
#### Parameters
[Section titled “Parameters”](#parameters-24)
##### options
[Section titled “options”](#options)
[`OpenAPIOptions`](/api/interfaces/openapioptions/) = `{}`
#### Returns
[Section titled “Returns”](#returns-27)
`any`
#### Inherited from
[Section titled “Inherited from”](#inherited-from-14)
`ShokupanRouter.generateApiSpec`
***
### get()
[Section titled “get()”](#get)
#### Call Signature
[Section titled “Call Signature”](#call-signature-2)
> **get**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1019](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1019)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-3)
###### Path
[Section titled “Path”](#path-6)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-25)
###### path
[Section titled “path”](#path-7)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-2)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-28)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-15)
`ShokupanRouter.get`
#### Call Signature
[Section titled “Call Signature”](#call-signature-3)
> **get**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1027](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1027)
Adds a GET route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-4)
###### Path
[Section titled “Path”](#path-8)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-26)
###### path
[Section titled “path”](#path-9)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-2)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-3)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-29)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-16)
`ShokupanRouter.get`
***
### getComponentRegistry()
[Section titled “getComponentRegistry()”](#getcomponentregistry)
> **getComponentRegistry**(): `object`
Defined in: [src/router.ts:110](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L110)
#### Returns
[Section titled “Returns”](#returns-30)
`object`
##### controllers
[Section titled “controllers”](#controllers)
> **controllers**: `object`\[]
##### metadata
[Section titled “metadata”](#metadata-1)
> **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
##### middleware
[Section titled “middleware”](#middleware-1)
> **middleware**: `object`\[]
##### routers
[Section titled “routers”](#routers)
> **routers**: `object`\[]
##### routes
[Section titled “routes”](#routes-1)
> **routes**: `object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-17)
`ShokupanRouter.getComponentRegistry`
***
### getRoutes()
[Section titled “getRoutes()”](#getroutes)
> **getRoutes**(): `object`\[]
Defined in: [src/router.ts:229](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L229)
Returns all routes attached to this router and its descendants.
#### Returns
[Section titled “Returns”](#returns-31)
`object`\[]
#### Inherited from
[Section titled “Inherited from”](#inherited-from-18)
`ShokupanRouter.getRoutes`
***
### guard()
[Section titled “guard()”](#guard)
#### Call Signature
[Section titled “Call Signature”](#call-signature-4)
> **guard**(`handler`): `void`
Defined in: [src/router.ts:1159](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1159)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-27)
###### handler
[Section titled “handler”](#handler-2)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-32)
`void`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-19)
`ShokupanRouter.guard`
#### Call Signature
[Section titled “Call Signature”](#call-signature-5)
> **guard**(`spec`, `handler`): `any`
Defined in: [src/router.ts:1167](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1167)
Adds a guard to the router that applies to all routes added **after** this point. Guards must return true or call `ctx.next()` to allow the request to continue.
##### Parameters
[Section titled “Parameters”](#parameters-28)
###### spec
[Section titled “spec”](#spec-3)
[`GuardAPISpec`](/api/type-aliases/guardapispec/)
OpenAPI specification for the guard
###### handler
[Section titled “handler”](#handler-3)
[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`>
Guard handler function
##### Returns
[Section titled “Returns”](#returns-33)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-20)
`ShokupanRouter.guard`
***
### head()
[Section titled “head()”](#head)
#### Call Signature
[Section titled “Call Signature”](#call-signature-6)
> **head**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1139](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1139)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-5)
###### Path
[Section titled “Path”](#path-10)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-29)
###### path
[Section titled “path”](#path-11)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-4)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-34)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-21)
`ShokupanRouter.head`
#### Call Signature
[Section titled “Call Signature”](#call-signature-7)
> **head**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1147](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1147)
Adds a HEAD route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-6)
###### Path
[Section titled “Path”](#path-12)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-30)
###### path
[Section titled “path”](#path-13)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-4)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-5)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-35)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-22)
`ShokupanRouter.head`
***
### internalRequest()
[Section titled “internalRequest()”](#internalrequest)
> **internalRequest**(`arg`): `Promise`<`Response`>
Defined in: [src/router.ts:261](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L261)
Makes an internal request through this router’s full routing pipeline. This is useful for calling other routes internally and supports streaming responses.
#### Parameters
[Section titled “Parameters”](#parameters-31)
##### arg
[Section titled “arg”](#arg-1)
`string` | { `body?`: `any`; `headers?`: [`HeadersInit`](/api/type-aliases/headersinit/); `method?`: [`Method`](/api/type-aliases/method/); `path`: `string`; }
#### Returns
[Section titled “Returns”](#returns-36)
`Promise`<`Response`>
The raw Response object.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-23)
`ShokupanRouter.internalRequest`
***
### listen()
[Section titled “listen()”](#listen)
> **listen**(`port?`): `Promise`<`Server` | `Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`>>
Defined in: [src/shokupan.ts:220](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L220)
Starts the application server.
#### Parameters
[Section titled “Parameters”](#parameters-32)
##### port?
[Section titled “port?”](#port-3)
`number`
The port to listen on. If not specified, the port from the configuration is used. If that is not specified, port 3000 is used.
#### Returns
[Section titled “Returns”](#returns-37)
`Promise`<`Server` | `Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`>>
The server instance.
***
### mount()
[Section titled “mount()”](#mount)
> **mount**(`prefix`, `controller`): `Shokupan`<`T`>
Defined in: [src/router.ts:205](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L205)
Mounts a controller instance to a path prefix.
Controller can be a convection router or an arbitrary class.
Routes are derived from method names:
* get(ctx) -> GET /prefix/
* getUsers(ctx) -> GET /prefix/users
* postCreate(ctx) -> POST /prefix/create
#### Parameters
[Section titled “Parameters”](#parameters-33)
##### prefix
[Section titled “prefix”](#prefix)
`string`
##### controller
[Section titled “controller”](#controller-1)
`Record`<`string`, `any`> | [`ShokupanController`](/api/type-aliases/shokupancontroller/) | `ShokupanRouter`<`T`> | `ShokupanRouter`<`Record`<`string`, `any`>> | [`ShokupanController`](/api/type-aliases/shokupancontroller/)<`T`>
#### Returns
[Section titled “Returns”](#returns-38)
`Shokupan`<`T`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-24)
`ShokupanRouter.mount`
***
### onSpecAvailable()
[Section titled “onSpecAvailable()”](#onspecavailable)
> **onSpecAvailable**(`callback`): `Shokupan`<`T`>
Defined in: [src/shokupan.ts:209](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L209)
Registers a callback to be executed when the OpenAPI spec is available. This happens after generateOpenApi() but before the server starts listening (or at least before it finishes startup if async).
#### Parameters
[Section titled “Parameters”](#parameters-34)
##### callback
[Section titled “callback”](#callback)
(`spec`) => `void` | `Promise`<`void`>
#### Returns
[Section titled “Returns”](#returns-39)
`Shokupan`<`T`>
***
### onStart()
[Section titled “onStart()”](#onstart)
> **onStart**(`callback`): `Shokupan`<`T`>
Defined in: [src/shokupan.ts:198](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L198)
Registers a callback to be executed before the server starts listening.
#### Parameters
[Section titled “Parameters”](#parameters-35)
##### callback
[Section titled “callback”](#callback-1)
() => `void` | `Promise`<`void`>
#### Returns
[Section titled “Returns”](#returns-40)
`Shokupan`<`T`>
***
### options()
[Section titled “options()”](#options-1)
#### Call Signature
[Section titled “Call Signature”](#call-signature-8)
> **options**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1119)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-7)
###### Path
[Section titled “Path”](#path-14)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-36)
###### path
[Section titled “path”](#path-15)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-6)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-41)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-25)
`ShokupanRouter.options`
#### Call Signature
[Section titled “Call Signature”](#call-signature-9)
> **options**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1127](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1127)
Adds a OPTIONS route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-8)
###### Path
[Section titled “Path”](#path-16)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-37)
###### path
[Section titled “path”](#path-17)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-5)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-7)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-42)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-26)
`ShokupanRouter.options`
***
### patch()
[Section titled “patch()”](#patch)
#### Call Signature
[Section titled “Call Signature”](#call-signature-10)
> **patch**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1099](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1099)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-9)
###### Path
[Section titled “Path”](#path-18)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-38)
###### path
[Section titled “path”](#path-19)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-8)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-43)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-27)
`ShokupanRouter.patch`
#### Call Signature
[Section titled “Call Signature”](#call-signature-11)
> **patch**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1107](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1107)
Adds a PATCH route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-10)
###### Path
[Section titled “Path”](#path-20)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-39)
###### path
[Section titled “path”](#path-21)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-6)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-9)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-44)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-28)
`ShokupanRouter.patch`
***
### post()
[Section titled “post()”](#post)
#### Call Signature
[Section titled “Call Signature”](#call-signature-12)
> **post**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1039](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1039)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-11)
###### Path
[Section titled “Path”](#path-22)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-40)
###### path
[Section titled “path”](#path-23)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-10)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-45)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-29)
`ShokupanRouter.post`
#### Call Signature
[Section titled “Call Signature”](#call-signature-13)
> **post**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1047](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1047)
Adds a POST route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-12)
###### Path
[Section titled “Path”](#path-24)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-41)
###### path
[Section titled “path”](#path-25)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-7)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-11)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-46)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-30)
`ShokupanRouter.post`
***
### put()
[Section titled “put()”](#put)
#### Call Signature
[Section titled “Call Signature”](#call-signature-14)
> **put**<`Path`>(`path`, …`handlers`): `any`
Defined in: [src/router.ts:1059](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1059)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-13)
###### Path
[Section titled “Path”](#path-26)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-42)
###### path
[Section titled “path”](#path-27)
`Path`
URL path
###### handlers
[Section titled “handlers”](#handlers-12)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-47)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-31)
`ShokupanRouter.put`
#### Call Signature
[Section titled “Call Signature”](#call-signature-15)
> **put**<`Path`>(`path`, `spec`, …`handlers`): `any`
Defined in: [src/router.ts:1067](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1067)
Adds a PUT route to the router.
##### Type Parameters
[Section titled “Type Parameters”](#type-parameters-14)
###### Path
[Section titled “Path”](#path-28)
`Path` *extends* `string`
##### Parameters
[Section titled “Parameters”](#parameters-43)
###### path
[Section titled “path”](#path-29)
`Path`
URL path
###### spec
[Section titled “spec”](#spec-8)
[`MethodAPISpec`](/api/type-aliases/methodapispec/)
OpenAPI specification for the route
###### handlers
[Section titled “handlers”](#handlers-13)
…[`ShokupanHandler`](/api/type-aliases/shokupanhandler/)<`T`, [`RouteParams`](/api/type-aliases/routeparams/)<`Path`>>\[]
Route handler functions
##### Returns
[Section titled “Returns”](#returns-48)
`any`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-32)
`ShokupanRouter.put`
***
### register()
[Section titled “register()”](#register)
> **register**(`plugin`, `options?`): `Shokupan`<`T`>
Defined in: [src/shokupan.ts:188](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L188)
Registers a plugin.
#### Parameters
[Section titled “Parameters”](#parameters-44)
##### plugin
[Section titled “plugin”](#plugin)
[`ShokupanPlugin`](/api/interfaces/shokupanplugin/)
##### options?
[Section titled “options?”](#options-2)
###### path?
[Section titled “path?”](#path-30)
`string`
#### Returns
[Section titled “Returns”](#returns-49)
`Shokupan`<`T`>
***
### runHooks()
[Section titled “runHooks()”](#runhooks)
> **runHooks**(`name`, …`args`): `Promise`<`void`>
Defined in: [src/router.ts:1339](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1339)
#### Parameters
[Section titled “Parameters”](#parameters-45)
##### name
[Section titled “name”](#name-1)
keyof [`ShokupanHooks`](/api/interfaces/shokupanhooks/)<`any`>
##### args
[Section titled “args”](#args)
…`any`\[]
#### Returns
[Section titled “Returns”](#returns-50)
`Promise`<`void`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-33)
`ShokupanRouter.runHooks`
***
### static()
[Section titled “static()”](#static)
> **static**(`uriPath`, `options`): `Shokupan`<`T`>
Defined in: [src/router.ts:1217](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/router.ts#L1217)
Statically serves a directory with standard options.
#### Parameters
[Section titled “Parameters”](#parameters-46)
##### uriPath
[Section titled “uriPath”](#uripath)
`string`
URL path prefix
##### options
[Section titled “options”](#options-3)
Configuration options or root directory string
`string` | [`StaticServeOptions`](/api/interfaces/staticserveoptions/)<`T`>
#### Returns
[Section titled “Returns”](#returns-51)
`Shokupan`<`T`>
#### Inherited from
[Section titled “Inherited from”](#inherited-from-34)
`ShokupanRouter.static`
***
### testRequest()
[Section titled “testRequest()”](#testrequest)
> **testRequest**(`options`): `Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
Defined in: [src/shokupan.ts:295](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L295)
Processes a request by wrapping the standard fetch method.
#### Parameters
[Section titled “Parameters”](#parameters-47)
##### options
[Section titled “options”](#options-4)
[`RequestOptions`](/api/interfaces/requestoptions/)
#### Returns
[Section titled “Returns”](#returns-52)
`Promise`<[`ProcessResult`](/api/interfaces/processresult/)>
#### Overrides
[Section titled “Overrides”](#overrides-1)
`ShokupanRouter.testRequest`
***
### use()
[Section titled “use()”](#use)
> **use**(`middleware`): `Shokupan`<`T`>
Defined in: [src/shokupan.ts:129](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/shokupan.ts#L129)
Adds middleware to the application.
#### Parameters
[Section titled “Parameters”](#parameters-48)
##### middleware
[Section titled “middleware”](#middleware-2)
[`Middleware`](/api/type-aliases/middleware/)
#### Returns
[Section titled “Returns”](#returns-53)
`Shokupan`<`T`>
# ShokupanContext
Defined in: [src/context.ts:108](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L108)
Shokupan Request Context
The context object passed to all middleware and route handlers. Provides access to request data, response helpers, and typed state management.
## Examples
[Section titled “Examples”](#examples)
```typescript
app.get('/hello', (ctx) => {
return ctx.json({ message: 'Hello' });
});
```
```typescript
interface AppState {
userId: string;
requestId: string;
}
const app = new Shokupan();
app.use((ctx, next) => {
ctx.state.requestId = crypto.randomUUID(); // ✓ Type-safe
return next();
});
```
```typescript
app.get('/users/:userId/posts/:postId', (ctx) => {
// ctx.params is automatically typed as { userId: string; postId: string }
const { userId, postId } = ctx.params;
return ctx.json({ userId, postId });
});
```
```typescript
interface RequestState {
userId: string;
permissions: string[];
}
const app = new Shokupan();
app.get('/admin/users/:userId', (ctx) => {
// Both typed!
const { userId } = ctx.params; // ✓ From path
const { permissions } = ctx.state; // ✓ From state
if (!permissions.includes('admin')) {
return ctx.json({ error: 'Forbidden' }, 403);
}
return ctx.json({ userId });
});
```
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### State
[Section titled “State”](#state)
`State` *extends* `Record`<`string`, `any`> = `Record`<`string`, `any`>
The shape of `ctx.state` for type-safe state access across middleware.
### Params
[Section titled “Params”](#params)
`Params` *extends* `Record`<`string`, `string`> = `Record`<`string`, `string`>
The shape of `ctx.params` based on the route path pattern.
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new ShokupanContext**<`State`, `Params`>(`request`, `server?`, `state?`, `app?`, `signal?`, `enableMiddlewareTracking?`): `ShokupanContext`<`State`, `Params`>
Defined in: [src/context.ts:146](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L146)
#### Parameters
[Section titled “Parameters”](#parameters)
##### request
[Section titled “request”](#request)
`any`
##### server?
[Section titled “server?”](#server)
`Server`
##### state?
[Section titled “state?”](#state-1)
`State`
##### app?
[Section titled “app?”](#app)
[`Shokupan`](/api/classes/shokupan/)
##### signal?
[Section titled “signal?”](#signal)
`AbortSignal`
##### enableMiddlewareTracking?
[Section titled “enableMiddlewareTracking?”](#enablemiddlewaretracking)
`boolean` = `false`
#### Returns
[Section titled “Returns”](#returns)
`ShokupanContext`<`State`, `Params`>
## Properties
[Section titled “Properties”](#properties)
### \_bodyParseError?
[Section titled “\_bodyParseError?”](#_bodyparseerror)
> `optional` **\_bodyParseError**: `Error`
Defined in: [src/context.ts:126](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L126)
***
### \_debug?
[Section titled “\_debug?”](#_debug)
> `optional` **\_debug**: [`DebugCollector`](/api/interfaces/debugcollector/)
Defined in: [src/context.ts:117](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L117)
***
### \_finalResponse?
[Section titled “\_finalResponse?”](#_finalresponse)
> `optional` **\_finalResponse**: `Response`
Defined in: [src/context.ts:118](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L118)
***
### \_rawBody?
[Section titled “\_rawBody?”](#_rawbody)
> `optional` **\_rawBody**: `string` | `ArrayBuffer` | `Uint8Array`<`ArrayBufferLike`>
Defined in: [src/context.ts:119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L119)
***
### \_routeMatched
[Section titled “\_routeMatched”](#_routematched)
> **\_routeMatched**: `boolean` = `false`
Defined in: [src/context.ts:128](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L128)
***
### app?
[Section titled “app?”](#app-1)
> `readonly` `optional` **app**: [`Shokupan`](/api/classes/shokupan/)
Defined in: [src/context.ts:150](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L150)
***
### handlerStack
[Section titled “handlerStack”](#handlerstack)
> **handlerStack**: [`HandlerStackItem`](/api/interfaces/handlerstackitem/)\[] = `[]`
Defined in: [src/context.ts:114](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L114)
***
### params
[Section titled “params”](#params-1)
> **params**: `Params`
Defined in: [src/context.ts:112](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L112)
***
### request
[Section titled “request”](#request-1)
> `readonly` **request**: `any`
Defined in: [src/context.ts:147](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L147)
***
### response
[Section titled “response”](#response)
> `readonly` **response**: [`ShokupanResponse`](/api/classes/shokupanresponse/)
Defined in: [src/context.ts:116](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L116)
***
### server?
[Section titled “server?”](#server-1)
> `readonly` `optional` **server**: `Server`
Defined in: [src/context.ts:148](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L148)
***
### session
[Section titled “session”](#session)
> **session**: [`SessionData`](/api/interfaces/sessiondata/) & `object`
Defined in: [src/plugins/middleware/session.ts:294](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L294)
#### Type Declaration
[Section titled “Type Declaration”](#type-declaration)
##### id
[Section titled “id”](#id)
> **id**: `string`
##### destroy()
[Section titled “destroy()”](#destroy)
> **destroy**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-1)
###### callback
[Section titled “callback”](#callback)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-1)
`void`
##### regenerate()
[Section titled “regenerate()”](#regenerate)
> **regenerate**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-2)
###### callback
[Section titled “callback”](#callback-1)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-2)
`void`
##### reload()
[Section titled “reload()”](#reload)
> **reload**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-3)
###### callback
[Section titled “callback”](#callback-2)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-3)
`void`
##### save()
[Section titled “save()”](#save)
> **save**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-4)
###### callback
[Section titled “callback”](#callback-3)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-4)
`void`
##### touch()
[Section titled “touch()”](#touch)
> **touch**(): `void`
###### Returns
[Section titled “Returns”](#returns-5)
`void`
***
### sessionID
[Section titled “sessionID”](#sessionid)
> **sessionID**: `string`
Defined in: [src/plugins/middleware/session.ts:295](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L295)
***
### sessionStore
[Section titled “sessionStore”](#sessionstore)
> **sessionStore**: [`Store`](/api/interfaces/store/)
Defined in: [src/plugins/middleware/session.ts:296](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L296)
***
### signal?
[Section titled “signal?”](#signal-1)
> `readonly` `optional` **signal**: `AbortSignal`
Defined in: [src/context.ts:151](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L151)
***
### state
[Section titled “state”](#state-2)
> **state**: `State`
Defined in: [src/context.ts:113](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L113)
## Accessors
[Section titled “Accessors”](#accessors)
### headers
[Section titled “headers”](#headers)
#### Get Signature
[Section titled “Get Signature”](#get-signature)
> **get** **headers**(): `any`
Defined in: [src/context.ts:299](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L299)
Request headers
##### Returns
[Section titled “Returns”](#returns-6)
`any`
***
### host
[Section titled “host”](#host)
#### Get Signature
[Section titled “Get Signature”](#get-signature-1)
> **get** **host**(): `string`
Defined in: [src/context.ts:273](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L273)
Request host (e.g. “localhost:3000”)
##### Returns
[Section titled “Returns”](#returns-7)
`string`
***
### hostname
[Section titled “hostname”](#hostname)
#### Get Signature
[Section titled “Get Signature”](#get-signature-2)
> **get** **hostname**(): `string`
Defined in: [src/context.ts:266](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L266)
Request hostname (e.g. “localhost”)
##### Returns
[Section titled “Returns”](#returns-8)
`string`
***
### ip
[Section titled “ip”](#ip)
#### Get Signature
[Section titled “Get Signature”](#get-signature-3)
> **get** **ip**(): `SocketAddress`
Defined in: [src/context.ts:261](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L261)
Client IP address
##### Returns
[Section titled “Returns”](#returns-9)
`SocketAddress`
***
### method
[Section titled “method”](#method)
#### Get Signature
[Section titled “Get Signature”](#get-signature-4)
> **get** **method**(): `any`
Defined in: [src/context.ts:188](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L188)
HTTP method
##### Returns
[Section titled “Returns”](#returns-10)
`any`
***
### origin
[Section titled “origin”](#origin)
#### Get Signature
[Section titled “Get Signature”](#get-signature-5)
> **get** **origin**(): `string`
Defined in: [src/context.ts:292](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L292)
Request origin (e.g. “”)
##### Returns
[Section titled “Returns”](#returns-11)
`string`
***
### path
[Section titled “path”](#path)
#### Get Signature
[Section titled “Get Signature”](#get-signature-6)
> **get** **path**(): `any`
Defined in: [src/context.ts:192](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L192)
Request path
##### Returns
[Section titled “Returns”](#returns-12)
`any`
***
### protocol
[Section titled “protocol”](#protocol)
#### Get Signature
[Section titled “Get Signature”](#get-signature-7)
> **get** **protocol**(): `string`
Defined in: [src/context.ts:280](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L280)
Request protocol (e.g. “http:”, “https:“)
##### Returns
[Section titled “Returns”](#returns-13)
`string`
***
### query
[Section titled “query”](#query)
#### Get Signature
[Section titled “Get Signature”](#get-signature-8)
> **get** **query**(): `Record`<`string`, `any`>
Defined in: [src/context.ts:227](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L227)
Request query params
##### Returns
[Section titled “Returns”](#returns-14)
`Record`<`string`, `any`>
***
### req
[Section titled “req”](#req)
#### Get Signature
[Section titled “Get Signature”](#get-signature-9)
> **get** **req**(): `any`
Defined in: [src/context.ts:184](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L184)
Base request
##### Returns
[Section titled “Returns”](#returns-15)
`any`
***
### res
[Section titled “res”](#res)
#### Get Signature
[Section titled “Get Signature”](#get-signature-10)
> **get** **res**(): [`ShokupanResponse`](/api/classes/shokupanresponse/)
Defined in: [src/context.ts:310](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L310)
Base response object
##### Returns
[Section titled “Returns”](#returns-16)
[`ShokupanResponse`](/api/classes/shokupanresponse/)
***
### secure
[Section titled “secure”](#secure)
#### Get Signature
[Section titled “Get Signature”](#get-signature-11)
> **get** **secure**(): `boolean`
Defined in: [src/context.ts:287](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L287)
Whether request is secure (https)
##### Returns
[Section titled “Returns”](#returns-17)
`boolean`
***
### url
[Section titled “url”](#url)
#### Get Signature
[Section titled “Get Signature”](#get-signature-12)
> **get** **url**(): `URL`
Defined in: [src/context.ts:172](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L172)
##### Returns
[Section titled “Returns”](#returns-18)
`URL`
## Methods
[Section titled “Methods”](#methods)
### body()
[Section titled “body()”](#body)
> **body**<`T`>(): `Promise`<`T`>
Defined in: [src/context.ts:406](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L406)
Read request body with caching to avoid double parsing. The body is only parsed once and cached for subsequent reads.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
##### T
[Section titled “T”](#t)
`T` = `any`
#### Returns
[Section titled “Returns”](#returns-19)
`Promise`<`T`>
***
### file()
[Section titled “file()”](#file)
> **file**(`path`, `fileOptions?`, `responseOptions?`): `Promise`<`Response`>
Defined in: [src/context.ts:663](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L663)
Respond with a file
#### Parameters
[Section titled “Parameters”](#parameters-5)
##### path
[Section titled “path”](#path-1)
`string`
##### fileOptions?
[Section titled “fileOptions?”](#fileoptions)
`BlobPropertyBag`
##### responseOptions?
[Section titled “responseOptions?”](#responseoptions)
`ResponseInit`
#### Returns
[Section titled “Returns”](#returns-20)
`Promise`<`Response`>
***
### get()
[Section titled “get()”](#get)
> **get**(`name`): `any`
Defined in: [src/context.ts:305](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L305)
Get a request header
#### Parameters
[Section titled “Parameters”](#parameters-6)
##### name
[Section titled “name”](#name)
`string`
Header name
#### Returns
[Section titled “Returns”](#returns-21)
`any`
***
### html()
[Section titled “html()”](#html)
> **html**(`html`, `status?`, `headers?`): `Response`
Defined in: [src/context.ts:612](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L612)
Respond with HTML content
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### html
[Section titled “html”](#html-1)
`string`
##### status?
[Section titled “status?”](#status)
`number`
##### headers?
[Section titled “headers?”](#headers-1)
[`HeadersInit`](/api/type-aliases/headersinit/)
#### Returns
[Section titled “Returns”](#returns-22)
`Response`
***
### json()
[Section titled “json()”](#json)
> **json**(`data`, `status?`, `headers?`): `Response`
Defined in: [src/context.ts:551](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L551)
Respond with a JSON object
#### Parameters
[Section titled “Parameters”](#parameters-8)
##### data
[Section titled “data”](#data)
`any`
##### status?
[Section titled “status?”](#status-1)
`number`
##### headers?
[Section titled “headers?”](#headers-2)
[`HeadersInit`](/api/type-aliases/headersinit/)
#### Returns
[Section titled “Returns”](#returns-23)
`Response`
***
### jsx()
[Section titled “jsx()”](#jsx)
> **jsx**(`element`, `args?`, `status?`, `headers?`): `Promise`<`Response`>
Defined in: [src/context.ts:695](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L695)
Render a JSX element
#### Parameters
[Section titled “Parameters”](#parameters-9)
##### element
[Section titled “element”](#element)
`any`
JSX Element
##### args?
[Section titled “args?”](#args)
`unknown`
##### status?
[Section titled “status?”](#status-2)
`number`
HTTP Status
##### headers?
[Section titled “headers?”](#headers-3)
[`HeadersInit`](/api/type-aliases/headersinit/)
HTTP Headers
#### Returns
[Section titled “Returns”](#returns-24)
`Promise`<`Response`>
***
### parseBody()
[Section titled “parseBody()”](#parsebody)
> **parseBody**(): `Promise`<`void`>
Defined in: [src/context.ts:463](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L463)
Pre-parse the request body before handler execution. This improves performance and enables Node.js compatibility for large payloads. Errors are deferred until the body is actually accessed in the handler.
#### Returns
[Section titled “Returns”](#returns-25)
`Promise`<`void`>
***
### redirect()
[Section titled “redirect()”](#redirect)
> **redirect**(`url`, `status`): `Response`
Defined in: [src/context.ts:633](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L633)
Respond with a redirect
#### Parameters
[Section titled “Parameters”](#parameters-10)
##### url
[Section titled “url”](#url-1)
`string`
##### status
[Section titled “status”](#status-3)
`number` = `302`
#### Returns
[Section titled “Returns”](#returns-26)
`Response`
***
### send()
[Section titled “send()”](#send)
> **send**(`body?`, `options?`): `Response`
Defined in: [src/context.ts:530](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L530)
Send a response
#### Parameters
[Section titled “Parameters”](#parameters-11)
##### body?
[Section titled “body?”](#body-1)
`BodyInit`
Response body
##### options?
[Section titled “options?”](#options)
`ResponseInit`
Response options
#### Returns
[Section titled “Returns”](#returns-27)
`Response`
Response
***
### set()
[Section titled “set()”](#set)
> **set**(`key`, `value`): `ShokupanContext`<`State`, `Params`>
Defined in: [src/context.ts:317](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L317)
Helper to set a header on the response
#### Parameters
[Section titled “Parameters”](#parameters-12)
##### key
[Section titled “key”](#key)
`string`
Header key
##### value
[Section titled “value”](#value)
`string`
Header value
#### Returns
[Section titled “Returns”](#returns-28)
`ShokupanContext`<`State`, `Params`>
***
### setCookie()
[Section titled “setCookie()”](#setcookie)
> **setCookie**(`name`, `value`, `options`): `ShokupanContext`<`State`, `Params`>
Defined in: [src/context.ts:328](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L328)
Set a cookie
#### Parameters
[Section titled “Parameters”](#parameters-13)
##### name
[Section titled “name”](#name-1)
`string`
Cookie name
##### value
[Section titled “value”](#value-1)
`string`
Cookie value
##### options
[Section titled “options”](#options-1)
[`CookieOptions`](/api/interfaces/cookieoptions/) = `{}`
Cookie options
#### Returns
[Section titled “Returns”](#returns-29)
`ShokupanContext`<`State`, `Params`>
***
### setRenderer()
[Section titled “setRenderer()”](#setrenderer)
> **setRenderer**(`renderer`): `void`
Defined in: [src/context.ts:142](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L142)
#### Parameters
[Section titled “Parameters”](#parameters-14)
##### renderer
[Section titled “renderer”](#renderer)
[`JSXRenderer`](/api/type-aliases/jsxrenderer/)
#### Returns
[Section titled “Returns”](#returns-30)
`void`
***
### status()
[Section titled “status()”](#status-4)
> **status**(`status`): `Response`
Defined in: [src/context.ts:649](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L649)
Respond with a status code DOES NOT CHAIN!
#### Parameters
[Section titled “Parameters”](#parameters-15)
##### status
[Section titled “status”](#status-5)
`number`
#### Returns
[Section titled “Returns”](#returns-31)
`Response`
***
### text()
[Section titled “text()”](#text)
> **text**(`data`, `status?`, `headers?`): `Response`
Defined in: [src/context.ts:582](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L582)
Respond with a text string
#### Parameters
[Section titled “Parameters”](#parameters-16)
##### data
[Section titled “data”](#data-1)
`string`
##### status?
[Section titled “status?”](#status-6)
`number`
##### headers?
[Section titled “headers?”](#headers-4)
[`HeadersInit`](/api/type-aliases/headersinit/)
#### Returns
[Section titled “Returns”](#returns-32)
`Response`
# ShokupanResponse
Defined in: [src/util/response.ts:6](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L6)
Custom response class to handle response state (headers, status) before the actual Response object is created.
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new ShokupanResponse**(): `ShokupanResponse`
#### Returns
[Section titled “Returns”](#returns)
`ShokupanResponse`
## Accessors
[Section titled “Accessors”](#accessors)
### hasPopulatedHeaders
[Section titled “hasPopulatedHeaders”](#haspopulatedheaders)
#### Get Signature
[Section titled “Get Signature”](#get-signature)
> **get** **hasPopulatedHeaders**(): `boolean`
Defined in: [src/util/response.ts:73](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L73)
Internal: check if headers have been initialized/modified
##### Returns
[Section titled “Returns”](#returns-1)
`boolean`
***
### headers
[Section titled “headers”](#headers)
#### Get Signature
[Section titled “Get Signature”](#get-signature-1)
> **get** **headers**(): `Headers`
Defined in: [src/util/response.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L13)
Get the current headers
##### Returns
[Section titled “Returns”](#returns-2)
`Headers`
***
### status
[Section titled “status”](#status)
#### Get Signature
[Section titled “Get Signature”](#get-signature-2)
> **get** **status**(): `number`
Defined in: [src/util/response.ts:21](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L21)
Get the current status code
##### Returns
[Section titled “Returns”](#returns-3)
`number`
#### Set Signature
[Section titled “Set Signature”](#set-signature)
> **set** **status**(`code`): `void`
Defined in: [src/util/response.ts:28](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L28)
Set the status code
##### Parameters
[Section titled “Parameters”](#parameters)
###### code
[Section titled “code”](#code)
`number`
##### Returns
[Section titled “Returns”](#returns-4)
`void`
## Methods
[Section titled “Methods”](#methods)
### append()
[Section titled “append()”](#append)
> **append**(`key`, `value`): `ShokupanResponse`
Defined in: [src/util/response.ts:48](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L48)
Append to a response header
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### key
[Section titled “key”](#key)
`string`
Header name
##### value
[Section titled “value”](#value)
`string`
Header value
#### Returns
[Section titled “Returns”](#returns-5)
`ShokupanResponse`
***
### get()
[Section titled “get()”](#get)
> **get**(`key`): `string`
Defined in: [src/util/response.ts:58](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L58)
Get a response header value
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### key
[Section titled “key”](#key-1)
`string`
Header name
#### Returns
[Section titled “Returns”](#returns-6)
`string`
***
### has()
[Section titled “has()”](#has)
> **has**(`key`): `boolean`
Defined in: [src/util/response.ts:66](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L66)
Check if a header exists
#### Parameters
[Section titled “Parameters”](#parameters-3)
##### key
[Section titled “key”](#key-2)
`string`
Header name
#### Returns
[Section titled “Returns”](#returns-7)
`boolean`
***
### set()
[Section titled “set()”](#set)
> **set**(`key`, `value`): `ShokupanResponse`
Defined in: [src/util/response.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/response.ts#L37)
Set a response header
#### Parameters
[Section titled “Parameters”](#parameters-4)
##### key
[Section titled “key”](#key-3)
`string`
Header name
##### value
[Section titled “value”](#value-1)
`string`
Header value
#### Returns
[Section titled “Returns”](#returns-8)
`ShokupanResponse`
# ValidationError
Defined in: [src/plugins/middleware/validation.ts:14](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L14)
## Extends
[Section titled “Extends”](#extends)
* `Error`
## Constructors
[Section titled “Constructors”](#constructors)
### Constructor
[Section titled “Constructor”](#constructor)
> **new ValidationError**(`errors`): `ValidationError`
Defined in: [src/plugins/middleware/validation.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L16)
#### Parameters
[Section titled “Parameters”](#parameters)
##### errors
[Section titled “errors”](#errors)
`any`\[]
#### Returns
[Section titled “Returns”](#returns)
`ValidationError`
#### Overrides
[Section titled “Overrides”](#overrides)
`Error.constructor`
## Properties
[Section titled “Properties”](#properties)
### cause?
[Section titled “cause?”](#cause)
> `optional` **cause**: `unknown`
Defined in: docs/node\_modules/typescript/lib/lib.es2022.error.d.ts:26
The cause of the error.
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`Error.cause`
***
### errors
[Section titled “errors”](#errors-1)
> **errors**: `any`\[]
Defined in: [src/plugins/middleware/validation.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L16)
***
### message
[Section titled “message”](#message)
> **message**: `string`
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1077
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`Error.message`
***
### name
[Section titled “name”](#name)
> **name**: `string`
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`Error.name`
***
### stack?
[Section titled “stack?”](#stack)
> `optional` **stack**: `string`
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1078
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`Error.stack`
***
### status
[Section titled “status”](#status)
> **status**: `number` = `400`
Defined in: [src/plugins/middleware/validation.ts:15](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L15)
***
### stackTraceLimit
[Section titled “stackTraceLimit”](#stacktracelimit)
> `static` **stackTraceLimit**: `number`
Defined in: node\_modules/@types/node/globals.d.ts:68
The `Error.stackTraceLimit` property specifies the number of stack frames collected by a stack trace (whether generated by `new Error().stack` or `Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes will affect any stack trace captured *after* the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will not capture any frames.
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`Error.stackTraceLimit`
## Methods
[Section titled “Methods”](#methods)
### captureStackTrace()
[Section titled “captureStackTrace()”](#capturestacktrace)
#### Call Signature
[Section titled “Call Signature”](#call-signature)
> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void`
Defined in: node\_modules/@types/node/globals.d.ts:52
Creates a `.stack` property on `targetObject`, which when accessed returns a string representing the location in the code at which `Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with `${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames above `constructorOpt`, including `constructorOpt`, will be omitted from the generated stack trace.
The `constructorOpt` argument is useful for hiding implementation details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
##### Parameters
[Section titled “Parameters”](#parameters-1)
###### targetObject
[Section titled “targetObject”](#targetobject)
`object`
###### constructorOpt?
[Section titled “constructorOpt?”](#constructoropt)
`Function`
##### Returns
[Section titled “Returns”](#returns-1)
`void`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`Error.captureStackTrace`
#### Call Signature
[Section titled “Call Signature”](#call-signature-1)
> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void`
Defined in: node\_modules/bun-types/globals.d.ts:985
Create .stack property on a target object
##### Parameters
[Section titled “Parameters”](#parameters-2)
###### targetObject
[Section titled “targetObject”](#targetobject-1)
`object`
###### constructorOpt?
[Section titled “constructorOpt?”](#constructoropt-1)
`Function`
##### Returns
[Section titled “Returns”](#returns-2)
`void`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`Error.captureStackTrace`
***
### isError()
[Section titled “isError()”](#iserror)
#### Call Signature
[Section titled “Call Signature”](#call-signature-2)
> `static` **isError**(`error`): `error is Error`
Defined in: docs/node\_modules/typescript/lib/lib.esnext.error.d.ts:23
Indicates whether the argument provided is a built-in Error instance or not.
##### Parameters
[Section titled “Parameters”](#parameters-3)
###### error
[Section titled “error”](#error)
`unknown`
##### Returns
[Section titled “Returns”](#returns-3)
`error is Error`
##### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`Error.isError`
#### Call Signature
[Section titled “Call Signature”](#call-signature-3)
> `static` **isError**(`value`): `value is Error`
Defined in: node\_modules/bun-types/globals.d.ts:980
Check if a value is an instance of Error
##### Parameters
[Section titled “Parameters”](#parameters-4)
###### value
[Section titled “value”](#value)
`unknown`
The value to check
##### Returns
[Section titled “Returns”](#returns-4)
`value is Error`
True if the value is an instance of Error, false otherwise
##### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`Error.isError`
***
### prepareStackTrace()
[Section titled “prepareStackTrace()”](#preparestacktrace)
> `static` **prepareStackTrace**(`err`, `stackTraces`): `any`
Defined in: node\_modules/@types/node/globals.d.ts:56
#### Parameters
[Section titled “Parameters”](#parameters-5)
##### err
[Section titled “err”](#err)
`Error`
##### stackTraces
[Section titled “stackTraces”](#stacktraces)
`CallSite`\[]
#### Returns
[Section titled “Returns”](#returns-5)
`any`
#### See
[Section titled “See”](#see)
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`Error.prepareStackTrace`
# RouteParamType
Defined in: [src/util/types.ts:116](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L116)
## Enumeration Members
[Section titled “Enumeration Members”](#enumeration-members)
### BODY
[Section titled “BODY”](#body)
> **BODY**: `"BODY"`
Defined in: [src/util/types.ts:117](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L117)
***
### CONTEXT
[Section titled “CONTEXT”](#context)
> **CONTEXT**: `"CONTEXT"`
Defined in: [src/util/types.ts:122](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L122)
***
### HEADER
[Section titled “HEADER”](#header)
> **HEADER**: `"HEADER"`
Defined in: [src/util/types.ts:120](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L120)
***
### PARAM
[Section titled “PARAM”](#param)
> **PARAM**: `"PARAM"`
Defined in: [src/util/types.ts:118](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L118)
***
### QUERY
[Section titled “QUERY”](#query)
> **QUERY**: `"QUERY"`
Defined in: [src/util/types.ts:119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L119)
***
### REQUEST
[Section titled “REQUEST”](#request)
> **REQUEST**: `"REQUEST"`
Defined in: [src/util/types.ts:121](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L121)
# compileValidators
> **compileValidators**(`spec`): `object`
Defined in: [src/plugins/middleware/openapi-validator.ts:127](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/openapi-validator.ts#L127)
## Parameters
[Section titled “Parameters”](#parameters)
### spec
[Section titled “spec”](#spec)
`any`
## Returns
[Section titled “Returns”](#returns)
`object`
### paths
[Section titled “paths”](#paths)
> **paths**: `Map`<`string`, { `paramNames`: `string`\[]; `regex`: `RegExp`; }>
### validators
[Section titled “validators”](#validators)
> **validators**: `ValidatorCache`
# compose
> **compose**(`middleware`): (`context`, `next?`) => `Promise`<`any`>
Defined in: [src/middleware.ts:10](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/middleware.ts#L10)
Composes a list of middleware into a single function. This is the onion model (Koa-style).
CRITICAL: This must build the chain ONCE, not rebuild it on every request.
## Parameters
[Section titled “Parameters”](#parameters)
### middleware
[Section titled “middleware”](#middleware)
[`Middleware`](/api/type-aliases/middleware/)\[]
## Returns
[Section titled “Returns”](#returns)
> (`context`, `next?`): `Promise`<`any`>
### Parameters
[Section titled “Parameters”](#parameters-1)
#### context
[Section titled “context”](#context)
[`ShokupanContext`](/api/classes/shokupancontext/)<`unknown`>
#### next?
[Section titled “next?”](#next)
[`NextFn`](/api/type-aliases/nextfn/)
### Returns
[Section titled “Returns”](#returns-1)
`Promise`<`any`>
# Compression
> **Compression**(`options`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/compression.ts:21](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/compression.ts#L21)
Compression middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`CompressionOptions`](/api/interfaces/compressionoptions/) = `{}`
Compression options
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# Controller
> **Controller**(`path`): (`target`) => `void`
Defined in: [src/util/decorators.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L9)
Class Decorator: Defines the base path for a controller.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Cors
> **Cors**(`options`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/cors.ts:36](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L36)
CORS middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`CorsOptions`](/api/interfaces/corsoptions/) = `{}`
CORS options
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# enableOpenApiValidation
> **enableOpenApiValidation**(`app`): `void`
Defined in: [src/plugins/middleware/openapi-validator.ts:234](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/openapi-validator.ts#L234)
Enables OpenAPI validation for the application. This registers the middleware and the hook to pre-compile validators when the spec is generated.
## Parameters
[Section titled “Parameters”](#parameters)
### app
[Section titled “app”](#app)
[`Shokupan`](/api/classes/shokupan/)<`any`>
The Shokupan application instance
## Returns
[Section titled “Returns”](#returns)
`void`
# Inject
> **Inject**(`token`): (`target`, `key`) => `void`
Defined in: [src/util/di.ts:47](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L47)
Property Decorator: Injects a service.
## Parameters
[Section titled “Parameters”](#parameters)
### token
[Section titled “token”](#token)
`any`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `key`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### key
[Section titled “key”](#key)
`string`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Injectable
> **Injectable**(): (`target`) => `void`
Defined in: [src/util/di.ts:38](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/di.ts#L38)
Decorator to mark a class as injectable (Service).
## Returns
[Section titled “Returns”](#returns)
> (`target`): `void`
### Parameters
[Section titled “Parameters”](#parameters)
#### target
[Section titled “target”](#target)
`any`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# openApiValidator
> **openApiValidator**(): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/openapi-validator.ts:26](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/openapi-validator.ts#L26)
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
# precompileValidators
> **precompileValidators**(`app`, `spec`): `void`
Defined in: [src/plugins/middleware/openapi-validator.ts:223](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/openapi-validator.ts#L223)
Pre-compiles validators for the application using the provided spec. Should be called when the spec is available.
## Parameters
[Section titled “Parameters”](#parameters)
### app
[Section titled “app”](#app)
`any`
### spec
[Section titled “spec”](#spec)
`any`
## Returns
[Section titled “Returns”](#returns)
`void`
# RateLimit
> **RateLimit**(`options`): (`target`, `propertyKey?`, `descriptor?`) => `void`
Defined in: [src/util/decorators.ts:160](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L160)
Decorator: Applies a rate limit to a class or method.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`RateLimitOptions`](/api/interfaces/ratelimitoptions/)
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey?`, `descriptor?`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey?
[Section titled “propertyKey?”](#propertykey)
`string`
#### descriptor?
[Section titled “descriptor?”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# RateLimitMiddleware
> **RateLimitMiddleware**(`options`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/rate-limit.ts:65](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L65)
Rate limit middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`RateLimitOptions`](/api/interfaces/ratelimitoptions/) = `{}`
Rate limit options
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# SecurityHeaders
> **SecurityHeaders**(`options`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/security-headers.ts:72](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L72)
Security headers middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`SecurityHeadersOptions`](/api/interfaces/securityheadersoptions/) = `{}`
Security headers options
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# Session
> **Session**(`options`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/session.ts:305](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L305)
Session middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
[`SessionOptions`](/api/interfaces/sessionoptions/)
Session options
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# Spec
> **Spec**(`spec`): (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:90](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L90)
Decorator: Overrides the OpenAPI specification for a route.
## Parameters
[Section titled “Parameters”](#parameters)
### spec
[Section titled “spec”](#spec)
[`MethodAPISpec`](/api/type-aliases/methodapispec/) | [`GuardAPISpec`](/api/type-aliases/guardapispec/)
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Use
> **Use**(…`middleware`): (`target`, `propertyKey?`, `descriptor?`) => `void`
Defined in: [src/util/decorators.ts:18](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L18)
Decorator: Applies middleware to a class or method.
## Parameters
[Section titled “Parameters”](#parameters)
### middleware
[Section titled “middleware”](#middleware)
…[`Middleware`](/api/type-aliases/middleware/)\[]
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey?`, `descriptor?`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey?
[Section titled “propertyKey?”](#propertykey)
`string`
#### descriptor?
[Section titled “descriptor?”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# useExpress
> **useExpress**(`expressMiddleware`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/express.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/express.ts#L7)
Adapter to use legacy Express middleware. NOTE: This provides a PARTIAL mock of req/res.
## Parameters
[Section titled “Parameters”](#parameters)
### expressMiddleware
[Section titled “expressMiddleware”](#expressmiddleware)
`any`
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
# valibot
> **valibot**(`schema`, `parser`): `object`
Defined in: [src/plugins/middleware/validation.ts:58](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L58)
## Parameters
[Section titled “Parameters”](#parameters)
### schema
[Section titled “schema”](#schema)
`any`
### parser
[Section titled “parser”](#parser)
`Function`
## Returns
[Section titled “Returns”](#returns)
`object`
### \_valibot
[Section titled “\_valibot”](#_valibot)
> **\_valibot**: `boolean` = `true`
### parser
[Section titled “parser”](#parser-1)
> **parser**: `Function`
### schema
[Section titled “schema”](#schema-1)
> **schema**: `any`
# validate
> **validate**(`config`): [`Middleware`](/api/type-aliases/middleware/)
Defined in: [src/plugins/middleware/validation.ts:179](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L179)
Validation middleware.
## Parameters
[Section titled “Parameters”](#parameters)
### config
[Section titled “config”](#config)
[`ValidationConfig`](/api/interfaces/validationconfig/)
Validation configuration
## Returns
[Section titled “Returns”](#returns)
[`Middleware`](/api/type-aliases/middleware/)
Middleware function
# AuthConfig
Defined in: [src/plugins/application/auth.ts:72](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L72)
## Properties
[Section titled “Properties”](#properties)
### cookieOptions?
[Section titled “cookieOptions?”](#cookieoptions)
> `optional` **cookieOptions**: `object`
Defined in: [src/plugins/application/auth.ts:84](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L84)
Cookie options
#### httpOnly?
[Section titled “httpOnly?”](#httponly)
> `optional` **httpOnly**: `boolean`
HTTP only
#### maxAge?
[Section titled “maxAge?”](#maxage)
> `optional` **maxAge**: `number`
Max age
#### path?
[Section titled “path?”](#path)
> `optional` **path**: `string`
Path
#### sameSite?
[Section titled “sameSite?”](#samesite)
> `optional` **sameSite**: `"Lax"` | `"Strict"` | `"None"`
Same site
#### secure?
[Section titled “secure?”](#secure)
> `optional` **secure**: `boolean`
Secure
***
### jwtExpiration?
[Section titled “jwtExpiration?”](#jwtexpiration)
> `optional` **jwtExpiration**: `string`
Defined in: [src/plugins/application/auth.ts:80](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L80)
JWT expiration
***
### jwtSecret
[Section titled “jwtSecret”](#jwtsecret)
> **jwtSecret**: `string` | `Uint8Array`<`ArrayBufferLike`>
Defined in: [src/plugins/application/auth.ts:76](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L76)
JWT secret
***
### onSuccess()?
[Section titled “onSuccess()?”](#onsuccess)
> `optional` **onSuccess**: (`user`, `ctx`) => `any`
Defined in: [src/plugins/application/auth.ts:109](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L109)
Success callback
#### Parameters
[Section titled “Parameters”](#parameters)
##### user
[Section titled “user”](#user)
[`AuthUser`](/api/interfaces/authuser/)
##### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)
#### Returns
[Section titled “Returns”](#returns)
`any`
***
### providers
[Section titled “providers”](#providers)
> **providers**: `object`
Defined in: [src/plugins/application/auth.ts:113](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L113)
Providers
#### Index Signature
[Section titled “Index Signature”](#index-signature)
\[`key`: `string`]: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### apple?
[Section titled “apple?”](#apple)
> `optional` **apple**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### auth0?
[Section titled “auth0?”](#auth0)
> `optional` **auth0**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### github?
[Section titled “github?”](#github)
> `optional` **github**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### google?
[Section titled “google?”](#google)
> `optional` **google**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### microsoft?
[Section titled “microsoft?”](#microsoft)
> `optional` **microsoft**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### oauth2?
[Section titled “oauth2?”](#oauth2)
> `optional` **oauth2**: [`ProviderConfig`](/api/interfaces/providerconfig/)
#### okta?
[Section titled “okta?”](#okta)
> `optional` **okta**: [`ProviderConfig`](/api/interfaces/providerconfig/)
# AuthUser
Defined in: [src/plugins/application/auth.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L16)
## Properties
[Section titled “Properties”](#properties)
### email?
[Section titled “email?”](#email)
> `optional` **email**: `string`
Defined in: [src/plugins/application/auth.ts:18](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L18)
***
### id
[Section titled “id”](#id)
> **id**: `string`
Defined in: [src/plugins/application/auth.ts:17](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L17)
***
### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
Defined in: [src/plugins/application/auth.ts:19](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L19)
***
### picture?
[Section titled “picture?”](#picture)
> `optional` **picture**: `string`
Defined in: [src/plugins/application/auth.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L20)
***
### provider
[Section titled “provider”](#provider)
> **provider**: `string`
Defined in: [src/plugins/application/auth.ts:21](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L21)
***
### raw?
[Section titled “raw?”](#raw)
> `optional` **raw**: `any`
Defined in: [src/plugins/application/auth.ts:22](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L22)
# ClusterOptions
Defined in: [src/plugins/application/cluster.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L7)
## Properties
[Section titled “Properties”](#properties)
### silent?
[Section titled “silent?”](#silent)
> `optional` **silent**: `boolean`
Defined in: [src/plugins/application/cluster.ts:19](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L19)
Whether to pipe stdout/stderr to the parent process.
#### Default
[Section titled “Default”](#default)
```ts
false
```
***
### sticky?
[Section titled “sticky?”](#sticky)
> `optional` **sticky**: `boolean`
Defined in: [src/plugins/application/cluster.ts:26](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L26)
Enable sticky sessions (useful for Socket.io). Currently only supported in Node.js runtime.
#### Default
[Section titled “Default”](#default-1)
```ts
false
```
***
### workers?
[Section titled “workers?”](#workers)
> `optional` **workers**: `number` | `"auto"`
Defined in: [src/plugins/application/cluster.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/cluster.ts#L13)
Number of workers to spawn. Set to -1 or ‘auto’ to spawn one worker per available CPU.
#### Default
[Section titled “Default”](#default-2)
```ts
'auto'
```
# CompressionOptions
Defined in: [src/plugins/middleware/compression.ts:5](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/compression.ts#L5)
## Properties
[Section titled “Properties”](#properties)
### allowedAlgorithms?
[Section titled “allowedAlgorithms?”](#allowedalgorithms)
> `optional` **allowedAlgorithms**: `string`\[]
Defined in: [src/plugins/middleware/compression.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/compression.ts#L13)
Allowed algorithms
***
### threshold?
[Section titled “threshold?”](#threshold)
> `optional` **threshold**: `number`
Defined in: [src/plugins/middleware/compression.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/compression.ts#L9)
Minimum byte size to compress
# CookieOptions
Defined in: [src/util/types.ts:97](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L97)
## Properties
[Section titled “Properties”](#properties)
### domain?
[Section titled “domain?”](#domain)
> `optional` **domain**: `string`
Defined in: [src/util/types.ts:102](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L102)
***
### expires?
[Section titled “expires?”](#expires)
> `optional` **expires**: `Date`
Defined in: [src/util/types.ts:99](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L99)
***
### httpOnly?
[Section titled “httpOnly?”](#httponly)
> `optional` **httpOnly**: `boolean`
Defined in: [src/util/types.ts:100](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L100)
***
### maxAge?
[Section titled “maxAge?”](#maxage)
> `optional` **maxAge**: `number`
Defined in: [src/util/types.ts:98](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L98)
***
### path?
[Section titled “path?”](#path)
> `optional` **path**: `string`
Defined in: [src/util/types.ts:103](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L103)
***
### priority?
[Section titled “priority?”](#priority)
> `optional` **priority**: `"low"` | `"medium"` | `"high"` | `"Low"` | `"Medium"` | `"High"`
Defined in: [src/util/types.ts:105](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L105)
***
### sameSite?
[Section titled “sameSite?”](#samesite)
> `optional` **sameSite**: `boolean` | `"lax"` | `"strict"` | `"none"` | `"Lax"` | `"Strict"` | `"None"`
Defined in: [src/util/types.ts:104](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L104)
***
### secure?
[Section titled “secure?”](#secure)
> `optional` **secure**: `boolean`
Defined in: [src/util/types.ts:101](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L101)
# CorsOptions
Defined in: [src/plugins/middleware/cors.ts:4](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L4)
## Properties
[Section titled “Properties”](#properties)
### allowedHeaders?
[Section titled “allowedHeaders?”](#allowedheaders)
> `optional` **allowedHeaders**: `string` | `string`\[]
Defined in: [src/plugins/middleware/cors.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L16)
HTTP headers to allow.
***
### credentials?
[Section titled “credentials?”](#credentials)
> `optional` **credentials**: `boolean`
Defined in: [src/plugins/middleware/cors.ts:24](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L24)
Whether to allow credentials.
***
### exposedHeaders?
[Section titled “exposedHeaders?”](#exposedheaders)
> `optional` **exposedHeaders**: `string` | `string`\[]
Defined in: [src/plugins/middleware/cors.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L20)
HTTP headers to expose.
***
### maxAge?
[Section titled “maxAge?”](#maxage)
> `optional` **maxAge**: `number`
Defined in: [src/plugins/middleware/cors.ts:28](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L28)
Maximum age of preflight request.
***
### methods?
[Section titled “methods?”](#methods)
> `optional` **methods**: `string` | `string`\[]
Defined in: [src/plugins/middleware/cors.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L12)
HTTP methods to allow.
***
### origin?
[Section titled “origin?”](#origin)
> `optional` **origin**: `string` | `string`\[] | (`ctx`) => `string` | `boolean`
Defined in: [src/plugins/middleware/cors.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/cors.ts#L8)
Origin to allow. Can be a string, array of strings, or function that returns a string.
# DebugCollector
Defined in: [src/context.ts:40](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L40)
## Methods
[Section titled “Methods”](#methods)
### getCurrentNode()
[Section titled “getCurrentNode()”](#getcurrentnode)
> **getCurrentNode**(): `string`
Defined in: [src/context.ts:44](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L44)
#### Returns
[Section titled “Returns”](#returns)
`string`
***
### setNode()
[Section titled “setNode()”](#setnode)
> **setNode**(`id`): `void`
Defined in: [src/context.ts:43](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L43)
#### Parameters
[Section titled “Parameters”](#parameters)
##### id
[Section titled “id”](#id)
`string`
#### Returns
[Section titled “Returns”](#returns-1)
`void`
***
### trackEdge()
[Section titled “trackEdge()”](#trackedge)
> **trackEdge**(`fromId`, `toId`): `void`
Defined in: [src/context.ts:42](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L42)
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### fromId
[Section titled “fromId”](#fromid)
`string`
##### toId
[Section titled “toId”](#toid)
`string`
#### Returns
[Section titled “Returns”](#returns-2)
`void`
***
### trackStep()
[Section titled “trackStep()”](#trackstep)
> **trackStep**(`id`, `type`, `duration`, `status`, `error?`): `void`
Defined in: [src/context.ts:41](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L41)
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### id
[Section titled “id”](#id-1)
`string`
##### type
[Section titled “type”](#type)
`string`
##### duration
[Section titled “duration”](#duration)
`number`
##### status
[Section titled “status”](#status)
`"success"` | `"error"`
##### error?
[Section titled “error?”](#error)
`any`
#### Returns
[Section titled “Returns”](#returns-3)
`void`
# HandlerStackItem
Defined in: [src/context.ts:31](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L31)
## Properties
[Section titled “Properties”](#properties)
### duration?
[Section titled “duration?”](#duration)
> `optional` **duration**: `number`
Defined in: [src/context.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L37)
***
### file
[Section titled “file”](#file)
> **file**: `string`
Defined in: [src/context.ts:33](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L33)
***
### line
[Section titled “line”](#line)
> **line**: `number`
Defined in: [src/context.ts:34](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L34)
***
### name
[Section titled “name”](#name)
> **name**: `string`
Defined in: [src/context.ts:32](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L32)
***
### startTime?
[Section titled “startTime?”](#starttime)
> `optional` **startTime**: `number`
Defined in: [src/context.ts:36](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L36)
***
### stateChanges?
[Section titled “stateChanges?”](#statechanges)
> `optional` **stateChanges**: `Record`<`string`, `any`>
Defined in: [src/context.ts:35](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/context.ts#L35)
# OpenAPIOptions
Defined in: [src/util/types.ts:74](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L74)
## Properties
[Section titled “Properties”](#properties)
### components?
[Section titled “components?”](#components)
> `optional` **components**: `any`
Defined in: [src/util/types.ts:77](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L77)
***
### defaultTag?
[Section titled “defaultTag?”](#defaulttag)
> `optional` **defaultTag**: `string`
Defined in: [src/util/types.ts:81](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L81)
***
### defaultTagGroup?
[Section titled “defaultTagGroup?”](#defaulttaggroup)
> `optional` **defaultTagGroup**: `string`
Defined in: [src/util/types.ts:80](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L80)
***
### externalDocs?
[Section titled “externalDocs?”](#externaldocs)
> `optional` **externalDocs**: `any`
Defined in: [src/util/types.ts:79](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L79)
***
### info?
[Section titled “info?”](#info)
> `optional` **info**: `any`
Defined in: [src/util/types.ts:75](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L75)
***
### servers?
[Section titled “servers?”](#servers)
> `optional` **servers**: `any`
Defined in: [src/util/types.ts:76](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L76)
***
### tags?
[Section titled “tags?”](#tags)
> `optional` **tags**: `any`
Defined in: [src/util/types.ts:78](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L78)
# ProcessResult
Defined in: [src/util/types.ts:412](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L412)
## Properties
[Section titled “Properties”](#properties)
### data
[Section titled “data”](#data)
> **data**: `any`
Defined in: [src/util/types.ts:415](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L415)
***
### headers
[Section titled “headers”](#headers)
> **headers**: `Record`<`string`, `string`>
Defined in: [src/util/types.ts:414](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L414)
***
### status
[Section titled “status”](#status)
> **status**: `number`
Defined in: [src/util/types.ts:413](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L413)
# ProviderConfig
Defined in: [src/plugins/application/auth.ts:25](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L25)
## Properties
[Section titled “Properties”](#properties)
### authUrl?
[Section titled “authUrl?”](#authurl)
> `optional` **authUrl**: `string`
Defined in: [src/plugins/application/auth.ts:61](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L61)
Auth URL (Generic OAuth2)
***
### clientId
[Section titled “clientId”](#clientid)
> **clientId**: `string`
Defined in: [src/plugins/application/auth.ts:29](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L29)
Client ID
***
### clientSecret
[Section titled “clientSecret”](#clientsecret)
> **clientSecret**: `string`
Defined in: [src/plugins/application/auth.ts:33](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L33)
Client secret
***
### domain?
[Section titled “domain?”](#domain)
> `optional` **domain**: `string`
Defined in: [src/plugins/application/auth.ts:49](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L49)
Domain (Auth0, Okta)
***
### keyId?
[Section titled “keyId?”](#keyid)
> `optional` **keyId**: `string`
Defined in: [src/plugins/application/auth.ts:57](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L57)
Key ID (Apple)
***
### redirectUri
[Section titled “redirectUri”](#redirecturi)
> **redirectUri**: `string`
Defined in: [src/plugins/application/auth.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L37)
Redirect URI
***
### scopes?
[Section titled “scopes?”](#scopes)
> `optional` **scopes**: `string`\[]
Defined in: [src/plugins/application/auth.ts:41](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L41)
Scopes
***
### teamId?
[Section titled “teamId?”](#teamid)
> `optional` **teamId**: `string`
Defined in: [src/plugins/application/auth.ts:53](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L53)
Team ID (Apple)
***
### tenantId?
[Section titled “tenantId?”](#tenantid)
> `optional` **tenantId**: `string`
Defined in: [src/plugins/application/auth.ts:45](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L45)
Tenant ID (MSFT AD)
***
### tokenUrl?
[Section titled “tokenUrl?”](#tokenurl)
> `optional` **tokenUrl**: `string`
Defined in: [src/plugins/application/auth.ts:65](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L65)
Token URL (Generic OAuth2)
***
### userInfoUrl?
[Section titled “userInfoUrl?”](#userinfourl)
> `optional` **userInfoUrl**: `string`
Defined in: [src/plugins/application/auth.ts:69](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/auth.ts#L69)
User info URL (Generic OAuth2)
# RateLimitOptions
Defined in: [src/plugins/middleware/rate-limit.ts:4](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L4)
## Properties
[Section titled “Properties”](#properties)
### headers?
[Section titled “headers?”](#headers)
> `optional` **headers**: `boolean`
Defined in: [src/plugins/middleware/rate-limit.ts:28](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L28)
Whether to include X-RateLimit headers in the response
***
### keyGenerator()?
[Section titled “keyGenerator()?”](#keygenerator)
> `optional` **keyGenerator**: (`ctx`) => `string`
Defined in: [src/plugins/middleware/rate-limit.ts:34](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L34)
Function to generate a unique key for each request This is used to identify the user or source of the request Defaults to the request’s ip address.
#### Parameters
[Section titled “Parameters”](#parameters)
##### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)
#### Returns
[Section titled “Returns”](#returns)
`string`
***
### limit?
[Section titled “limit?”](#limit)
> `optional` **limit**: `number`
Defined in: [src/plugins/middleware/rate-limit.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L16)
Alias for max
***
### max?
[Section titled “max?”](#max)
> `optional` **max**: `number`
Defined in: [src/plugins/middleware/rate-limit.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L12)
Maximum number of requests allowed in the window
***
### message?
[Section titled “message?”](#message)
> `optional` **message**: `string` | `object` | (`ctx`, `key`) => `string` | `object`
Defined in: [src/plugins/middleware/rate-limit.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L20)
Message to send when rate limited
***
### mode?
[Section titled “mode?”](#mode)
> `optional` **mode**: `"user"` | `"absolute"`
Defined in: [src/plugins/middleware/rate-limit.ts:48](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L48)
Mode to use for rate limiting
* user: Rate limit per user (generated key, defaults to ip address)
* absolute: Rate limit for all users
***
### onRateLimited()?
[Section titled “onRateLimited()?”](#onratelimited)
> `optional` **onRateLimited**: (`ctx`, `key`) => `void` | `Response` | `Promise`<`void` | `Response`>
Defined in: [src/plugins/middleware/rate-limit.ts:38](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L38)
Function to execute when a request is rate limited
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### ctx
[Section titled “ctx”](#ctx-1)
[`ShokupanContext`](/api/classes/shokupancontext/)
##### key
[Section titled “key”](#key)
`string`
#### Returns
[Section titled “Returns”](#returns-1)
`void` | `Response` | `Promise`<`void` | `Response`>
***
### skip()?
[Section titled “skip()?”](#skip)
> `optional` **skip**: (`ctx`) => `boolean`
Defined in: [src/plugins/middleware/rate-limit.ts:42](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L42)
Function to determine whether to skip rate limiting
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### ctx
[Section titled “ctx”](#ctx-2)
[`ShokupanContext`](/api/classes/shokupancontext/)
#### Returns
[Section titled “Returns”](#returns-2)
`boolean`
***
### statusCode?
[Section titled “statusCode?”](#statuscode)
> `optional` **statusCode**: `number`
Defined in: [src/plugins/middleware/rate-limit.ts:24](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L24)
Status code to send when rate limited
***
### trustedProxies?
[Section titled “trustedProxies?”](#trustedproxies)
> `optional` **trustedProxies**: `string`\[]
Defined in: [src/plugins/middleware/rate-limit.ts:52](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L52)
List of trusted proxy IPs
***
### windowMs?
[Section titled “windowMs?”](#windowms)
> `optional` **windowMs**: `number`
Defined in: [src/plugins/middleware/rate-limit.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/rate-limit.ts#L8)
Window in milliseconds
# RequestOptions
Defined in: [src/util/types.ts:403](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L403)
## Properties
[Section titled “Properties”](#properties)
### body?
[Section titled “body?”](#body)
> `optional` **body**: `any`
Defined in: [src/util/types.ts:408](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L408)
***
### headers?
[Section titled “headers?”](#headers)
> `optional` **headers**: `Record`<`string`, `string`>
Defined in: [src/util/types.ts:407](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L407)
***
### method?
[Section titled “method?”](#method)
> `optional` **method**: [`Method`](/api/type-aliases/method/)
Defined in: [src/util/types.ts:406](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L406)
***
### path?
[Section titled “path?”](#path)
> `optional` **path**: `string`
Defined in: [src/util/types.ts:404](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L404)
***
### query?
[Section titled “query?”](#query)
> `optional` **query**: `Record`<`string`, `string`>
Defined in: [src/util/types.ts:409](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L409)
***
### url?
[Section titled “url?”](#url)
> `optional` **url**: `string`
Defined in: [src/util/types.ts:405](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L405)
# RouteMetadata
Defined in: [src/util/types.ts:62](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L62)
## Properties
[Section titled “Properties”](#properties)
### file
[Section titled “file”](#file)
> **file**: `string`
Defined in: [src/util/types.ts:63](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L63)
***
### isBuiltin?
[Section titled “isBuiltin?”](#isbuiltin)
> `optional` **isBuiltin**: `boolean`
Defined in: [src/util/types.ts:66](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L66)
***
### line
[Section titled “line”](#line)
> **line**: `number`
Defined in: [src/util/types.ts:64](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L64)
***
### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
Defined in: [src/util/types.ts:65](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L65)
***
### pluginName?
[Section titled “pluginName?”](#pluginname)
> `optional` **pluginName**: `string`
Defined in: [src/util/types.ts:67](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L67)
# SecurityHeadersOptions
Defined in: [src/plugins/middleware/security-headers.ts:4](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L4)
## Properties
[Section titled “Properties”](#properties)
### contentSecurityPolicy?
[Section titled “contentSecurityPolicy?”](#contentsecuritypolicy)
> `optional` **contentSecurityPolicy**: `boolean` | `Record`<`string`, `any`>
Defined in: [src/plugins/middleware/security-headers.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L8)
Content Security Policy
***
### crossOriginEmbedderPolicy?
[Section titled “crossOriginEmbedderPolicy?”](#crossoriginembedderpolicy)
> `optional` **crossOriginEmbedderPolicy**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L12)
Cross-Origin Embedder Policy
***
### crossOriginOpenerPolicy?
[Section titled “crossOriginOpenerPolicy?”](#crossoriginopenerpolicy)
> `optional` **crossOriginOpenerPolicy**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L16)
Cross-Origin Opener Policy
***
### crossOriginResourcePolicy?
[Section titled “crossOriginResourcePolicy?”](#crossoriginresourcepolicy)
> `optional` **crossOriginResourcePolicy**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L20)
Cross-Origin Resource Policy
***
### dnsPrefetchControl?
[Section titled “dnsPrefetchControl?”](#dnsprefetchcontrol)
> `optional` **dnsPrefetchControl**: `boolean` | { `allow`: `boolean`; }
Defined in: [src/plugins/middleware/security-headers.ts:24](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L24)
DNS Prefetch Control
***
### expectCt?
[Section titled “expectCt?”](#expectct)
> `optional` **expectCt**: `boolean` | { `enforce?`: `boolean`; `maxAge?`: `number`; `reportUri?`: `string`; }
Defined in: [src/plugins/middleware/security-headers.ts:28](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L28)
Expect CT
***
### frameguard?
[Section titled “frameguard?”](#frameguard)
> `optional` **frameguard**: `boolean` | { `action`: `"deny"` | `"sameorigin"` | `"allow-from"`; `domain?`: `string`; }
Defined in: [src/plugins/middleware/security-headers.ts:32](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L32)
Frameguard
***
### hidePoweredBy?
[Section titled “hidePoweredBy?”](#hidepoweredby)
> `optional` **hidePoweredBy**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:36](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L36)
Hide Powered By
***
### hsts?
[Section titled “hsts?”](#hsts)
> `optional` **hsts**: `boolean` | { `includeSubDomains?`: `boolean`; `maxAge?`: `number`; `preload?`: `boolean`; }
Defined in: [src/plugins/middleware/security-headers.ts:40](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L40)
HTTP Strict Transport Security
***
### ieNoOpen?
[Section titled “ieNoOpen?”](#ienoopen)
> `optional` **ieNoOpen**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:44](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L44)
IE No Open
***
### noSniff?
[Section titled “noSniff?”](#nosniff)
> `optional` **noSniff**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:48](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L48)
No Sniff
***
### originAgentCluster?
[Section titled “originAgentCluster?”](#originagentcluster)
> `optional` **originAgentCluster**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:52](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L52)
Origin Agent Cluster
***
### permittedCrossDomainPolicies?
[Section titled “permittedCrossDomainPolicies?”](#permittedcrossdomainpolicies)
> `optional` **permittedCrossDomainPolicies**: `boolean` | { `permittedPolicies`: `"none"` | `"all"` | `"master-only"` | `"by-content-type"`; }
Defined in: [src/plugins/middleware/security-headers.ts:56](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L56)
Permitted Cross Domain Policies
***
### referrerPolicy?
[Section titled “referrerPolicy?”](#referrerpolicy)
> `optional` **referrerPolicy**: `boolean` | { `policy`: `string` | `string`\[]; }
Defined in: [src/plugins/middleware/security-headers.ts:60](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L60)
Referrer Policy
***
### xssFilter?
[Section titled “xssFilter?”](#xssfilter)
> `optional` **xssFilter**: `boolean`
Defined in: [src/plugins/middleware/security-headers.ts:64](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/security-headers.ts#L64)
X-XSS-Protection
# ServerFactory
Defined in: [src/util/types.ts:125](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L125)
> **ServerFactory**(`options`): `Server` | `Promise`<`Server`> | `Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`> | `Promise`<`Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`>>
Defined in: [src/util/types.ts:126](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L126)
## Parameters
[Section titled “Parameters”](#parameters)
### options
[Section titled “options”](#options)
`any`
## Returns
[Section titled “Returns”](#returns)
`Server` | `Promise`<`Server`> | `Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`> | `Promise`<`Server`<*typeof* `IncomingMessage`, *typeof* `ServerResponse`>>
# SessionContext
Defined in: [src/plugins/middleware/session.ts:278](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L278)
## Properties
[Section titled “Properties”](#properties)
### session
[Section titled “session”](#session)
> **session**: [`SessionData`](/api/interfaces/sessiondata/) & `object`
Defined in: [src/plugins/middleware/session.ts:279](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L279)
#### Type Declaration
[Section titled “Type Declaration”](#type-declaration)
##### id
[Section titled “id”](#id)
> **id**: `string`
##### destroy()
[Section titled “destroy()”](#destroy)
> **destroy**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters)
###### callback
[Section titled “callback”](#callback)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns)
`void`
##### regenerate()
[Section titled “regenerate()”](#regenerate)
> **regenerate**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-1)
###### callback
[Section titled “callback”](#callback-1)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-1)
`void`
##### reload()
[Section titled “reload()”](#reload)
> **reload**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-2)
###### callback
[Section titled “callback”](#callback-2)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-2)
`void`
##### save()
[Section titled “save()”](#save)
> **save**(`callback`): `void`
###### Parameters
[Section titled “Parameters”](#parameters-3)
###### callback
[Section titled “callback”](#callback-3)
(`err`) => `void`
###### Returns
[Section titled “Returns”](#returns-3)
`void`
##### touch()
[Section titled “touch()”](#touch)
> **touch**(): `void`
###### Returns
[Section titled “Returns”](#returns-4)
`void`
***
### sessionID
[Section titled “sessionID”](#sessionid)
> **sessionID**: `string`
Defined in: [src/plugins/middleware/session.ts:287](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L287)
***
### sessionStore
[Section titled “sessionStore”](#sessionstore)
> **sessionStore**: [`Store`](/api/interfaces/store/)
Defined in: [src/plugins/middleware/session.ts:288](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L288)
# SessionCookieOptions
Defined in: [src/plugins/middleware/session.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L13)
## Properties
[Section titled “Properties”](#properties)
### domain?
[Section titled “domain?”](#domain)
> `optional` **domain**: `string`
Defined in: [src/plugins/middleware/session.ts:37](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L37)
Domain of the session cookie.
***
### expires?
[Section titled “expires?”](#expires)
> `optional` **expires**: `Date`
Defined in: [src/plugins/middleware/session.ts:25](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L25)
Expiration date of the session cookie.
***
### httpOnly?
[Section titled “httpOnly?”](#httponly)
> `optional` **httpOnly**: `boolean`
Defined in: [src/plugins/middleware/session.ts:29](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L29)
Whether the session cookie should be HTTP-only.
***
### maxAge?
[Section titled “maxAge?”](#maxage)
> `optional` **maxAge**: `number`
Defined in: [src/plugins/middleware/session.ts:17](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L17)
Maximum age of the session cookie in milliseconds.
***
### path?
[Section titled “path?”](#path)
> `optional` **path**: `string`
Defined in: [src/plugins/middleware/session.ts:33](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L33)
Path of the session cookie.
***
### priority?
[Section titled “priority?”](#priority)
> `optional` **priority**: `"low"` | `"medium"` | `"high"`
Defined in: [src/plugins/middleware/session.ts:49](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L49)
Priority of the session cookie.
***
### sameSite?
[Section titled “sameSite?”](#samesite)
> `optional` **sameSite**: `boolean` | `"lax"` | `"strict"` | `"none"`
Defined in: [src/plugins/middleware/session.ts:45](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L45)
SameSite attribute of the session cookie.
***
### secure?
[Section titled “secure?”](#secure)
> `optional` **secure**: `boolean` | `"auto"`
Defined in: [src/plugins/middleware/session.ts:41](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L41)
Whether the session cookie should be secure.
***
### signed?
[Section titled “signed?”](#signed)
> `optional` **signed**: `boolean`
Defined in: [src/plugins/middleware/session.ts:21](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L21)
Whether the session cookie should be signed.
# SessionData
Defined in: [src/plugins/middleware/session.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L8)
## Indexable
[Section titled “Indexable”](#indexable)
\[`key`: `string`]: `any`
## Properties
[Section titled “Properties”](#properties)
### cookie
[Section titled “cookie”](#cookie)
> **cookie**: `Cookie`
Defined in: [src/plugins/middleware/session.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L9)
# SessionOptions
Defined in: [src/plugins/middleware/session.ts:52](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L52)
## Properties
[Section titled “Properties”](#properties)
### cookie?
[Section titled “cookie?”](#cookie)
> `optional` **cookie**: [`SessionCookieOptions`](/api/interfaces/sessioncookieoptions/)
Defined in: [src/plugins/middleware/session.ts:68](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L68)
Options for the session cookie.
***
### genid()?
[Section titled “genid()?”](#genid)
> `optional` **genid**: (`ctx`) => `string`
Defined in: [src/plugins/middleware/session.ts:72](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L72)
Function to generate a session ID.
#### Parameters
[Section titled “Parameters”](#parameters)
##### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)
#### Returns
[Section titled “Returns”](#returns)
`string`
***
### name?
[Section titled “name?”](#name)
> `optional` **name**: `string`
Defined in: [src/plugins/middleware/session.ts:60](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L60)
Name of the session cookie.
***
### resave?
[Section titled “resave?”](#resave)
> `optional` **resave**: `boolean`
Defined in: [src/plugins/middleware/session.ts:76](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L76)
Whether to force a session identifier cookie to be set on every response.
***
### rolling?
[Section titled “rolling?”](#rolling)
> `optional` **rolling**: `boolean`
Defined in: [src/plugins/middleware/session.ts:84](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L84)
Whether to update the session cookie on every request.
***
### saveUninitialized?
[Section titled “saveUninitialized?”](#saveuninitialized)
> `optional` **saveUninitialized**: `boolean`
Defined in: [src/plugins/middleware/session.ts:80](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L80)
Whether to save the session on every request.
***
### secret
[Section titled “secret”](#secret)
> **secret**: `string` | `string`\[]
Defined in: [src/plugins/middleware/session.ts:56](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L56)
Secret used to sign the session cookie.
***
### store?
[Section titled “store?”](#store)
> `optional` **store**: [`Store`](/api/interfaces/store/)
Defined in: [src/plugins/middleware/session.ts:64](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L64)
Store to use for session data.
***
### unset?
[Section titled “unset?”](#unset)
> `optional` **unset**: `"destroy"` | `"keep"`
Defined in: [src/plugins/middleware/session.ts:88](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L88)
Whether to destroy or keep the session on logout.
# ShokupanHooks
Defined in: [src/util/types.ts:84](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L84)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` = `any`
## Properties
[Section titled “Properties”](#properties)
### afterValidate()?
[Section titled “afterValidate()?”](#aftervalidate)
> `optional` **afterValidate**: (`ctx`, `data`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:91](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L91)
#### Parameters
[Section titled “Parameters”](#parameters)
##### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### data
[Section titled “data”](#data)
`any`
#### Returns
[Section titled “Returns”](#returns)
`void` | `Promise`<`void`>
***
### beforeValidate()?
[Section titled “beforeValidate()?”](#beforevalidate)
> `optional` **beforeValidate**: (`ctx`, `data`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:90](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L90)
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### ctx
[Section titled “ctx”](#ctx-1)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### data
[Section titled “data”](#data-1)
`any`
#### Returns
[Section titled “Returns”](#returns-1)
`void` | `Promise`<`void`>
***
### onError()?
[Section titled “onError()?”](#onerror)
> `optional` **onError**: (`ctx`, `error`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:85](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L85)
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### ctx
[Section titled “ctx”](#ctx-2)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### error
[Section titled “error”](#error)
`unknown`
#### Returns
[Section titled “Returns”](#returns-2)
`void` | `Promise`<`void`>
***
### onReadTimeout()?
[Section titled “onReadTimeout()?”](#onreadtimeout)
> `optional` **onReadTimeout**: (`ctx`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:92](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L92)
#### Parameters
[Section titled “Parameters”](#parameters-3)
##### ctx
[Section titled “ctx”](#ctx-3)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns-3)
`void` | `Promise`<`void`>
***
### onRequestEnd()?
[Section titled “onRequestEnd()?”](#onrequestend)
> `optional` **onRequestEnd**: (`ctx`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:87](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L87)
#### Parameters
[Section titled “Parameters”](#parameters-4)
##### ctx
[Section titled “ctx”](#ctx-4)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns-4)
`void` | `Promise`<`void`>
***
### onRequestStart()?
[Section titled “onRequestStart()?”](#onrequeststart)
> `optional` **onRequestStart**: (`ctx`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:86](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L86)
#### Parameters
[Section titled “Parameters”](#parameters-5)
##### ctx
[Section titled “ctx”](#ctx-5)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns-5)
`void` | `Promise`<`void`>
***
### onRequestTimeout()?
[Section titled “onRequestTimeout()?”](#onrequesttimeout)
> `optional` **onRequestTimeout**: (`ctx`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:94](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L94)
#### Parameters
[Section titled “Parameters”](#parameters-6)
##### ctx
[Section titled “ctx”](#ctx-6)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns-6)
`void` | `Promise`<`void`>
***
### onResponseEnd()?
[Section titled “onResponseEnd()?”](#onresponseend)
> `optional` **onResponseEnd**: (`ctx`, `response`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:89](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L89)
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### ctx
[Section titled “ctx”](#ctx-7)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### response
[Section titled “response”](#response)
`Response`
#### Returns
[Section titled “Returns”](#returns-7)
`void` | `Promise`<`void`>
***
### onResponseStart()?
[Section titled “onResponseStart()?”](#onresponsestart)
> `optional` **onResponseStart**: (`ctx`, `response`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:88](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L88)
#### Parameters
[Section titled “Parameters”](#parameters-8)
##### ctx
[Section titled “ctx”](#ctx-8)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### response
[Section titled “response”](#response-1)
`Response`
#### Returns
[Section titled “Returns”](#returns-8)
`void` | `Promise`<`void`>
***
### onWriteTimeout()?
[Section titled “onWriteTimeout()?”](#onwritetimeout)
> `optional` **onWriteTimeout**: (`ctx`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:93](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L93)
#### Parameters
[Section titled “Parameters”](#parameters-9)
##### ctx
[Section titled “ctx”](#ctx-9)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns-9)
`void` | `Promise`<`void`>
# ShokupanPlugin
Defined in: [src/util/types.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L13)
## Properties
[Section titled “Properties”](#properties)
### onInit()
[Section titled “onInit()”](#oninit)
> **onInit**: (`app`, `options?`) => `void` | `Promise`<`void`>
Defined in: [src/util/types.ts:14](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L14)
#### Parameters
[Section titled “Parameters”](#parameters)
##### app
[Section titled “app”](#app)
`any`
##### options?
[Section titled “options?”](#options)
[`ShokupanPluginOptions`](/api/interfaces/shokupanpluginoptions/)
#### Returns
[Section titled “Returns”](#returns)
`void` | `Promise`<`void`>
# ShokupanPluginOptions
Defined in: [src/util/types.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L9)
## Properties
[Section titled “Properties”](#properties)
### path?
[Section titled “path?”](#path)
> `optional` **path**: `string`
Defined in: [src/util/types.ts:10](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L10)
# StaticServeHooks
Defined in: [src/util/types.ts:422](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L422)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` *extends* `Record`<`string`, `any`>
## Properties
[Section titled “Properties”](#properties)
### onRequest()?
[Section titled “onRequest()?”](#onrequest)
> `optional` **onRequest**: (`ctx`) => `void` | `Response` | `Promise`<`void` | `Response`>
Defined in: [src/util/types.ts:423](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L423)
#### Parameters
[Section titled “Parameters”](#parameters)
##### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
#### Returns
[Section titled “Returns”](#returns)
`void` | `Response` | `Promise`<`void` | `Response`>
***
### onResponse()?
[Section titled “onResponse()?”](#onresponse)
> `optional` **onResponse**: (`ctx`, `response`) => `Response` | `Promise`<`Response`>
Defined in: [src/util/types.ts:424](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L424)
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### ctx
[Section titled “ctx”](#ctx-1)
[`ShokupanContext`](/api/classes/shokupancontext/)<`T`>
##### response
[Section titled “response”](#response)
`Response`
#### Returns
[Section titled “Returns”](#returns-1)
`Response` | `Promise`<`Response`>
# StaticServeOptions
Defined in: [src/util/types.ts:427](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L427)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` *extends* `Record`<`string`, `any`>
## Properties
[Section titled “Properties”](#properties)
### dotfiles?
[Section titled “dotfiles?”](#dotfiles)
> `optional` **dotfiles**: `"allow"` | `"deny"` | `"ignore"`
Defined in: [src/util/types.ts:458](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L458)
How to treat dotfiles (files starting with .) ‘allow’: Serve them ‘deny’: Return 403 ‘ignore’: Return 404
#### Default
[Section titled “Default”](#default)
```ts
'ignore'
```
***
### exclude?
[Section titled “exclude?”](#exclude)
> `optional` **exclude**: (`string` | `RegExp`)\[]
Defined in: [src/util/types.ts:462](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L462)
Regex or glob patterns to exclude
***
### extensions?
[Section titled “extensions?”](#extensions)
> `optional` **extensions**: `string`\[]
Defined in: [src/util/types.ts:467](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L467)
Try to append these extensions to the path if the file is not found. e.g. \[‘html’, ‘htm’]
***
### hooks?
[Section titled “hooks?”](#hooks)
> `optional` **hooks**: [`StaticServeHooks`](/api/interfaces/staticservehooks/)<`T`>
Defined in: [src/util/types.ts:450](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L450)
Hooks to intercept requests/responses.
***
### index?
[Section titled “index?”](#index)
> `optional` **index**: `string` | `string`\[]
Defined in: [src/util/types.ts:446](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L446)
Index file(s) to look for when a directory is requested.
#### Default
[Section titled “Default”](#default-1)
```ts
['index.html', 'index.htm']
```
***
### listDirectory?
[Section titled “listDirectory?”](#listdirectory)
> `optional` **listDirectory**: `boolean`
Defined in: [src/util/types.ts:441](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L441)
Whether to list directory contents if no index file is found.
Security Note: Directory listing is disabled by default to prevent information disclosure. Enable this only if you specifically need it and understand the security implications.
#### Default
[Section titled “Default”](#default-2)
```ts
false
```
***
### openapi?
[Section titled “openapi?”](#openapi)
> `optional` **openapi**: [`MethodAPISpec`](/api/type-aliases/methodapispec/)
Defined in: [src/util/types.ts:471](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L471)
OpenAPI specification for the static route.
***
### root?
[Section titled “root?”](#root)
> `optional` **root**: `string`
Defined in: [src/util/types.ts:432](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L432)
Root directory to serve files from. Can be an absolute path or relative to the CWD.
# Store
Defined in: [src/plugins/middleware/session.ts:91](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L91)
## Extends
[Section titled “Extends”](#extends)
* `EventEmitter`
## Methods
[Section titled “Methods”](#methods)
### \[captureRejectionSymbol]\()?
[Section titled “\[captureRejectionSymbol\]()?”](#capturerejectionsymbol)
> `optional` **\[captureRejectionSymbol]**<`K`>(`error`, `event`, …`args`): `void`
Defined in: node\_modules/@types/node/events.d.ts:136
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters)
##### K
[Section titled “K”](#k)
`K`
#### Parameters
[Section titled “Parameters”](#parameters)
##### error
[Section titled “error”](#error)
`Error`
##### event
[Section titled “event”](#event)
`string` | `symbol`
##### args
[Section titled “args”](#args)
…`AnyRest`
#### Returns
[Section titled “Returns”](#returns)
`void`
#### Inherited from
[Section titled “Inherited from”](#inherited-from)
`EventEmitter.[captureRejectionSymbol]`
***
### addListener()
[Section titled “addListener()”](#addlistener)
> **addListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:596
Alias for `emitter.on(eventName, listener)`.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-1)
##### K
[Section titled “K”](#k-1)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-1)
##### eventName
[Section titled “eventName”](#eventname)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-1)
`this`
#### Since
[Section titled “Since”](#since)
v0.1.26
#### Inherited from
[Section titled “Inherited from”](#inherited-from-1)
`EventEmitter.addListener`
***
### all()?
[Section titled “all()?”](#all)
> `optional` **all**(`callback`): `void`
Defined in: [src/plugins/middleware/session.ts:111](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L111)
Retrieves all sessions.
#### Parameters
[Section titled “Parameters”](#parameters-2)
##### callback
[Section titled “callback”](#callback)
(`err`, `obj?`) => `void`
#### Returns
[Section titled “Returns”](#returns-2)
`void`
***
### clear()?
[Section titled “clear()?”](#clear)
> `optional` **clear**(`callback?`): `void`
Defined in: [src/plugins/middleware/session.ts:119](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L119)
Clears all sessions.
#### Parameters
[Section titled “Parameters”](#parameters-3)
##### callback?
[Section titled “callback?”](#callback-1)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-3)
`void`
***
### createSession()?
[Section titled “createSession()?”](#createsession)
> `optional` **createSession**(`req`, `session`): [`SessionData`](/api/interfaces/sessiondata/)
Defined in: [src/plugins/middleware/session.ts:127](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L127)
Creates a session.
#### Parameters
[Section titled “Parameters”](#parameters-4)
##### req
[Section titled “req”](#req)
`any`
##### session
[Section titled “session”](#session)
[`SessionData`](/api/interfaces/sessiondata/)
#### Returns
[Section titled “Returns”](#returns-4)
[`SessionData`](/api/interfaces/sessiondata/)
***
### destroy()
[Section titled “destroy()”](#destroy)
> **destroy**(`sid`, `callback?`): `void`
Defined in: [src/plugins/middleware/session.ts:103](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L103)
Destroys a session.
#### Parameters
[Section titled “Parameters”](#parameters-5)
##### sid
[Section titled “sid”](#sid)
`string`
##### callback?
[Section titled “callback?”](#callback-2)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-5)
`void`
***
### emit()
[Section titled “emit()”](#emit)
> **emit**<`K`>(`eventName`, …`args`): `boolean`
Defined in: node\_modules/@types/node/events.d.ts:858
Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments to each.
Returns `true` if the event had listeners, `false` otherwise.
```js
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-2)
##### K
[Section titled “K”](#k-2)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-6)
##### eventName
[Section titled “eventName”](#eventname-1)
`string` | `symbol`
##### args
[Section titled “args”](#args-1)
…`AnyRest`
#### Returns
[Section titled “Returns”](#returns-6)
`boolean`
#### Since
[Section titled “Since”](#since-1)
v0.1.26
#### Inherited from
[Section titled “Inherited from”](#inherited-from-2)
`EventEmitter.emit`
***
### eventNames()
[Section titled “eventNames()”](#eventnames)
> **eventNames**(): (`string` | `symbol`)\[]
Defined in: node\_modules/@types/node/events.d.ts:921
Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or `Symbol`s.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
```
#### Returns
[Section titled “Returns”](#returns-7)
(`string` | `symbol`)\[]
#### Since
[Section titled “Since”](#since-2)
v6.0.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-3)
`EventEmitter.eventNames`
***
### get()
[Section titled “get()”](#get)
> **get**(`sid`, `callback`): `void`
Defined in: [src/plugins/middleware/session.ts:95](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L95)
Retrieves a session by ID.
#### Parameters
[Section titled “Parameters”](#parameters-7)
##### sid
[Section titled “sid”](#sid-1)
`string`
##### callback
[Section titled “callback”](#callback-3)
(`err`, `session?`) => `void`
#### Returns
[Section titled “Returns”](#returns-8)
`void`
***
### getMaxListeners()
[Section titled “getMaxListeners()”](#getmaxlisteners)
> **getMaxListeners**(): `number`
Defined in: node\_modules/@types/node/events.d.ts:773
Returns the current max listener value for the `EventEmitter` which is either set by `emitter.setMaxListeners(n)` or defaults to [EventEmitter.defaultMaxListeners](/api/classes/memorystore/#defaultmaxlisteners).
#### Returns
[Section titled “Returns”](#returns-9)
`number`
#### Since
[Section titled “Since”](#since-3)
v1.0.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-4)
`EventEmitter.getMaxListeners`
***
### length()?
[Section titled “length()?”](#length)
> `optional` **length**(`callback`): `void`
Defined in: [src/plugins/middleware/session.ts:115](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L115)
Retrieves the number of sessions.
#### Parameters
[Section titled “Parameters”](#parameters-8)
##### callback
[Section titled “callback”](#callback-4)
(`err`, `length?`) => `void`
#### Returns
[Section titled “Returns”](#returns-10)
`void`
***
### listenerCount()
[Section titled “listenerCount()”](#listenercount)
> **listenerCount**<`K`>(`eventName`, `listener?`): `number`
Defined in: node\_modules/@types/node/events.d.ts:867
Returns the number of listeners listening for the event named `eventName`. If `listener` is provided, it will return how many times the listener is found in the list of the listeners of the event.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-3)
##### K
[Section titled “K”](#k-3)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-9)
##### eventName
[Section titled “eventName”](#eventname-2)
The name of the event being listened for
`string` | `symbol`
##### listener?
[Section titled “listener?”](#listener-1)
`Function`
The event handler function
#### Returns
[Section titled “Returns”](#returns-11)
`number`
#### Since
[Section titled “Since”](#since-4)
v3.2.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-5)
`EventEmitter.listenerCount`
***
### listeners()
[Section titled “listeners()”](#listeners)
> **listeners**<`K`>(`eventName`): `Function`\[]
Defined in: node\_modules/@types/node/events.d.ts:786
Returns a copy of the array of listeners for the event named `eventName`.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-4)
##### K
[Section titled “K”](#k-4)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-10)
##### eventName
[Section titled “eventName”](#eventname-3)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-12)
`Function`\[]
#### Since
[Section titled “Since”](#since-5)
v0.1.26
#### Inherited from
[Section titled “Inherited from”](#inherited-from-6)
`EventEmitter.listeners`
***
### load()?
[Section titled “load()?”](#load)
> `optional` **load**(`sid`, `fn`): `void`
Defined in: [src/plugins/middleware/session.ts:123](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L123)
Loads a session.
#### Parameters
[Section titled “Parameters”](#parameters-11)
##### sid
[Section titled “sid”](#sid-2)
`string`
##### fn
[Section titled “fn”](#fn)
(`err`, `session?`) => `void`
#### Returns
[Section titled “Returns”](#returns-13)
`void`
***
### off()
[Section titled “off()”](#off)
> **off**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:746
Alias for `emitter.removeListener()`.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-5)
##### K
[Section titled “K”](#k-5)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-12)
##### eventName
[Section titled “eventName”](#eventname-4)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-2)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-14)
`this`
#### Since
[Section titled “Since”](#since-6)
v10.0.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-7)
`EventEmitter.off`
***
### on()
[Section titled “on()”](#on)
> **on**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:628
Adds the `listener` function to the end of the listeners array for the event named `eventName`. No checks are made to see if the `listener` has already been added. Multiple calls passing the same combination of `eventName` and `listener` will result in the `listener` being added, and called, multiple times.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-6)
##### K
[Section titled “K”](#k-6)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-13)
##### eventName
[Section titled “eventName”](#eventname-5)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-3)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-15)
`this`
#### Since
[Section titled “Since”](#since-7)
v0.1.101
#### Inherited from
[Section titled “Inherited from”](#inherited-from-8)
`EventEmitter.on`
***
### once()
[Section titled “once()”](#once)
> **once**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:658
Adds a **one-time** `listener` function for the event named `eventName`. The next time `eventName` is triggered, this listener is removed and then invoked.
```js
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-7)
##### K
[Section titled “K”](#k-7)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-14)
##### eventName
[Section titled “eventName”](#eventname-6)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-4)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-16)
`this`
#### Since
[Section titled “Since”](#since-8)
v0.3.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-9)
`EventEmitter.once`
***
### prependListener()
[Section titled “prependListener()”](#prependlistener)
> **prependListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:885
Adds the `listener` function to the *beginning* of the listeners array for the event named `eventName`. No checks are made to see if the `listener` has already been added. Multiple calls passing the same combination of `eventName` and `listener` will result in the `listener` being added, and called, multiple times.
```js
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-8)
##### K
[Section titled “K”](#k-8)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-15)
##### eventName
[Section titled “eventName”](#eventname-7)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-5)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-17)
`this`
#### Since
[Section titled “Since”](#since-9)
v6.0.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-10)
`EventEmitter.prependListener`
***
### prependOnceListener()
[Section titled “prependOnceListener()”](#prependoncelistener)
> **prependOnceListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:901
Adds a **one-time**`listener` function for the event named `eventName` to the *beginning* of the listeners array. The next time `eventName` is triggered, this listener is removed, and then invoked.
```js
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-9)
##### K
[Section titled “K”](#k-9)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-16)
##### eventName
[Section titled “eventName”](#eventname-8)
The name of the event.
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-6)
(…`args`) => `void`
The callback function
#### Returns
[Section titled “Returns”](#returns-18)
`this`
#### Since
[Section titled “Since”](#since-10)
v6.0.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-11)
`EventEmitter.prependOnceListener`
***
### rawListeners()
[Section titled “rawListeners()”](#rawlisteners)
> **rawListeners**<`K`>(`eventName`): `Function`\[]
Defined in: node\_modules/@types/node/events.d.ts:817
Returns a copy of the array of listeners for the event named `eventName`, including any wrappers (such as those created by `.once()`).
```js
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
```
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-10)
##### K
[Section titled “K”](#k-10)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-17)
##### eventName
[Section titled “eventName”](#eventname-9)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-19)
`Function`\[]
#### Since
[Section titled “Since”](#since-11)
v9.4.0
#### Inherited from
[Section titled “Inherited from”](#inherited-from-12)
`EventEmitter.rawListeners`
***
### removeAllListeners()
[Section titled “removeAllListeners()”](#removealllisteners)
> **removeAllListeners**(`eventName?`): `this`
Defined in: node\_modules/@types/node/events.d.ts:757
Removes all listeners, or those of the specified `eventName`.
It is bad practice to remove listeners added elsewhere in the code, particularly when the `EventEmitter` instance was created by some other component or module (e.g. sockets or file streams).
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Parameters
[Section titled “Parameters”](#parameters-18)
##### eventName?
[Section titled “eventName?”](#eventname-10)
`string` | `symbol`
#### Returns
[Section titled “Returns”](#returns-20)
`this`
#### Since
[Section titled “Since”](#since-12)
v0.1.26
#### Inherited from
[Section titled “Inherited from”](#inherited-from-13)
`EventEmitter.removeAllListeners`
***
### removeListener()
[Section titled “removeListener()”](#removelistener)
> **removeListener**<`K`>(`eventName`, `listener`): `this`
Defined in: node\_modules/@types/node/events.d.ts:741
Removes the specified `listener` from the listener array for the event named `eventName`.
```js
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
```
`removeListener()` will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the listener array for the specified `eventName`, then `removeListener()` must be called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls *after* emitting and *before* the last listener finishes execution will not remove them from`emit()` in progress. Subsequent events behave as expected.
```js
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
```
Because listeners are managed using an internal array, calling this will change the position indices of any listener registered *after* the listener being removed. This will not impact the order in which listeners are called, but it means that any copies of the listener array as returned by the `emitter.listeners()` method will need to be recreated.
When a single function has been added as a handler multiple times for a single event (as in the example below), `removeListener()` will remove the most recently added instance. In the example the `once('ping')` listener is removed:
```js
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
[Section titled “Type Parameters”](#type-parameters-11)
##### K
[Section titled “K”](#k-11)
`K`
#### Parameters
[Section titled “Parameters”](#parameters-19)
##### eventName
[Section titled “eventName”](#eventname-11)
`string` | `symbol`
##### listener
[Section titled “listener”](#listener-7)
(…`args`) => `void`
#### Returns
[Section titled “Returns”](#returns-21)
`this`
#### Since
[Section titled “Since”](#since-13)
v0.1.26
#### Inherited from
[Section titled “Inherited from”](#inherited-from-14)
`EventEmitter.removeListener`
***
### set()
[Section titled “set()”](#set)
> **set**(`sid`, `session`, `callback?`): `void`
Defined in: [src/plugins/middleware/session.ts:99](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L99)
Stores a session.
#### Parameters
[Section titled “Parameters”](#parameters-20)
##### sid
[Section titled “sid”](#sid-3)
`string`
##### session
[Section titled “session”](#session-1)
[`SessionData`](/api/interfaces/sessiondata/)
##### callback?
[Section titled “callback?”](#callback-5)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-22)
`void`
***
### setMaxListeners()
[Section titled “setMaxListeners()”](#setmaxlisteners)
> **setMaxListeners**(`n`): `this`
Defined in: node\_modules/@types/node/events.d.ts:767
By default `EventEmitter`s will print a warning if more than `10` listeners are added for a particular event. This is a useful default that helps finding memory leaks. The `emitter.setMaxListeners()` method allows the limit to be modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners.
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Parameters
[Section titled “Parameters”](#parameters-21)
##### n
[Section titled “n”](#n)
`number`
#### Returns
[Section titled “Returns”](#returns-23)
`this`
#### Since
[Section titled “Since”](#since-14)
v0.3.5
#### Inherited from
[Section titled “Inherited from”](#inherited-from-15)
`EventEmitter.setMaxListeners`
***
### touch()?
[Section titled “touch()?”](#touch)
> `optional` **touch**(`sid`, `session`, `callback?`): `void`
Defined in: [src/plugins/middleware/session.ts:107](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/session.ts#L107)
Touches a session.
#### Parameters
[Section titled “Parameters”](#parameters-22)
##### sid
[Section titled “sid”](#sid-4)
`string`
##### session
[Section titled “session”](#session-2)
[`SessionData`](/api/interfaces/sessiondata/)
##### callback?
[Section titled “callback?”](#callback-6)
(`err?`) => `void`
#### Returns
[Section titled “Returns”](#returns-24)
`void`
# ValidationConfig
Defined in: [src/plugins/middleware/validation.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L7)
## Properties
[Section titled “Properties”](#properties)
### body?
[Section titled “body?”](#body)
> `optional` **body**: `any`
Defined in: [src/plugins/middleware/validation.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L8)
***
### headers?
[Section titled “headers?”](#headers)
> `optional` **headers**: `any`
Defined in: [src/plugins/middleware/validation.ts:11](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L11)
***
### params?
[Section titled “params?”](#params)
> `optional` **params**: `any`
Defined in: [src/plugins/middleware/validation.ts:10](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L10)
***
### query?
[Section titled “query?”](#query)
> `optional` **query**: `any`
Defined in: [src/plugins/middleware/validation.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/middleware/validation.ts#L9)
# shokupan
## Enumerations
[Section titled “Enumerations”](#enumerations)
* [RouteParamType](/api/enumerations/routeparamtype/)
## Classes
[Section titled “Classes”](#classes)
* [AuthPlugin](/api/classes/authplugin/)
* [ClusterPlugin](/api/classes/clusterplugin/)
* [Container](/api/classes/container/)
* [MemoryStore](/api/classes/memorystore/)
* [ScalarPlugin](/api/classes/scalarplugin/)
* [Shokupan](/api/classes/shokupan/)
* [ShokupanContext](/api/classes/shokupancontext/)
* [ShokupanResponse](/api/classes/shokupanresponse/)
* [ValidationError](/api/classes/validationerror/)
## Interfaces
[Section titled “Interfaces”](#interfaces)
* [AuthConfig](/api/interfaces/authconfig/)
* [AuthUser](/api/interfaces/authuser/)
* [ClusterOptions](/api/interfaces/clusteroptions/)
* [CompressionOptions](/api/interfaces/compressionoptions/)
* [CookieOptions](/api/interfaces/cookieoptions/)
* [CorsOptions](/api/interfaces/corsoptions/)
* [DebugCollector](/api/interfaces/debugcollector/)
* [HandlerStackItem](/api/interfaces/handlerstackitem/)
* [OpenAPIOptions](/api/interfaces/openapioptions/)
* [ProcessResult](/api/interfaces/processresult/)
* [ProviderConfig](/api/interfaces/providerconfig/)
* [RateLimitOptions](/api/interfaces/ratelimitoptions/)
* [RequestOptions](/api/interfaces/requestoptions/)
* [RouteMetadata](/api/interfaces/routemetadata/)
* [SecurityHeadersOptions](/api/interfaces/securityheadersoptions/)
* [ServerFactory](/api/interfaces/serverfactory/)
* [SessionContext](/api/interfaces/sessioncontext/)
* [SessionCookieOptions](/api/interfaces/sessioncookieoptions/)
* [SessionData](/api/interfaces/sessiondata/)
* [SessionOptions](/api/interfaces/sessionoptions/)
* [ShokupanHooks](/api/interfaces/shokupanhooks/)
* [ShokupanPlugin](/api/interfaces/shokupanplugin/)
* [ShokupanPluginOptions](/api/interfaces/shokupanpluginoptions/)
* [StaticServeHooks](/api/interfaces/staticservehooks/)
* [StaticServeOptions](/api/interfaces/staticserveoptions/)
* [Store](/api/interfaces/store/)
* [ValidationConfig](/api/interfaces/validationconfig/)
## Type Aliases
[Section titled “Type Aliases”](#type-aliases)
* [DeepPartial](/api/type-aliases/deeppartial/)
* [DefaultState](/api/type-aliases/defaultstate/)
* [EmptyState](/api/type-aliases/emptystate/)
* [GuardAPISpec](/api/type-aliases/guardapispec/)
* [HeadersInit](/api/type-aliases/headersinit/)
* [JSXRenderer](/api/type-aliases/jsxrenderer/)
* [Method](/api/type-aliases/method/)
* [MethodAPISpec](/api/type-aliases/methodapispec/)
* [Middleware](/api/type-aliases/middleware/)
* [NextFn](/api/type-aliases/nextfn/)
* [RouteParams](/api/type-aliases/routeparams/)
* [RouterAPISpec](/api/type-aliases/routerapispec/)
* [ScalarPluginOptions](/api/type-aliases/scalarpluginoptions/)
* [ShokupanConfig](/api/type-aliases/shokupanconfig/)
* [ShokupanController](/api/type-aliases/shokupancontroller/)
* [ShokupanHandler](/api/type-aliases/shokupanhandler/)
* [ShokupanRequest](/api/type-aliases/shokupanrequest/)
* [ShokupanRequestProps](/api/type-aliases/shokupanrequestprops/)
* [ShokupanRoute](/api/type-aliases/shokupanroute/)
* [ShokupanRouteConfig](/api/type-aliases/shokupanrouteconfig/)
## Variables
[Section titled “Variables”](#variables)
* [$appRoot](/api/variables/approot/)
* [$childControllers](/api/variables/childcontrollers/)
* [$childRouters](/api/variables/childrouters/)
* [$controllerPath](/api/variables/controllerpath/)
* [$dispatch](/api/variables/dispatch/)
* [$isApplication](/api/variables/isapplication/)
* [$isMounted](/api/variables/ismounted/)
* [$isRouter](/api/variables/isrouter/)
* [$middleware](/api/variables/middleware/)
* [$mountPath](/api/variables/mountpath/)
* [$parent](/api/variables/parent/)
* [$routeArgs](/api/variables/routeargs/)
* [$routeMethods](/api/variables/routemethods/)
* [$routes](/api/variables/routes/)
* [$routeSpec](/api/variables/routespec/)
* [All](/api/variables/all/)
* [Body](/api/variables/body/)
* [Ctx](/api/variables/ctx/)
* [Delete](/api/variables/delete/)
* [Get](/api/variables/get/)
* [Head](/api/variables/head/)
* [Headers](/api/variables/headers/)
* [HTTPMethods](/api/variables/httpmethods/)
* [Options](/api/variables/options/)
* [Param](/api/variables/param/)
* [Patch](/api/variables/patch/)
* [Post](/api/variables/post/)
* [Put](/api/variables/put/)
* [Query](/api/variables/query/)
* [Req](/api/variables/req/)
* [ShokupanRequest](/api/variables/shokupanrequest/)
## Functions
[Section titled “Functions”](#functions)
* [compileValidators](/api/functions/compilevalidators/)
* [compose](/api/functions/compose/)
* [Compression](/api/functions/compression/)
* [Controller](/api/functions/controller/)
* [Cors](/api/functions/cors/)
* [enableOpenApiValidation](/api/functions/enableopenapivalidation/)
* [Inject](/api/functions/inject/)
* [Injectable](/api/functions/injectable/)
* [openApiValidator](/api/functions/openapivalidator/)
* [precompileValidators](/api/functions/precompilevalidators/)
* [RateLimit](/api/functions/ratelimit/)
* [RateLimitMiddleware](/api/functions/ratelimitmiddleware/)
* [SecurityHeaders](/api/functions/securityheaders/)
* [Session](/api/functions/session/)
* [Spec](/api/functions/spec/)
* [Use](/api/functions/use/)
* [useExpress](/api/functions/useexpress/)
* [valibot](/api/functions/valibot/)
* [validate](/api/functions/validate/)
# DeepPartial
> **DeepPartial**<`T`> = `T` *extends* `Function` ? `T` : `T` *extends* `object` ? `{ [P in keyof T]?: DeepPartial }` : `T`
Defined in: [src/util/types.ts:17](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L17)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T`
# DefaultState
> **DefaultState** = `Record`<`string`, `any`>
Defined in: [src/util/types.ts:42](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L42)
Default state type that allows any properties. This is the default if no state type is specified.
## Example
[Section titled “Example”](#example)
```typescript
const app = new Shokupan();
// Equivalent to: new Shokupan();
```
# EmptyState
> **EmptyState** = `Record`<`string`, `never`>
Defined in: [src/util/types.ts:30](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L30)
Helper type for applications that don’t use ctx.state. Prevents accidental property access on state.
## Example
[Section titled “Example”](#example)
```typescript
const app = new Shokupan();
```
# GuardAPISpec
> **GuardAPISpec** = [`DeepPartial`](/api/type-aliases/deeppartial/)<`OpenAPI.Operation`>
Defined in: [src/util/types.ts:71](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L71)
# HeadersInit
> **HeadersInit** = `Headers` | `Record`<`string`, `string`> | \[`string`, `string`]\[]
Defined in: [src/util/types.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L7)
# JSXRenderer
> **JSXRenderer** = (`element`, `args?`) => `string` | `Promise`<`string`>
Defined in: [src/util/types.ts:136](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L136)
## Parameters
[Section titled “Parameters”](#parameters)
### element
[Section titled “element”](#element)
`any`
### args?
[Section titled “args?”](#args)
`unknown`
## Returns
[Section titled “Returns”](#returns)
`string` | `Promise`<`string`>
# Method
> **Method** = `"GET"` | `"POST"` | `"PUT"` | `"DELETE"` | `"PATCH"` | `"OPTIONS"` | `"HEAD"` | `"ALL"`
Defined in: [src/util/types.ts:114](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L114)
# MethodAPISpec
> **MethodAPISpec** = `OpenAPI.Operation`
Defined in: [src/util/types.ts:70](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L70)
# Middleware
> **Middleware** = (`ctx`, `next`) => `Promise`<`any`> | `any` & `object`
Defined in: [src/util/types.ts:130](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L130)
## Type Declaration
[Section titled “Type Declaration”](#type-declaration)
### isBuiltin?
[Section titled “isBuiltin?”](#isbuiltin)
> `optional` **isBuiltin**: `boolean`
### metadata?
[Section titled “metadata?”](#metadata)
> `optional` **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
### order?
[Section titled “order?”](#order)
> `optional` **order**: `number`
### pluginName?
[Section titled “pluginName?”](#pluginname)
> `optional` **pluginName**: `string`
# NextFn
> **NextFn** = () => `Promise`<`any`>
Defined in: [src/util/types.ts:129](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L129)
## Returns
[Section titled “Returns”](#returns)
`Promise`<`any`>
# RouteParams
> **RouteParams**<`Path`> = `string` *extends* `Path` ? `Record`<`string`, `string`> : `ParsePathParams`<`Path`> *extends* `Record`<`string`, `never`> ? `Record`<`string`, `string`> : `ParsePathParams`<`Path`>
Defined in: [src/util/types.ts:55](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L55)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### Path
[Section titled “Path”](#path)
`Path` *extends* `string`
# RouterAPISpec
> **RouterAPISpec** = `OpenAPI.Operation` & `Pick`<`Required`<`OpenAPI.Operation`>, `"tags"`> & `object`
Defined in: [src/util/types.ts:72](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L72)
## Type Declaration
[Section titled “Type Declaration”](#type-declaration)
### group
[Section titled “group”](#group)
> **group**: `string`
# ScalarPluginOptions
> **ScalarPluginOptions** = `object`
Defined in: [src/plugins/application/scalar.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L12)
## Properties
[Section titled “Properties”](#properties)
### baseDocument?
[Section titled “baseDocument?”](#basedocument)
> `optional` **baseDocument**: [`DeepPartial`](/api/type-aliases/deeppartial/)<`OpenAPI.Document`>
Defined in: [src/plugins/application/scalar.ts:16](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L16)
Base document to use for API reference.
***
### config?
[Section titled “config?”](#config)
> `optional` **config**: `Partial`<`ApiReferenceConfiguration`>
Defined in: [src/plugins/application/scalar.ts:20](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L20)
Configuration for API reference.
***
### enableStaticAnalysis?
[Section titled “enableStaticAnalysis?”](#enablestaticanalysis)
> `optional` **enableStaticAnalysis**: `boolean`
Defined in: [src/plugins/application/scalar.ts:29](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/plugins/application/scalar.ts#L29)
Whether to enable static analysis. When this is enabled, the plugin will run static analysis on the entrypoint and generate an OpenAPI document. This is useful for when you want to generate an OpenAPI document without having to manually define it.
Only works with TypeScript entrypoints.
# ShokupanConfig
> **ShokupanConfig**<`T`> = [`DeepPartial`](/api/type-aliases/deeppartial/)<{\[`key`: `string`]: `any`; `autoBackpressureFeedback?`: `boolean`; `autoBackpressureLevel?`: `number`; `controllersOnly`: `boolean`; `development`: `boolean`; `enableAsyncLocalStorage`: `boolean`; `enableMiddlewareTracking`: `boolean`; `enableOpenApiGen`: `boolean`; `enableTracing?`: `boolean`; `hooks`: [`ShokupanHooks`](/api/interfaces/shokupanhooks/)<`T`> | [`ShokupanHooks`](/api/interfaces/shokupanhooks/)<`T`>\[]; `hostname`: `string`; `httpLogger`: (`ctx`) => `void`; `jsonParser?`: `"native"` | `"parse-json"` | `"secure-json-parse"`; `logger`: { `debug`: (`msg`, `props`) => `void`; `error`: (`msg`, `props`) => `void`; `fatal`: (`msg`, `props`) => `void`; `info`: (`msg`, `props`) => `void`; `verbose`: `boolean`; `warning`: (`msg`, `props`) => `void`; }; `middlewareTrackingMaxCapacity?`: `number`; `middlewareTrackingTTL?`: `number`; `port`: `number`; `readTimeout`: `number`; `renderer`: [`JSXRenderer`](/api/type-aliases/jsxrenderer/); `requestTimeout`: `number`; `reusePort`: `boolean`; `serverFactory`: [`ServerFactory`](/api/interfaces/serverfactory/); `validateStatusCodes`: `boolean`; `writeTimeout`: `number`; }>
Defined in: [src/util/types.ts:245](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L245)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` *extends* `Record`<`string`, `any`> = `Record`<`string`, `any`>
# ShokupanController
> **ShokupanController**<`T`> = (…`args`) => `T` & `object`
Defined in: [src/util/types.ts:418](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L418)
## Type Declaration
[Section titled “Type Declaration”](#type-declaration)
### \[$isRouter]?
[Section titled “\[$isRouter\]?”](#isrouter)
> `optional` **\[$isRouter]**: `undefined`
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T` = `any`
# ShokupanHandler
> **ShokupanHandler**<`State`, `Params`> = (`ctx`, `next?`) => `Promise`<`any`> | `any`
Defined in: [src/util/types.ts:109](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L109)
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### State
[Section titled “State”](#state)
`State` *extends* `Record`<`string`, `any`> = `Record`<`string`, `any`>
### Params
[Section titled “Params”](#params)
`Params` *extends* `Record`<`string`, `string`> = `Record`<`string`, `string`>
## Parameters
[Section titled “Parameters”](#parameters)
### ctx
[Section titled “ctx”](#ctx)
[`ShokupanContext`](/api/classes/shokupancontext/)<`State`, `Params`>
### next?
[Section titled “next?”](#next)
[`NextFn`](/api/type-aliases/nextfn/)
## Returns
[Section titled “Returns”](#returns)
`Promise`<`any`> | `any`
# ShokupanRequest
> **ShokupanRequest**<`T`> = `ShokupanRequestBase` & `T`
Defined in: [src/util/request.ts:40](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L40)
This type is used to add properties to the request object.
## Type Parameters
[Section titled “Type Parameters”](#type-parameters)
### T
[Section titled “T”](#t)
`T`
# ShokupanRequestProps
> **ShokupanRequestProps** = `object`
Defined in: [src/util/request.ts:3](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L3)
## Properties
[Section titled “Properties”](#properties)
### body
[Section titled “body”](#body)
> **body**: `any`
Defined in: [src/util/request.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L7)
***
### headers
[Section titled “headers”](#headers)
> **headers**: `Headers`
Defined in: [src/util/request.ts:6](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L6)
***
### method
[Section titled “method”](#method)
> **method**: [`Method`](/api/type-aliases/method/)
Defined in: [src/util/request.ts:4](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L4)
***
### url
[Section titled “url”](#url)
> **url**: `string`
Defined in: [src/util/request.ts:5](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L5)
# ShokupanRoute
> **ShokupanRoute** = `object`
Defined in: [src/util/types.ts:172](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L172)
## Properties
[Section titled “Properties”](#properties)
### bakedHandler?
[Section titled “bakedHandler?”](#bakedhandler)
> `optional` **bakedHandler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)
Defined in: [src/util/types.ts:197](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L197)
Optimization: Handler with hooks baked in. Used by runtime router, while `handler` is used by OpenAPI generator.
***
### controller?
[Section titled “controller?”](#controller)
> `optional` **controller**: `any`
Defined in: [src/util/types.ts:242](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L242)
Controller instance this route belongs to
***
### group?
[Section titled “group?”](#group)
> `optional` **group**: `string`
Defined in: [src/util/types.ts:205](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L205)
Group for the route
***
### guards?
[Section titled “guards?”](#guards)
> `optional` **guards**: `object`\[]
Defined in: [src/util/types.ts:209](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L209)
Guards for the route
#### handler
[Section titled “handler”](#handler)
> **handler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)
Guard handler
#### spec?
[Section titled “spec?”](#spec)
> `optional` **spec**: [`GuardAPISpec`](/api/type-aliases/guardapispec/)
Guard OpenAPI spec
***
### handler
[Section titled “handler”](#handler-1)
> **handler**: [`ShokupanHandler`](/api/type-aliases/shokupanhandler/)
Defined in: [src/util/types.ts:192](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L192)
Route handler
***
### handlerSpec?
[Section titled “handlerSpec?”](#handlerspec)
> `optional` **handlerSpec**: [`MethodAPISpec`](/api/type-aliases/methodapispec/)
Defined in: [src/util/types.ts:201](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L201)
OpenAPI spec for the route
***
### hooks?
[Section titled “hooks?”](#hooks)
> `optional` **hooks**: [`ShokupanHooks`](/api/interfaces/shokupanhooks/)
Defined in: [src/util/types.ts:230](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L230)
Hooks from the router/route definition
***
### keys
[Section titled “keys”](#keys)
> **keys**: `string`\[]
Defined in: [src/util/types.ts:188](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L188)
Route parameters
***
### metadata?
[Section titled “metadata?”](#metadata)
> `optional` **metadata**: [`RouteMetadata`](/api/interfaces/routemetadata/)
Defined in: [src/util/types.ts:234](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L234)
Source metadata
***
### method
[Section titled “method”](#method)
> **method**: [`Method`](/api/type-aliases/method/)
Defined in: [src/util/types.ts:176](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L176)
HTTP method
***
### order?
[Section titled “order?”](#order)
> `optional` **order**: `number`
Defined in: [src/util/types.ts:238](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L238)
Order of the middleware
***
### path
[Section titled “path”](#path)
> **path**: `string`
Defined in: [src/util/types.ts:180](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L180)
Route path
***
### regex
[Section titled “regex”](#regex)
> **regex**: `RegExp`
Defined in: [src/util/types.ts:184](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L184)
Compiled regex for the route
***
### renderer?
[Section titled “renderer?”](#renderer)
> `optional` **renderer**: [`JSXRenderer`](/api/type-aliases/jsxrenderer/)
Defined in: [src/util/types.ts:226](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L226)
Custom JSX renderer for this route.
***
### requestTimeout?
[Section titled “requestTimeout?”](#requesttimeout)
> `optional` **requestTimeout**: `number`
Defined in: [src/util/types.ts:222](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L222)
Timeout for this specific route (milliseconds).
# ShokupanRouteConfig
> **ShokupanRouteConfig** = [`DeepPartial`](/api/type-aliases/deeppartial/)<{ `autoBackpressureFeedback`: `boolean`; `autoBackpressureLevel`: `number`; `controllersOnly`: `boolean`; `group`: `string`; `hooks`: [`ShokupanHooks`](/api/interfaces/shokupanhooks/) | [`ShokupanHooks`](/api/interfaces/shokupanhooks/)\[]; `name`: `string`; `openapi`: [`DeepPartial`](/api/type-aliases/deeppartial/)<`OpenAPI.Operation`>; `renderer`: [`JSXRenderer`](/api/type-aliases/jsxrenderer/); `requestTimeout`: `number`; }>
Defined in: [src/util/types.ts:138](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L138)
# $appRoot
> `const` **$appRoot**: *typeof* `$appRoot`
Defined in: [src/util/symbol.ts:2](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L2)
# $childControllers
> `const` **$childControllers**: *typeof* `$childControllers`
Defined in: [src/util/symbol.ts:11](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L11)
# $childRouters
> `const` **$childRouters**: *typeof* `$childRouters`
Defined in: [src/util/symbol.ts:10](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L10)
# $controllerPath
> `const` **$controllerPath**: *typeof* `$controllerPath`
Defined in: [src/util/symbol.ts:6](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L6)
# $dispatch
> `const` **$dispatch**: *typeof* `$dispatch`
Defined in: [src/util/symbol.ts:13](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L13)
# $isApplication
> `const` **$isApplication**: *typeof* `$isApplication`
Defined in: [src/util/symbol.ts:1](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L1)
# $isMounted
> `const` **$isMounted**: *typeof* `$isMounted`
Defined in: [src/util/symbol.ts:3](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L3)
# $isRouter
> `const` **$isRouter**: *typeof* `$isRouter`
Defined in: [src/util/symbol.ts:8](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L8)
# $middleware
> `const` **$middleware**: *typeof* `$middleware`
Defined in: [src/util/symbol.ts:7](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L7)
# $mountPath
> `const` **$mountPath**: *typeof* `$mountPath`
Defined in: [src/util/symbol.ts:12](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L12)
# $parent
> `const` **$parent**: *typeof* `$parent`
Defined in: [src/util/symbol.ts:9](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L9)
# $routeArgs
> `const` **$routeArgs**: *typeof* `$routeArgs`
Defined in: [src/util/symbol.ts:5](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L5)
# $routeMethods
> `const` **$routeMethods**: *typeof* `$routeMethods`
Defined in: [src/util/symbol.ts:4](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L4)
# $routes
> `const` **$routes**: *typeof* `$routes`
Defined in: [src/util/symbol.ts:14](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L14)
# $routeSpec
> `const` **$routeSpec**: *typeof* `$routeSpec`
Defined in: [src/util/symbol.ts:15](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/symbol.ts#L15)
# All
> `const` **All**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:155](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L155)
Decorator: Binds a method to ANY HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Body
> `const` **Body**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:59](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L59)
Decorator: Binds a parameter to the request body.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Ctx
> `const` **Ctx**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:84](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L84)
Decorator: Binds a parameter to the request context.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Delete
> `const` **Delete**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:135](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L135)
Decorator: Binds a method to the DELETE HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Get
> `const` **Get**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:120](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L120)
Decorator: Binds a method to the GET HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Head
> `const` **Head**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:150](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L150)
Decorator: Binds a method to the HEAD HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Headers
> `const` **Headers**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:74](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L74)
Decorator: Binds a parameter to the request headers.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# HTTPMethods
> `const` **HTTPMethods**: `string`\[]
Defined in: [src/util/types.ts:113](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/types.ts#L113)
# Options
> `const` **Options**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:145](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L145)
Decorator: Binds a method to the OPTIONS HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Param
> `const` **Param**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:64](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L64)
Decorator: Binds a parameter to the request parameters.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Patch
> `const` **Patch**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:140](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L140)
Decorator: Binds a method to the PATCH HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Post
> `const` **Post**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:125](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L125)
Decorator: Binds a method to the POST HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Put
> `const` **Put**: (`path`) => (`target`, `propertyKey`, `descriptor`) => `void`
Defined in: [src/util/decorators.ts:130](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L130)
Decorator: Binds a method to the PUT HTTP verb.
## Parameters
[Section titled “Parameters”](#parameters)
### path
[Section titled “path”](#path)
`string` = `"/"`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `descriptor`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### descriptor
[Section titled “descriptor”](#descriptor)
`PropertyDescriptor`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Query
> `const` **Query**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:69](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L69)
Decorator: Binds a parameter to the request query string.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# Req
> `const` **Req**: (`name?`) => (`target`, `propertyKey`, `parameterIndex`) => `void`
Defined in: [src/util/decorators.ts:79](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/decorators.ts#L79)
Decorator: Binds a parameter to the request object.
## Parameters
[Section titled “Parameters”](#parameters)
### name?
[Section titled “name?”](#name)
`string`
## Returns
[Section titled “Returns”](#returns)
> (`target`, `propertyKey`, `parameterIndex`): `void`
### Parameters
[Section titled “Parameters”](#parameters-1)
#### target
[Section titled “target”](#target)
`any`
#### propertyKey
[Section titled “propertyKey”](#propertykey)
`string`
#### parameterIndex
[Section titled “parameterIndex”](#parameterindex)
`number`
### Returns
[Section titled “Returns”](#returns-1)
`void`
# ShokupanRequest
> **ShokupanRequest**: `ShokupanConstructor`
Defined in: [src/util/request.ts:40](https://github.com/knackstedt/shokupan/blob/727617c4fb0568f10a27e5ba685e1a2ce8b13b7e/src/util/request.ts#L40)
This class is used to create a request object. It is used to make requests to the router.
# Context
> Understanding the ShokupanContext API
The `ShokupanContext` object provides a rich API for handling requests and responses. It’s passed to every route handler and middleware function.
## Context Properties
[Section titled “Context Properties”](#context-properties)
### Request Information
[Section titled “Request Information”](#request-information)
```typescript
app.get('/info', (ctx) => {
return {
// HTTP method
method: ctx.method, // 'GET', 'POST', etc.
// Request path
path: ctx.path, // '/info'
// Full URL
url: ctx.url, // 'http://localhost:3000/info?q=test'
// Path parameters
params: ctx.params, // { id: '123' } from /users/:id
// Query parameters (URLSearchParams)
query: ctx.query, // URLSearchParams object
// Headers (Headers object)
headers: ctx.headers,
// Client IP address (string)
ip: ctx.ip,
// Host (string)
host: ctx.host, // localhost:3000
// Hostname (string)
hostname: ctx.hostname, // localhost
// Protocol (string)
protocol: ctx.protocol, // http
// Secure context (boolean)
secure: ctx.secure, // false
// Origin (string)
origin: ctx.origin // http://localhost:3000
};
});
```
### Request Object
[Section titled “Request Object”](#request-object)
Access the raw Request object:
```typescript
app.post('/upload', async (ctx) => {
// Raw Request object
const request = ctx.req;
// Use Request methods
const formData = await request.formData();
const blob = await request.blob();
return { uploaded: true };
});
```
### State
[Section titled “State”](#state)
Share data across middleware and handlers:
```typescript
app.use(async (ctx, next) => {
ctx.state.requestId = crypto.randomUUID();
ctx.state.startTime = Date.now();
return next();
});
app.get('/', (ctx) => {
return {
requestId: ctx.state.requestId,
duration: Date.now() - ctx.state.startTime
};
});
```
## Reading Request Data
[Section titled “Reading Request Data”](#reading-request-data)
### Query Parameters
[Section titled “Query Parameters”](#query-parameters)
```typescript
app.get('/search', (ctx) => {
// Get single value
const q = ctx.query.get('q');
// Get with default
const page = ctx.query.get('page') || '1';
// Get all values for a key
const tags = ctx.query.getAll('tag');
// Check if exists
const hasFilter = ctx.query.has('filter');
return { q, page, tags, hasFilter };
});
// GET /search?q=test&page=2&tag=news&tag=tech
```
### Path Parameters
[Section titled “Path Parameters”](#path-parameters)
```typescript
app.get('/users/:userId/posts/:postId', (ctx) => {
const { userId, postId } = ctx.params;
return {
user: userId,
post: postId
};
});
// GET /users/123/posts/456
// params = { userId: '123', postId: '456' }
```
### Request Body
[Section titled “Request Body”](#request-body)
The `body()` method automatically parses JSON and form data:
```typescript
app.post('/users', async (ctx) => {
// Auto-parsed based on Content-Type
const data = await ctx.body();
return { created: data };
});
```
For specific formats:
```typescript
app.post('/data', async (ctx) => {
// JSON
const json = await ctx.req.json();
// Text
const text = await ctx.req.text();
// Form data
const form = await ctx.req.formData();
// Binary
const blob = await ctx.req.blob();
const buffer = await ctx.req.arrayBuffer();
return { received: true };
});
```
### Headers
[Section titled “Headers”](#headers)
```typescript
app.get('/headers', (ctx) => {
// Get single header
const auth = ctx.headers.get('authorization');
const userAgent = ctx.headers.get('user-agent');
// Check if exists
const hasAuth = ctx.headers.has('authorization');
// Get all headers
const allHeaders = Object.fromEntries(ctx.headers.entries());
return { auth, userAgent, hasAuth, allHeaders };
});
```
### Cookies
[Section titled “Cookies”](#cookies)
```typescript
app.get('/cookies', (ctx) => {
const cookieHeader = ctx.headers.get('cookie');
// Parse cookies manually or use a plugin
const cookies = Object.fromEntries(
cookieHeader?.split(';').map(c => {
const [key, val] = c.trim().split('=');
return [key, val];
}) || []
);
return { cookies };
});
```
## Sending Responses
[Section titled “Sending Responses”](#sending-responses)
### JSON Response
[Section titled “JSON Response”](#json-response)
```typescript
app.get('/json', (ctx) => {
// Implicit JSON (most common)
return { message: 'Hello' };
// Explicit JSON with status
return ctx.json({ message: 'Created' }, 201);
// Add headers
ctx.set('X-Custom', 'value');
return ctx.json({ data: 'value' });
});
```
### Text Response
[Section titled “Text Response”](#text-response)
```typescript
app.get('/text', (ctx) => {
return ctx.text('Hello, World!');
// With status
return ctx.text('Not Found', 404);
});
```
### HTML Response
[Section titled “HTML Response”](#html-response)
### JSX Response
[Section titled “JSX Response”](#jsx-response)
Render JSX elements directly:
```typescript
app.get('/jsx', (ctx) => {
return ctx.jsx(Hello, World!
);
// With props
return ctx.jsx();
});
```
To use JSX, ensure you have configured a JSX renderer in your `ShokupanConfig` (if not using the default) or are using a transpiler that supports it.
### File Response
[Section titled “File Response”](#file-response)
```typescript
app.get('/download', (ctx) => {
return ctx.file('./path/to/file.pdf', {
type: 'application/pdf'
});
});
```
### Redirect
[Section titled “Redirect”](#redirect)
```typescript
app.get('/old', (ctx) => {
return ctx.redirect('/new');
// Permanent redirect
return ctx.redirect('/new', 301);
// Temporary redirect (default)
return ctx.redirect('/new', 302);
});
```
### Status Code
[Section titled “Status Code”](#status-code)
```typescript
app.delete('/users/:id', (ctx) => {
// No content
return ctx.status(204);
// Or with send
return ctx.send(null, { status: 204 });
});
```
### Custom Response
[Section titled “Custom Response”](#custom-response)
Return a Response object directly:
```typescript
app.get('/custom', (ctx) => {
return new Response('Custom response', {
status: 200,
headers: {
'Content-Type': 'text/plain',
'X-Custom-Header': 'value'
}
});
});
```
## Response Headers
[Section titled “Response Headers”](#response-headers)
### Set Headers
[Section titled “Set Headers”](#set-headers)
```typescript
app.get('/headers', (ctx) => {
// Set single header
ctx.set('X-Custom-Header', 'value');
// Set multiple headers
ctx.set('X-Version', '1.0');
ctx.set('X-Powered-By', 'Shokupan');
return { message: 'Check headers' };
});
```
### Set Cookies
[Section titled “Set Cookies”](#set-cookies)
```typescript
app.get('/set-cookie', (ctx) => {
ctx.setCookie('sessionId', 'abc123', {
httpOnly: true,
secure: true,
sameSite: 'lax',
maxAge: 3600, // 1 hour
path: '/',
domain: 'example.com'
});
return { message: 'Cookie set' };
});
```
## Advanced Features
[Section titled “Advanced Features”](#advanced-features)
### Client IP
[Section titled “Client IP”](#client-ip)
```typescript
app.get('/ip', (ctx) => {
return { ip: ctx.ip };
});
```
### Response Builder
[Section titled “Response Builder”](#response-builder)
Access the response builder:
```typescript
app.get('/response', (ctx) => {
const response = ctx.response;
// Build custom response
response.headers.set('X-Custom', 'value');
response.status = 201;
return { data: 'value' };
});
```
### Session (with Session Plugin)
[Section titled “Session (with Session Plugin)”](#session-with-session-plugin)
```typescript
import { Session } from 'shokupan';
app.use(Session({ secret: 'secret' }));
app.get('/login', (ctx) => {
ctx.session.user = { id: '123', name: 'Alice' };
return { message: 'Logged in' };
});
app.get('/profile', (ctx) => {
if (!ctx.session.user) {
return ctx.json({ error: 'Not authenticated' }, 401);
}
return ctx.session.user;
});
```
## Type Safety
[Section titled “Type Safety”](#type-safety)
Add types to your context:
```typescript
import { ShokupanContext } from 'shokupan';
interface User {
id: string;
name: string;
}
interface MyContext {
user?: User;
}
app.get('/typed', (ctx: ShokupanContext) => {
// ctx.state.user is typed as User | undefined
return { user: ctx.state.user };
});
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Routing](/core/routing/) - Learn about routing patterns
* [Middleware](/core/middleware/) - Create custom middleware
* [API Reference](../api/interfaces/SessionContext.md) - Complete Context API reference
# Controllers
> Use decorators for structured class-based routing
Controllers provide a structured, class-based approach to defining routes using TypeScript decorators. This pattern is familiar to NestJS developers and helps organize your application.
## Basic Controller
[Section titled “Basic Controller”](#basic-controller)
Create a controller using the `@Get`, `@Post`, etc. decorators:
```typescript
import { Get, Post, Put, Delete, Param, Body } from 'shokupan';
export class UserController {
@Get('/')
async getAllUsers() {
return {
users: ['Alice', 'Bob', 'Charlie']
};
}
@Get('/:id')
async getUserById(@Param('id') id: string) {
return {
id,
name: 'Alice',
email: 'alice@example.com'
};
}
@Post('/')
async createUser(@Body() body: any) {
return {
message: 'User created',
data: body
};
}
@Put('/:id')
async updateUser(
@Param('id') id: string,
@Body() body: any
) {
return {
message: 'User updated',
id,
data: body
};
}
@Delete('/:id')
async deleteUser(@Param('id') id: string) {
return { message: 'User deleted', id };
}
}
```
## Mounting Controllers
[Section titled “Mounting Controllers”](#mounting-controllers)
Mount a controller to a base path:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan();
// Mount at /api/users
app.mount('/api/users', UserController);
// Routes available:
// GET /api/users
// GET /api/users/:id
// POST /api/users
// PUT /api/users/:id
// DELETE /api/users/:id
```
## HTTP Method Decorators
[Section titled “HTTP Method Decorators”](#http-method-decorators)
All HTTP methods are supported:
```typescript
import { Get, Post, Put, Patch, Delete, Options, Head, All } from 'shokupan';
export class ApiController {
@Get('/resource')
getResource() { }
@Post('/resource')
createResource() { }
@Put('/resource/:id')
replaceResource() { }
@Patch('/resource/:id')
updateResource() { }
@Delete('/resource/:id')
deleteResource() { }
@Options('/resource')
resourceOptions() { }
@Head('/resource')
resourceHead() { }
@All('/webhook')
handleWebhook() { }
}
```
## Parameter Decorators
[Section titled “Parameter Decorators”](#parameter-decorators)
Extract data from requests using parameter decorators:
### @Param
[Section titled “@Param”](#param)
Extract path parameters:
```typescript
@Get('/users/:userId/posts/:postId')
getPost(
@Param('userId') userId: string,
@Param('postId') postId: string
) {
return { userId, postId };
}
```
### @Query
[Section titled “@Query”](#query)
Extract query parameters:
```typescript
@Get('/search')
search(
@Query('q') searchQuery: string,
@Query('page') page?: string
) {
return {
query: searchQuery,
page: page || '1'
};
}
```
### @Body
[Section titled “@Body”](#body)
Access the request body:
```typescript
@Post('/users')
async createUser(@Body() userData: any) {
// userData is already parsed
return { created: userData };
}
```
### @Headers
[Section titled “@Headers”](#headers)
Access request headers:
```typescript
@Get('/protected')
getData(
@Headers('authorization') token: string,
@Headers('user-agent') userAgent: string
) {
return { token, userAgent };
}
```
### @Ctx
[Section titled “@Ctx”](#ctx)
Access the full context object:
```typescript
import { Ctx, ShokupanContext } from 'shokupan';
@Get('/info')
getInfo(@Ctx() ctx: ShokupanContext) {
return {
method: ctx.method,
path: ctx.path,
headers: Object.fromEntries(ctx.headers.entries())
};
}
```
### @Req
[Section titled “@Req”](#req)
Access the request object directly:
```typescript
import { Req } from 'shokupan';
@Post('/upload')
async upload(@Req() req: Request) {
const formData = await req.formData();
return { uploaded: true };
}
```
## Controller Middleware
[Section titled “Controller Middleware”](#controller-middleware)
Apply middleware to all routes in a controller using `@Use`:
```typescript
import { Use } from 'shokupan';
const authMiddleware = async (ctx, next) => {
if (!ctx.headers.get('authorization')) {
return ctx.json({ error: 'Unauthorized' }, 401);
}
ctx.state.user = { id: '123' };
return next();
};
@Use(authMiddleware)
export class AdminController {
@Get('/dashboard')
getDashboard(@Ctx() ctx: any) {
return { user: ctx.state.user };
}
@Get('/settings')
getSettings(@Ctx() ctx: any) {
return { user: ctx.state.user };
}
}
```
## Method-Level Middleware
[Section titled “Method-Level Middleware”](#method-level-middleware)
Apply middleware to specific methods:
```typescript
const logRequest = async (ctx, next) => {
console.log(`${ctx.method} ${ctx.path}`);
return next();
};
export class UserController {
@Get('/')
getAllUsers() {
return { users: [] };
}
@Post('/')
@Use(logRequest)
createUser(@Body() body: any) {
return { created: body };
}
}
```
## Dependency Injection
[Section titled “Dependency Injection”](#dependency-injection)
Use the DI container in controllers:
```typescript
import { Container } from 'shokupan';
class UserService {
getUsers() {
return ['Alice', 'Bob'];
}
}
Container.register('userService', UserService);
export class UserController {
private userService: UserService;
constructor() {
this.userService = Container.resolve('userService');
}
@Get('/')
getAllUsers() {
return { users: this.userService.getUsers() };
}
}
```
## Multiple Controllers
[Section titled “Multiple Controllers”](#multiple-controllers)
Organize your app with multiple controllers:
user.controller.ts
```typescript
export class UserController {
@Get('/')
getUsers() { }
}
// post.controller.ts
export class PostController {
@Get('/')
getPosts() { }
}
// app.ts
import { Shokupan } from 'shokupan';
const app = new Shokupan();
app.mount('/api/users', UserController);
app.mount('/api/posts', PostController);
```
## TypeScript Configuration
[Section titled “TypeScript Configuration”](#typescript-configuration)
For controllers to work, enable decorators in `tsconfig.json`:
```json
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Middleware](/core/middleware/) - Create custom middleware
* [Dependency Injection](/advanced/dependency-injection/) - Advanced DI patterns
* [Validation](/plugins/validation/) - Validate controller inputs
# Middleware
> Add cross-cutting concerns with middleware
Middleware functions have access to the request context and can control the request flow. They’re perfect for cross-cutting concerns like logging, authentication, and error handling.
## Basic Middleware
[Section titled “Basic Middleware”](#basic-middleware)
Middleware receives the context and a `next` function:
```typescript
import { Middleware } from 'shokupan';
const logger: Middleware = async (ctx, next) => {
console.log(`${ctx.method} ${ctx.path}`);
const start = Date.now();
const result = await next();
console.log(`${ctx.method} ${ctx.path} - ${Date.now() - start}ms`);
return result;
};
app.use(logger);
```
Important
Always `return` the result from `next()`. Forgetting this will cause issues with response handling.
## Global Middleware
[Section titled “Global Middleware”](#global-middleware)
Apply middleware to all routes:
```typescript
// Logging
app.use(async (ctx, next) => {
console.log(`→ ${ctx.method} ${ctx.path}`);
return next();
});
// Request ID
app.use(async (ctx, next) => {
ctx.state.requestId = crypto.randomUUID();
return next();
});
// Add routes after middleware
app.get('/', (ctx) => {
return { requestId: ctx.state.requestId };
});
```
## Route-Specific Middleware
[Section titled “Route-Specific Middleware”](#route-specific-middleware)
Apply middleware to specific routes:
```typescript
const authenticate = async (ctx, next) => {
const token = ctx.headers.get('authorization');
if (!token) {
return ctx.json({ error: 'Unauthorized' }, 401);
}
// Validate token and attach user
ctx.state.user = { id: '123', name: 'Alice' };
return next();
};
// Apply to single route
app.get('/protected', authenticate, (ctx) => {
return { user: ctx.state.user };
});
// Apply to multiple handlers
app.post('/admin',
authenticate,
checkAdmin,
(ctx) => {
return { admin: true };
}
);
```
## Router Middleware
[Section titled “Router Middleware”](#router-middleware)
Apply middleware to all routes in a router:
```typescript
import { ShokupanRouter } from 'shokupan';
const apiRouter = new ShokupanRouter();
// Middleware for all routes in this router
apiRouter.use(authenticate);
apiRouter.get('/users', (ctx) => ({ users: [] }));
apiRouter.get('/posts', (ctx) => ({ posts: [] }));
app.mount('/api', apiRouter);
```
## Controller Middleware
[Section titled “Controller Middleware”](#controller-middleware)
Use the `@Use` decorator for controllers:
```typescript
import { Use } from 'shokupan';
// On entire controller
@Use(authenticate)
export class AdminController {
@Get('/dashboard')
getDashboard() { }
}
// On specific methods
export class UserController {
@Get('/')
@Use(rateLimit)
getUsers() { }
}
```
## Error Handling
[Section titled “Error Handling”](#error-handling)
Middleware can catch and handle errors:
```typescript
const errorHandler: Middleware = async (ctx, next) => {
try {
return await next();
} catch (error) {
console.error('Error:', error);
return ctx.json({
error: 'Internal Server Error',
message: error.message
}, 500);
}
};
// Add early in middleware chain
app.use(errorHandler);
```
## Request Timing
[Section titled “Request Timing”](#request-timing)
Track request duration:
```typescript
const timing: Middleware = async (ctx, next) => {
const start = Date.now();
const result = await next();
const duration = Date.now() - start;
// Add timing header
ctx.set('X-Response-Time', `${duration}ms`);
return result;
};
app.use(timing);
```
## Authentication
[Section titled “Authentication”](#authentication)
Create an authentication middleware:
```typescript
const authenticate: Middleware = async (ctx, next) => {
const token = ctx.headers.get('authorization')?.replace('Bearer ', '');
if (!token) {
return ctx.json({ error: 'No token provided' }, 401);
}
try {
// Verify JWT token
const user = await verifyToken(token);
ctx.state.user = user;
return next();
} catch (error) {
return ctx.json({ error: 'Invalid token' }, 401);
}
};
```
## Request ID
[Section titled “Request ID”](#request-id)
Add unique request IDs:
```typescript
const requestId: Middleware = async (ctx, next) => {
const id = crypto.randomUUID();
ctx.state.requestId = id;
ctx.set('X-Request-ID', id);
return next();
};
app.use(requestId);
app.get('/', (ctx) => {
console.log(`Request ID: ${ctx.state.requestId}`);
return { requestId: ctx.state.requestId };
});
```
## CORS Headers
[Section titled “CORS Headers”](#cors-headers)
Simple CORS middleware (use [CORS plugin](/plugins/cors/) for production):
```typescript
const cors: Middleware = async (ctx, next) => {
ctx.set('Access-Control-Allow-Origin', '*');
ctx.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (ctx.method === 'OPTIONS') {
return ctx.status(204);
}
return next();
};
app.use(cors);
```
## Conditional Middleware
[Section titled “Conditional Middleware”](#conditional-middleware)
Apply middleware conditionally:
```typescript
const conditionalAuth: Middleware = async (ctx, next) => {
// Skip auth for public endpoints
if (ctx.path.startsWith('/public')) {
return next();
}
// Require auth for all other endpoints
return authenticate(ctx, next);
};
app.use(conditionalAuth);
```
## Middleware Order
[Section titled “Middleware Order”](#middleware-order)
Middleware executes in the order it’s added:
```typescript
// ✅ Correct order
app.use(errorHandler); // 1. Error handling first
app.use(logger); // 2. Logging
app.use(authenticate); // 3. Authentication
app.use(rateLimit); // 4. Rate limiting
// Routes
app.get('/', handler);
// Request flow:
// errorHandler → logger → authenticate → rateLimit → handler
// Response flow (reversed):
// handler → rateLimit → authenticate → logger → errorHandler
```
## Modifying Responses
[Section titled “Modifying Responses”](#modifying-responses)
Middleware can modify responses:
```typescript
const addHeaders: Middleware = async (ctx, next) => {
const result = await next();
// Add custom headers to response
ctx.set('X-Powered-By', 'Shokupan');
ctx.set('X-Version', '1.0.0');
return result;
};
app.use(addHeaders);
```
## State Sharing
[Section titled “State Sharing”](#state-sharing)
Use `ctx.state` to share data between middleware:
```typescript
const loadUser: Middleware = async (ctx, next) => {
const userId = ctx.query.get('userId');
if (userId) {
ctx.state.user = await fetchUser(userId);
}
return next();
};
const checkPermissions: Middleware = async (ctx, next) => {
if (!ctx.state.user?.isAdmin) {
return ctx.json({ error: 'Forbidden' }, 403);
}
return next();
};
app.get('/admin', loadUser, checkPermissions, (ctx) => {
return { user: ctx.state.user };
});
```
## Built-in Plugins
[Section titled “Built-in Plugins”](#built-in-plugins)
Shokupan provides many built-in middleware plugins:
```typescript
import {
Cors,
Compression,
RateLimit,
SecurityHeaders
} from 'shokupan';
app.use(Cors());
app.use(Compression());
app.use(RateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
app.use(SecurityHeaders());
```
See the [Plugins](/plugins/cors/) section for more details.
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Context API](/core/context/) - Full context reference
* [CORS Plugin](/plugins/cors/) - Configure CORS
* [Rate Limiting](/plugins/rate-limiting/) - Prevent abuse
* [Authentication](/plugins/authentication/) - OAuth2 support
# Routing
> Learn about routing in Shokupan
Shokupan supports Express-style routing with a clean, intuitive API. Routes can be defined using HTTP method helpers or the generic `add()` method.
## Basic Routes
[Section titled “Basic Routes”](#basic-routes)
Define routes for different HTTP methods:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan();
// GET request
app.get('/users', (ctx) => {
return { users: ['Alice', 'Bob'] };
});
// POST request
app.post('/users', async (ctx) => {
const body = await ctx.body();
return { created: body };
});
// PUT, PATCH, DELETE
app.put('/users/:id', (ctx) => ({ updated: ctx.params.id }));
app.patch('/users/:id', (ctx) => ({ patched: ctx.params.id }));
app.delete('/users/:id', (ctx) => ({ deleted: ctx.params.id }));
// HEAD, OPTIONS
app.head('/users', (ctx) => ctx.status(200));
app.options('/users', (ctx) => ctx.status(200));
// Match all HTTP methods
app.all('/webhook', (ctx) => ({method: ctx.method}));
```
## Path Parameters
[Section titled “Path Parameters”](#path-parameters)
Extract dynamic values from the URL path:
```typescript
// Single parameter
app.get('/users/:id', (ctx) => {
const userId = ctx.params.id;
return { id: userId, name: 'Alice' };
});
// Multiple parameters
app.get('/posts/:postId/comments/:commentId', (ctx) => {
return {
postId: ctx.params.postId,
commentId: ctx.params.commentId
};
});
// Optional segments with wildcards
app.get('/files/*', (ctx) => {
// Matches /files/anything/here
return { path: ctx.path };
});
```
## Query Strings
[Section titled “Query Strings”](#query-strings)
Access query parameters using the `query` property:
```typescript
app.get('/search', (ctx) => {
const query = ctx.query.get('q');
const page = ctx.query.get('page') || '1';
const limit = ctx.query.get('limit') || '10';
return {
query,
page: parseInt(page),
limit: parseInt(limit),
results: []
};
});
// GET /search?q=shokupan&page=2&limit=20
```
## Routers
[Section titled “Routers”](#routers)
Group related routes using `ShokupanRouter`:
```typescript
import { ShokupanRouter } from 'shokupan';
const apiRouter = new ShokupanRouter();
apiRouter.get('/users', (ctx) => ({ users: [] }));
apiRouter.get('/posts', (ctx) => ({ posts: [] }));
apiRouter.get('/comments', (ctx) => ({ comments: [] }));
// Mount router under /api prefix
app.mount('/api', apiRouter);
// Available at:
// GET /api/users
// GET /api/posts
// GET /api/comments
```
### Nested Routers
[Section titled “Nested Routers”](#nested-routers)
Routers can be nested for better organization:
```typescript
const v1Router = new ShokupanRouter();
const v2Router = new ShokupanRouter();
v1Router.get('/users', (ctx) => ({ version: 1, users: [] }));
v2Router.get('/users', (ctx) => ({ version: 2, users: [] }));
app.mount('/api/v1', v1Router);
app.mount('/api/v2', v2Router);
```
## Route Handlers
[Section titled “Route Handlers”](#route-handlers)
Handlers receive a [context object](/api/context/) and can return various response types:
```typescript
// Return JSON (most common)
app.get('/json', (ctx) => {
return { message: 'Hello' };
});
// Return text
app.get('/text', (ctx) => {
return ctx.text('Hello, World!');
});
// Return HTML
app.get('/html', (ctx) => {
return ctx.html('Hello
');
});
// Return Response directly
app.get('/custom', (ctx) => {
return new Response('Custom', {
status: 200,
headers: { 'X-Custom': 'value' }
});
});
// Async handlers
app.get('/async', async (ctx) => {
const data = await fetchFromDatabase();
return { data };
});
```
## Multiple Handlers (Middleware Chain)
[Section titled “Multiple Handlers (Middleware Chain)”](#multiple-handlers-middleware-chain)
Pass multiple handlers to create a middleware chain:
```typescript
const authenticate = async (ctx, next) => {
if (!ctx.headers.get('authorization')) {
return ctx.json({ error: 'Unauthorized' }, 401);
}
return next();
};
const authorize = async (ctx, next) => {
// Check permissions
return next();
};
app.get('/protected',
authenticate,
authorize,
(ctx) => {
return { secret: 'data' };
}
);
```
## Route Groups
[Section titled “Route Groups”](#route-groups)
Apply middleware to multiple routes:
```typescript
const authRouter = new ShokupanRouter();
// This middleware applies to all routes in this router
authRouter.use(authenticate);
authRouter.get('/profile', (ctx) => ({ profile: {} }));
authRouter.get('/settings', (ctx) => ({ settings: {} }));
authRouter.post('/logout', (ctx) => ({ message: 'Logged out' }));
app.mount('/auth', authRouter);
```
## Route Order
[Section titled “Route Order”](#route-order)
Routes are matched in the order they are defined:
```typescript
// ✅ Specific route first
app.get('/users/me', (ctx) => {
return { current: 'user' };
});
app.get('/users/:id', (ctx) => {
return { id: ctx.params.id };
});
// ❌ Wrong order - /users/me would never match
app.get('/users/:id', (ctx) => {
return { id: ctx.params.id };
});
app.get('/users/me', (ctx) => {
return { current: 'user' }; // Never reached!
});
```
## OpenAPI Metadata
[Section titled “OpenAPI Metadata”](#openapi-metadata)
Add OpenAPI documentation to your routes:
```typescript
app.get('/users/:id', {
summary: 'Get user by ID',
description: 'Retrieves a single user',
tags: ['Users'],
parameters: [{
name: 'id',
in: 'path',
required: true,
schema: { type: 'string' }
}],
responses: {
200: {
description: 'User found',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
id: { type: 'string' },
name: { type: 'string' }
}
}
}
}
}
}
}, (ctx) => {
return { id: ctx.params.id, name: 'Alice' };
});
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Controllers](/core/controllers/) - Use decorators for organized routing
* [Middleware](/core/middleware/) - Add cross-cutting concerns
* [Context API](/api/context/) - Full context reference
# Static Files
> Serve static files and directories
Shokupan provides built-in support for serving static files with optional directory listing.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
Serve files from a directory:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan();
// Serve static files from ./public
app.static('/public', {
root: './public'
});
app.listen();
```
Now files in `./public` are accessible:
* `./public/style.css` → `http://localhost:3000/public/style.css`
* `./public/script.js` → `http://localhost:3000/public/script.js`
* `./public/images/logo.png` → `http://localhost:3000/public/images/logo.png`
## Directory Listing
[Section titled “Directory Listing”](#directory-listing)
Enable directory browsing:
```typescript
app.static('/files', {
root: './files',
listDirectory: true // Enable directory listing
});
```
When you visit `http://localhost:3000/files/`, you’ll see a list of files and subdirectories.
## Multiple Static Directories
[Section titled “Multiple Static Directories”](#multiple-static-directories)
Serve from multiple directories:
```typescript
// Public assets
app.static('/public', {
root: './public',
listDirectory: true
});
// Images
app.static('/images', {
root: './assets/images',
listDirectory: false
});
// JavaScript bundles
app.static('/js', {
root: './dist/js',
listDirectory: false
});
// CSS stylesheets
app.static('/css', {
root: './dist/css',
listDirectory: false
});
```
## Root Path
[Section titled “Root Path”](#root-path)
Serve files at the root path:
```typescript
// Serve from root
app.static('/', {
root: './public'
});
// Now accessible at:
// ./public/index.html → http://localhost:3000/index.html
```
## Typical Project Structure
[Section titled “Typical Project Structure”](#typical-project-structure)
```plaintext
my-app/
├── public/
│ ├── index.html
│ ├── favicon.ico
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ └── app.js
│ └── images/
│ └── logo.png
└── src/
└── index.ts
```
Configuration:
```typescript
app.static('/public', {
root: './public',
listDirectory: true
});
// Or serve at root for SPA
app.static('/', {
root: './public'
});
```
## SPA (Single Page Application)
[Section titled “SPA (Single Page Application)”](#spa-single-page-application)
For SPAs, serve your build directory and handle client-side routing:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan();
// API routes
app.get('/api/users', (ctx) => ({ users: [] }));
app.get('/api/posts', (ctx) => ({ posts: [] }));
// Serve static files
app.static('/', {
root: './dist'
});
// Fallback to index.html for client-side routing
app.get('/*', (ctx) => {
return ctx.file('./dist/index.html', {
type: 'text/html'
});
});
app.listen();
```
## File Types
[Section titled “File Types”](#file-types)
Shokupan automatically sets the correct `Content-Type` header based on file extension:
* `.html` → `text/html`
* `.css` → `text/css`
* `.js` → `application/javascript`
* `.json` → `application/json`
* `.png` → `image/png`
* `.jpg`, `.jpeg` → `image/jpeg`
* `.svg` → `image/svg+xml`
* `.pdf` → `application/pdf`
* And many more…
## Security Considerations
[Section titled “Security Considerations”](#security-considerations)
Security
Be careful when enabling directory listing in production. Only enable it for directories you want to be publicly browsable.
```typescript
// ✅ Safe - specific public directory
app.static('/public', {
root: './public',
listDirectory: true
});
// ❌ Dangerous - entire project
app.static('/', {
root: '.',
listDirectory: true
});
```
## Caching Headers
[Section titled “Caching Headers”](#caching-headers)
Add cache control headers:
```typescript
const staticMiddleware = async (ctx, next) => {
const result = await next();
// Add cache headers for static assets
if (ctx.path.startsWith('/public')) {
ctx.set('Cache-Control', 'public, max-age=31536000');
}
return result;
};
app.use(staticMiddleware);
app.static('/public', {
root: './public'
});
```
## Custom 404
[Section titled “Custom 404”](#custom-404)
Handle missing static files:
```typescript
app.static('/files', {
root: './files',
listDirectory: true
});
// Fallback for 404
app.get('/files/*', (ctx) => {
return ctx.html('File Not Found
', 404);
});
```
## Development vs Production
[Section titled “Development vs Production”](#development-vs-production)
Different configurations for environments:
```typescript
const isDev = process.env.NODE_ENV !== 'production';
app.static('/public', {
root: './public',
listDirectory: isDev // Only in development
});
if (isDev) {
// Development-specific static routes
app.static('/docs', {
root: './docs',
listDirectory: true
});
}
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Routing](/core/routing/) - Learn about dynamic routing
* [Middleware](/core/middleware/) - Add caching and compression
* [Compression Plugin](/plugins/compression/) - Compress static assets
# Configuration
> Configure your Shokupan application
The `Shokupan` class accepts a configuration object to customize behavior.
## Basic Configuration
[Section titled “Basic Configuration”](#basic-configuration)
```typescript
const app = new Shokupan({
port: 3000,
hostname: 'localhost',
development: process.env.NODE_ENV !== 'production'
});
```
## Options Reference
[Section titled “Options Reference”](#options-reference)
### Server Options
[Section titled “Server Options”](#server-options)
| Option | Type | Default | Description |
| :-------------- | :-------------- | :------------ | :------------------------------------------------- |
| `port` | `number` | `3000` | The port the server should listen on. |
| `hostname` | `string` | `'localhost'` | The hostname to bind to. |
| `reusePort` | `boolean` | `false` | Allow multiple processes to bind to the same port. |
| `serverFactory` | `ServerFactory` | `Bun.serve` | Custom server factory (e.g., for Node.js support). |
### Application Options
[Section titled “Application Options”](#application-options)
| Option | Type | Default | Description |
| :------------------------ | :-------- | :------ | :---------------------------------------------------------------------------------------- |
| `development` | `boolean` | `auto` | Enable development mode (affects error pages, etc.). |
| `enableAsyncLocalStorage` | `boolean` | `false` | Enable `AsyncLocalStorage` for request-scoped globals. |
| `controllersOnly` | `boolean` | `false` | If true, disables `app.get()`, `app.post()` etc., enforcing controller-only architecture. |
### Features
[Section titled “Features”](#features)
| Option | Type | Default | Description |
| :------------------------- | :-------- | :------ | :----------------------------------------------------------------------- |
| `enableTracing` | `boolean` | `false` | Enable OpenTelemetry tracing integration. |
| `enableOpenApiGen` | `boolean` | `true` | Enable automatic OpenAPI specification generation. |
| `enableMiddlewareTracking` | `boolean` | `false` | Track middleware execution for debugging (required for Debug Dashboard). |
### Timeouts & Limits
[Section titled “Timeouts & Limits”](#timeouts--limits)
| Option | Type | Default | Description |
| :--------------- | :------- | :------------- | :------------------------------------------- |
| `readTimeout` | `number` | `30000` | Timeout for reading the request body (ms). |
| `requestTimeout` | `number` | `0` (disabled) | Global timeout for processing requests (ms). |
### Auto Backpressure
[Section titled “Auto Backpressure”](#auto-backpressure)
Protect your server from overload by shedding load when CPU usage is high.
| Option | Type | Default | Description |
| :------------------------- | :-------- | :------ | :---------------------------------------------------------- |
| `autoBackpressureFeedback` | `boolean` | `false` | Enable automatic load shedding. |
| `autoBackpressureLevel` | `number` | `60` | CPU usage % threshold to start rejecting requests with 503. |
# Installation
> Install Shokupan and set up your first project
## Prerequisites
[Section titled “Prerequisites”](#prerequisites)
Shokupan requires [Bun](https://bun.sh/) to be installed on your system.
### Install Bun
[Section titled “Install Bun”](#install-bun)
If you don’t have Bun installed yet:
```bash
# macOS, Linux, and WSL
curl -fsSL https://bun.sh/install | bash
# Windows (PowerShell)
powershell -c "irm bun.sh/install.ps1|iex"
```
Verify the installation:
```bash
bun --version
```
## Installing Shokupan
[Section titled “Installing Shokupan”](#installing-shokupan)
Install Shokupan in your project:
```bash
bun add shokupan
```
## Create Your First App
[Section titled “Create Your First App”](#create-your-first-app)
### 1. Initialize a new project
[Section titled “1. Initialize a new project”](#1-initialize-a-new-project)
```bash
mkdir my-shokupan-app
cd my-shokupan-app
bun init -y
```
### 2. Install Shokupan
[Section titled “2. Install Shokupan”](#2-install-shokupan)
```bash
bun add shokupan
```
### 3. Create your server
[Section titled “3. Create your server”](#3-create-your-server)
Create a file named `index.ts`:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
port: 3000,
development: true
});
app.get('/', (ctx) => {
return { message: 'Hello, Shokupan!' };
});
app.get('/users/:id', (ctx) => {
return {
id: ctx.params.id,
name: 'Alice',
email: 'alice@example.com'
};
});
app.post('/users', async (ctx) => {
const body = await ctx.body();
return {
message: 'User created',
data: body
};
});
console.log('🍞 Server running at http://localhost:3000');
app.listen();
```
### 4. Run your server
[Section titled “4. Run your server”](#4-run-your-server)
```bash
bun run index.ts
```
Your server is now running! Open `http://localhost:3000` in your browser.
## Development Mode
[Section titled “Development Mode”](#development-mode)
For automatic reloading during development, use the `--watch` flag:
```bash
bun --watch index.ts
```
Now your server will automatically restart when you make changes to your code.
## Project Structure
[Section titled “Project Structure”](#project-structure)
A typical Shokupan project structure might look like:
```plaintext
my-shokupan-app/
├── src/
│ ├── controllers/
│ │ ├── user.controller.ts
│ │ └── post.controller.ts
│ ├── middleware/
│ │ ├── auth.ts
│ │ └── logger.ts
│ ├── services/
│ │ └── user.service.ts
│ └── main.ts
├── package.json
└── tsconfig.json
```
## TypeScript Configuration
[Section titled “TypeScript Configuration”](#typescript-configuration)
For the best experience, configure your `tsconfig.json`:
```json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["ESNext"],
"types": ["bun-types"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true,
"esModuleInterop": true
}
}
```
The important settings for Shokupan are:
* `experimentalDecorators: true` - Required for controller decorators
* `emitDecoratorMetadata: true` - Enables metadata for dependency injection
## Next Steps
[Section titled “Next Steps”](#next-steps)
Now that you have Shokupan installed, learn about:
* [Quick Start Guide](/getting-started/quick-start/) - Build your first real application
* [Routing](/core/routing/) - Learn about routing and path parameters
* [Controllers](/core/controllers/) - Use decorators for structured APIs
* [Middleware](/core/middleware/) - Add cross-cutting concerns
# Quick Start
> Build your first Shokupan application
This guide will walk you through building a simple RESTful API with Shokupan.
## What We’ll Build
[Section titled “What We’ll Build”](#what-well-build)
A simple TODO API with the following features:
* List all todos
* Get a single todo
* Create a new todo
* Update a todo
* Delete a todo
## Basic Setup
[Section titled “Basic Setup”](#basic-setup)
First, make sure you have [Shokupan installed](/getting-started/installation/).
Create a new file `app.ts`:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
port: 3000,
development: true
});
// In-memory storage (use a database in production!)
const todos: Array<{ id: number; title: string; completed: boolean }> = [];
let nextId = 1;
// Routes will go here
app.listen();
console.log('🍞 Server running at http://localhost:3000');
```
## Adding Routes
[Section titled “Adding Routes”](#adding-routes)
### List All Todos
[Section titled “List All Todos”](#list-all-todos)
```typescript
app.get('/todos', (ctx) => {
return { todos };
});
```
### Get Single Todo
[Section titled “Get Single Todo”](#get-single-todo)
```typescript
app.get('/todos/:id', (ctx) => {
const id = parseInt(ctx.params.id);
const todo = todos.find(t => t.id === id);
if (!todo) {
return ctx.json({ error: 'Todo not found' }, 404);
}
return { todo };
});
```
### Create Todo
[Section titled “Create Todo”](#create-todo)
```typescript
app.post('/todos', async (ctx) => {
const body = await ctx.body();
const todo = {
id: nextId++,
title: body.title,
completed: false
};
todos.push(todo);
return ctx.json({ todo }, 201);
});
```
### Update Todo
[Section titled “Update Todo”](#update-todo)
```typescript
app.put('/todos/:id', async (ctx) => {
const id = parseInt(ctx.params.id);
const todo = todos.find(t => t.id === id);
if (!todo) {
return ctx.json({ error: 'Todo not found' }, 404);
}
const body = await ctx.body();
if (body.title !== undefined) todo.title = body.title;
if (body.completed !== undefined) todo.completed = body.completed;
return { todo };
});
```
### Delete Todo
[Section titled “Delete Todo”](#delete-todo)
```typescript
app.delete('/todos/:id', (ctx) => {
const id = parseInt(ctx.params.id);
const index = todos.findIndex(t => t.id === id);
if (index === -1) {
return ctx.json({ error: 'Todo not found' }, 404);
}
todos.splice(index, 1);
return { message: 'Todo deleted' };
});
```
## Adding Validation
[Section titled “Adding Validation”](#adding-validation)
Let’s add validation using Zod:
```bash
bun add zod
```
Update your todo creation route:
```typescript
import { validate } from 'shokupan';
import { z } from 'zod';
const createTodoSchema = z.object({
title: z.string().min(1, 'Title is required'),
});
app.post('/todos',
validate({ body: createTodoSchema }),
async (ctx) => {
const body = await ctx.body();
const todo = {
id: nextId++,
title: body.title,
completed: false
};
todos.push(todo);
return ctx.json({ todo }, 201);
}
);
```
## Adding Middleware
[Section titled “Adding Middleware”](#adding-middleware)
Let’s add a simple logging middleware:
```typescript
app.use(async (ctx, next) => {
const start = Date.now();
console.log(`→ ${ctx.method} ${ctx.path}`);
const result = await next();
const duration = Date.now() - start;
console.log(`← ${ctx.method} ${ctx.path} - ${duration}ms`);
return result;
});
```
## Using Controllers
[Section titled “Using Controllers”](#using-controllers)
For better organization, let’s refactor using controllers:
```typescript
import { Controller, Get, Post, Put, Delete, Param, Body, Ctx } from 'shokupan';
import { validate } from 'shokupan';
import { z } from 'zod';
const todos: Array<{ id: number; title: string; completed: boolean }> = [];
let nextId = 1;
const createTodoSchema = z.object({
title: z.string().min(1),
});
export class TodoController {
@Get('/')
getAllTodos() {
return { todos };
}
@Get('/:id')
getTodo(@Param('id') idStr: string, @Ctx() ctx: any) {
const id = parseInt(idStr);
const todo = todos.find(t => t.id === id);
if (!todo) {
return ctx.json({ error: 'Todo not found' }, 404);
}
return { todo };
}
@Post('/')
async createTodo(@Body() body: any) {
const todo = {
id: nextId++,
title: body.title,
completed: false
};
todos.push(todo);
return { todo };
}
@Put('/:id')
async updateTodo(
@Param('id') idStr: string,
@Body() body: any,
@Ctx() ctx: any
) {
const id = parseInt(idStr);
const todo = todos.find(t => t.id === id);
if (!todo) {
return ctx.json({ error: 'Todo not found' }, 404);
}
if (body.title !== undefined) todo.title = body.title;
if (body.completed !== undefined) todo.completed = body.completed;
return { todo };
}
@Delete('/:id')
deleteTodo(@Param('id') idStr: string, @Ctx() ctx: any) {
const id = parseInt(idStr);
const index = todos.findIndex(t => t.id === id);
if (index === -1) {
return ctx.json({ error: 'Todo not found' }, 404);
}
todos.splice(index, 1);
return { message: 'Todo deleted' };
}
}
// Mount the controller
app.mount('/todos', TodoController);
```
## Testing the API
[Section titled “Testing the API”](#testing-the-api)
Start your server:
```bash
bun run app.ts
```
Test with curl:
```bash
# Create a todo
curl -X POST http://localhost:3000/todos \
-H "Content-Type: application/json" \
-d '{"title": "Learn Shokupan"}'
# Get all todos
curl http://localhost:3000/todos
# Get a specific todo
curl http://localhost:3000/todos/1
# Update a todo
curl -X PUT http://localhost:3000/todos/1 \
-H "Content-Type: application/json" \
-d '{"completed": true}'
# Delete a todo
curl -X DELETE http://localhost:3000/todos/1
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
Great! You’ve built your first Shokupan API. Now explore:
* [Routing](/core/routing/) - Advanced routing patterns
* [Middleware](/core/middleware/) - Create custom middleware
* [Validation](/plugins/validation/) - Deep dive into validation
* [Authentication](/plugins/authentication/) - Add OAuth2 authentication
* [OpenAPI](/advanced/openapi/) - Generate API documentation
# Advanced Features
> Deep dive into advanced Shokupan features.
## Automatic Backpressure
[Section titled “Automatic Backpressure”](#automatic-backpressure)
Protect your server from overload by shedding load when CPU usage is high. This functionality is built-in and requires no external dependencies.
### Configuration
[Section titled “Configuration”](#configuration)
```typescript
const app = new Shokupan({
// Monitor CPU and reject requests when usage > 80%
autoBackpressureFeedback: true,
autoBackpressureLevel: 80
});
```
### Behavior
[Section titled “Behavior”](#behavior)
* Passively monitors system CPU usage.
* If usage exceeds `autoBackpressureLevel`, new requests are immediately rejected with `503 Service Unavailable`.
* This prevents the event loop from becoming completely unresponsive during spikes.
## Middleware Tracking
[Section titled “Middleware Tracking”](#middleware-tracking)
For debugging complex applications, you can enable middleware tracking to see the exact execution path of a request.
### Configuration
[Section titled “Configuration”](#configuration-1)
```typescript
const app = new Shokupan({
enableMiddlewareTracking: true
});
```
### Usage
[Section titled “Usage”](#usage)
When enabled, the `ctx.handlerStack` property will contain an array of all handlers and middleware that have executed for the current request.
This is also required for the [Debug Dashboard](/plugins/debug-dashboard) to visualize the request flow.
# CLI Tools
> Shokupan command-line tools
Shokupan includes a CLI for scaffolding and code generation.
## Installation
[Section titled “Installation”](#installation)
```bash
# Install globally
bun add -g shokupan
# Or use with bunx
bunx shokupan
```
## Commands
[Section titled “Commands”](#commands)
### Generate Controller
[Section titled “Generate Controller”](#generate-controller)
```bash
shokupan generate controller User
# or
skp g controller User
```
Generates:
```typescript
import { Get, Post, Put, Delete, Param, Body } from 'shokupan';
export class UserController {
@Get('/')
async getAll() {
return { users: [] };
}
@Get('/:id')
async getById(@Param('id') id: string) {
return { id };
}
@Post('/')
async create(@Body() body: any) {
return { created: body };
}
@Put('/:id')
async update(@Param('id') id: string, @Body() body: any) {
return { id, updated: body };
}
@Delete('/:id')
async delete(@Param('id') id: string) {
return { id, deleted: true };
}
}
```
### Generate Middleware
[Section titled “Generate Middleware”](#generate-middleware)
```bash
skp g middleware auth
```
### Generate Plugin
[Section titled “Generate Plugin”](#generate-plugin)
```bash
skp g plugin custom
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Controllers](/core/controllers/) - Learn about controllers
* [Middleware](/core/middleware/) - Create custom middleware
# Deployment
> Deploy your Shokupan application
## Using Bun
[Section titled “Using Bun”](#using-bun)
```bash
bun run src/index.ts
```
## Node.js & Deno
[Section titled “Node.js & Deno”](#nodejs--deno)
Shokupan is built for Bun, but can run on Node.js and Deno using the server adapter.
### Node.js
[Section titled “Node.js”](#nodejs)
Use the `createHttpServer` factory:
```typescript
import { Shokupan, createHttpServer } from 'shokupan';
const app = new Shokupan({
serverFactory: createHttpServer()
});
app.listen(3000);
```
Then run with `node`:
```bash
node dist/index.js
```
### Deno
[Section titled “Deno”](#deno)
Deno support is experimental but uses the same adapter pattern if needed, or runs natively if Deno implements `Bun.serve` compatibility layer in the future. Currently, use the Node compatibility layer in Deno:
```bash
deno run -A dist/index.js
```
```dockerfile
FROM oven/bun:1
WORKDIR /app
COPY package.json bun.lock ./
RUN bun install --production
COPY . .
EXPOSE 3000
CMD ["bun", "run", "src/index.ts"]
```
Build and run:
```bash
docker build -t my-app .
docker run -p 3000:3000 my-app
```
## Environment Variables
[Section titled “Environment Variables”](#environment-variables)
Create a `.env` file:
```bash
PORT=3000
NODE_ENV=production
DATABASE_URL=postgresql://...
JWT_SECRET=your-secret
```
Load in your app:
```typescript
const app = new Shokupan({
port: parseInt(process.env.PORT || '3000'),
development: process.env.NODE_ENV !== 'production'
});
```
## Production Checklist
[Section titled “Production Checklist”](#production-checklist)
* [ ] Use environment variables for secrets
* [ ] Enable HTTPS
* [ ] Set security headers
* [ ] Configure CORS properly
* [ ] Add rate limiting
* [ ] Use production database
* [ ] Set up logging
* [ ] Configure monitoring
# Global Type Augmentation
> This guide shows how to use TypeScript's **module augmentation** to globally extend `ShokupanContext` types, similar to how `express-session` extends the Express `Request` type.
## Overview
[Section titled “Overview”](#overview)
By default, `ShokupanContext` uses generic types that must be explicitly provided:
```typescript
const app = new Shokupan();
const router = new ShokupanRouter();
```
However, for **decorator-based controllers**, there’s no direct connection to the app instance, making it difficult to get type safety. Module augmentation solves this problem by **globally** extending the context types.
## Basic Module Augmentation
[Section titled “Basic Module Augmentation”](#basic-module-augmentation)
Create a TypeScript declaration file (e.g., `src/types/shokupan.d.ts`):
```typescript
import 'shokupan';
// Define your application state
interface MyAppState {
userId: string;
requestId: string;
session: {
id: string;
data: Record;
};
}
// Augment the ShokupanContext module
declare module 'shokupan' {
interface ShokupanContext {
// Override the state property with your custom type
state: MyAppState;
}
}
```
**Important:** Your `tsconfig.json` must include this file:
```json
{
"compilerOptions": {
"types": ["./src/types/shokupan.d.ts"]
},
"include": ["src/**/*"]
}
```
## Using Augmented Types in Controllers
[Section titled “Using Augmented Types in Controllers”](#using-augmented-types-in-controllers)
Once augmented, **all** decorator controllers automatically get typed `ctx.state`:
```typescript
import { Get, Post, Ctx, Body } from 'shokupan';
import { ShokupanContext } from 'shokupan';
export class UserController {
@Get('/:id')
async getUser(@Ctx() ctx: ShokupanContext) {
// ✅ ctx.state is now typed as MyAppState
const userId = ctx.state.userId; // ✅ Type-safe!
const sessionId = ctx.state.session.id; // ✅ Type-safe!
return {
userId,
sessionId
};
}
@Post('/create')
async createUser(@Body() body: any, @Ctx() ctx: ShokupanContext) {
// ✅ Full IntelliSense for state
ctx.state.requestId; // ✅ Works!
return ctx.json({ created: true });
}
}
```
## Advanced: Extending Multiple Properties
[Section titled “Advanced: Extending Multiple Properties”](#advanced-extending-multiple-properties)
You can augment other context properties as well:
```typescript
import 'shokupan';
interface CustomUser {
id: string;
email: string;
role: 'admin' | 'user';
}
declare module 'shokupan' {
interface ShokupanContext {
// Custom state
state: {
user?: CustomUser;
requestId: string;
startTime: number;
};
// Add custom methods
getCurrentUser(): CustomUser | undefined;
// Add custom properties (e.g., from plugins)
session: {
get(key: string): any;
set(key: string, value: any): void;
};
}
}
```
Then implement the methods in middleware:
```typescript
app.use(async (ctx, next) => {
// Add the custom method
(ctx as any).getCurrentUser = () => ctx.state.user;
return next();
});
```
## Comparison: Augmentation vs. Generics
[Section titled “Comparison: Augmentation vs. Generics”](#comparison-augmentation-vs-generics)
### Module Augmentation (Global)
[Section titled “Module Augmentation (Global)”](#module-augmentation-global)
**✅ Pros:**
* Works automatically in decorator controllers
* No need to pass generics everywhere
* Plugin-friendly (plugins can augment globally)
* Similar to Express/Koa patterns
**❌ Cons:**
* Global modification (affects all contexts)
* Less explicit
* Can be harder to track which middleware sets what
**Best for:** Decorator-based controllers, Express-style apps
### Generic Types (Explicit)
[Section titled “Generic Types (Explicit)”](#generic-types-explicit)
**✅ Pros:**
* Explicit and clear
* Type safety enforced at compile time
* Different routers can have different state types
* Better for large apps with multiple contexts
**❌ Cons:**
* Verbose (must specify generics)
* Doesn’t work well with decorator controllers
* More boilerplate
**Best for:** Router-based architecture, type-strict apps
## Hybrid Approach (Recommended)
[Section titled “Hybrid Approach (Recommended)”](#hybrid-approach-recommended)
You can use **both** approaches:
```typescript
// Global augmentation for common properties
declare module 'shokupan' {
interface ShokupanContext {
state: {
requestId: string;
timestamp: number;
};
}
}
// Router-specific state extends the global
interface AdminState extends ShokupanContext['state'] {
adminUser: {
id: string;
permissions: string[];
};
}
class AdminRouter extends ShokupanRouter {
constructor() {
super();
this.get('/dashboard', (ctx) => {
// Has both requestId (global) AND adminUser (router-specific)
ctx.state.requestId; // ✅ From global augmentation
ctx.state.adminUser; // ✅ From AdminState generic
});
}
}
```
## Examples from Popular Libraries
[Section titled “Examples from Popular Libraries”](#examples-from-popular-libraries)
This pattern is used by many TypeScript libraries:
### express-session
[Section titled “express-session”](#express-session)
```typescript
declare module 'express-serve-static-core' {
interface Request {
session: Session & Partial;
}
}
```
### passport
[Section titled “passport”](#passport)
```typescript
declare module 'express-serve-static-core' {
interface Request {
user?: Express.User;
login(user: Express.User, done: (err: any) => void): void;
logout(): void;
}
}
```
### Shokupan equivalent
[Section titled “Shokupan equivalent”](#shokupan-equivalent)
```typescript
declare module 'shokupan' {
interface ShokupanContext {
user?: { id: string; email: string };
login(user: any): Promise;
logout(): void;
}
}
```
## Best Practices
[Section titled “Best Practices”](#best-practices)
1. **Keep augmentations in a dedicated file** (`src/types/shokupan.d.ts`)
2. **Document what each middleware adds** to the state
3. **Use optional properties** (`user?:`) when not all routes have them
4. **Combine with runtime checks** to ensure type safety matches runtime behavior
5. **Use interface merging** - you can have multiple `declare module 'shokupan'` blocks across files
## Troubleshooting
[Section titled “Troubleshooting”](#troubleshooting)
### Types not recognized?
[Section titled “Types not recognized?”](#types-not-recognized)
Ensure your `tsconfig.json` includes the declaration file:
```json
{
"include": ["src/**/*"],
"compilerOptions": {
"moduleResolution": "bundler",
"types": ["bun-types"]
}
}
```
### Conflicts with generic types?
[Section titled “Conflicts with generic types?”](#conflicts-with-generic-types)
Module augmentation takes precedence. If you use both, the augmented types will override generics for the `state` property.
### IDE not showing types?
[Section titled “IDE not showing types?”](#ide-not-showing-types)
1. Restart your TypeScript server (VS Code: `Cmd/Ctrl + Shift + P` → “Restart TS Server”)
2. Ensure the `.d.ts` file is in your `include` paths
3. Check for syntax errors in your declaration file
## Complete Example
[Section titled “Complete Example”](#complete-example)
**src/types/shokupan.d.ts:**
```typescript
import 'shokupan';
declare module 'shokupan' {
interface ShokupanContext {
state: {
requestId: string;
userId?: string;
session?: {
id: string;
data: Record;
};
};
}
}
```
**src/middleware/session.ts:**
```typescript
import { Middleware } from 'shokupan';
export const sessionMiddleware: Middleware = async (ctx, next) => {
ctx.state.requestId = crypto.randomUUID();
ctx.state.session = {
id: 'session-' + Math.random(),
data: {}
};
return next();
};
```
**src/controllers/user.controller.ts:**
```typescript
import { Get, Ctx } from 'shokupan';
import { ShokupanContext } from 'shokupan';
export class UserController {
@Get('/profile')
async getProfile(@Ctx() ctx: ShokupanContext) {
// ✅ Full type safety without generics!
const sessionId = ctx.state.session?.id;
return {
requestId: ctx.state.requestId,
sessionId
};
}
}
```
**src/main.ts:**
```typescript
import { Shokupan } from 'shokupan';
import { sessionMiddleware } from './middleware/session';
import { UserController } from './controllers/user.controller';
const app = new Shokupan();
app.use(sessionMiddleware);
app.mount('/users', UserController);
app.listen();
```
## Conclusion
[Section titled “Conclusion”](#conclusion)
Module augmentation provides a clean way to achieve global type safety in Shokupan, especially for decorator-based controllers. It’s a powerful TypeScript feature that makes your codebase more maintainable while preserving the familiar Express-style patterns.
For complex applications, consider the **hybrid approach** that combines global augmentation for common properties with router-specific generics for specialized state.
# JSON Parser Configuration
> Configure which JSON parser to use for parsing request bodies.
## Available Parsers
[Section titled “Available Parsers”](#available-parsers)
### 1. Native (`'native'`) - Default
[Section titled “1. Native ('native') - Default”](#1-native-native---default)
Uses the built-in `JSON.parse` from Bun or Node.js.
**Performance**: ⚡⚡⚡ Fastest (baseline)\
**Error Messages**: Standard\
**Security**: Standard\
**Recommended for**: Production use
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
jsonParser: 'native' // This is the default
});
```
### 2. parse-json (`'parse-json'`)
[Section titled “2. parse-json ('parse-json')”](#2-parse-json-parse-json)
Uses the [`parse-json`](https://www.npmjs.com/package/parse-json) library for enhanced error messages.
**Performance**: ⚡⚡⚡ \~5% slower than native (minimal overhead)\
**Error Messages**: ✨ Excellent - shows context and helpful hints\
**Security**: Standard\
**Recommended for**: Development and debugging
**Installation**:
```bash
bun add parse-json
```
**Usage**:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
jsonParser: 'parse-json'
});
app.post('/api/data', async (ctx) => {
const body = await ctx.body();
return ctx.json({ received: body });
});
```
**Benefits**:
* Much better error messages when JSON is malformed
* Shows the position and context of JSON syntax errors
* Minimal performance impact (\~5% slower on Bun, competitive with native on Node.js)
### 3. secure-json-parse (`'secure-json-parse'`)
[Section titled “3. secure-json-parse ('secure-json-parse')”](#3-secure-json-parse-secure-json-parse)
Uses the [`secure-json-parse`](https://www.npmjs.com/package/secure-json-parse) library for protection against prototype pollution attacks.
**Performance**: ⚡⚡ 20-30% slower than native\
**Error Messages**: Standard\
**Security**: 🔒 Protected against prototype pollution\
**Recommended for**: Parsing untrusted user input
**Installation**:
```bash
bun add secure-json-parse
```
**Usage**:
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({
jsonParser: 'secure-json-parse'
});
app.post('/api/webhook', async (ctx) => {
// Safe from prototype pollution attacks
const body = await ctx.body();
return ctx.json({ processed: true });
});
```
**Benefits**:
* Protects against prototype pollution attacks
* Safely parses JSON from untrusted sources
* Prevents `__proto__`, `constructor`, and `prototype` pollution
**Trade-offs**:
* 20-30% performance penalty compared to native
* Only use when parsing untrusted input
## Performance Comparison
[Section titled “Performance Comparison”](#performance-comparison)
Based on benchmarks with 100,000 iterations:
| Parser | Simple Objects | Nested Objects | Arrays | Large Datasets |
| ------------------------- | ----------------- | ---------------- | ----------------- | ---------------- |
| `native` (Bun) | **14.5M ops/sec** | **4.1M ops/sec** | **79.8K ops/sec** | **9.7K ops/sec** |
| `parse-json` (Bun) | 10.4M ops/sec | 2.8M ops/sec | 51K ops/sec | 3.2K ops/sec |
| `secure-json-parse` (Bun) | 8.2M ops/sec | 2.2M ops/sec | 44.5K ops/sec | 2.6K ops/sec |
*Full benchmark results available in [`src/test/json-performance-results.md`](../src/test/json-performance-results.md)*
## Recommendations
[Section titled “Recommendations”](#recommendations)
### Production Applications
[Section titled “Production Applications”](#production-applications)
✅ Use `'native'` (default) for best performance
```typescript
const app = new Shokupan({
jsonParser: 'native' // or omit this line
});
```
### Development/Debugging
[Section titled “Development/Debugging”](#developmentdebugging)
✅ Use `'parse-json'` for better error messages with minimal overhead
```typescript
const app = new Shokupan({
jsonParser: process.env.NODE_ENV === 'development' ? 'parse-json' : 'native'
});
```
### Parsing Untrusted Input
[Section titled “Parsing Untrusted Input”](#parsing-untrusted-input)
✅ Use `'secure-json-parse'` for webhooks or user-generated content
```typescript
// Main app uses native parser
const app = new Shokupan({
jsonParser: 'native'
});
// Separate router for untrusted webhooks
const webhookRouter = new ShokupanRouter({
jsonParser: 'secure-json-parse'
});
webhookRouter.post('/webhook', async (ctx) => {
const payload = await ctx.body(); // Safely parsed
return ctx.json({ ok: true });
});
app.mount('/external', webhookRouter);
```
## Error Handling
[Section titled “Error Handling”](#error-handling)
### Native Parser
[Section titled “Native Parser”](#native-parser)
```typescript
// Standard JSON error
{
"error": "Unexpected token 'i', \"invalid\" is not valid JSON"
}
```
### parse-json Parser
[Section titled “parse-json Parser”](#parse-json-parser)
```typescript
// Enhanced error with context
{
"error": "Unexpected token i in JSON at position 1 while parsing '{invalid}'\n\n > 1 | {invalid}\n | ^"
}
```
## Migration Guide
[Section titled “Migration Guide”](#migration-guide)
### From Native to parse-json
[Section titled “From Native to parse-json”](#from-native-to-parse-json)
No code changes needed - just update config:
```diff
const app = new Shokupan({
jsonParser: 'parse-json'
});
```
### From Native to secure-json-parse
[Section titled “From Native to secure-json-parse”](#from-native-to-secure-json-parse)
No code changes needed - just update config:
```diff
const app = new Shokupan({
jsonParser: 'secure-json-parse'
});
```
## Notes
[Section titled “Notes”](#notes)
* If a parser library is not installed, Shokupan will automatically fall back to native `JSON.parse` with a warning
* The parser configuration applies to all JSON body parsing in the application
* Both `parse-json` and `secure-json-parse` are optional peer dependencies
* Performance impact is most noticeable on high-throughput APIs processing large payloads
## See Also
[Section titled “See Also”](#see-also)
* [JSON Performance Benchmarks](../src/test/json-performance-results.md)
* [parse-json on npm](https://www.npmjs.com/package/parse-json)
* [secure-json-parse on npm](https://www.npmjs.com/package/secure-json-parse)
# Plugin Dependencies
> Shokupan uses an optional peer dependency model for plugin-specific packages. This keeps the core framework lean while allowing you to install only the features you need.
## Overview
[Section titled “Overview”](#overview)
Most of Shokupan’s dependencies are now **optional peer dependencies**. This means:
* ✅ Smaller install size for basic apps
* ✅ Install only what you use
* ✅ Clear error messages when dependencies are missing
* ✅ Better tree-shaking and bundle optimization
## Plugin Dependencies
[Section titled “Plugin Dependencies”](#plugin-dependencies)
### Validation Plugin
[Section titled “Validation Plugin”](#validation-plugin)
**Packages**: `class-transformer`, `class-validator`, `reflect-metadata`
```bash
bun add class-transformer class-validator reflect-metadata
```
**Usage**:
```typescript
import { validate } from 'shokupan';
import { IsString, IsNumber } from 'class-validator';
class CreateUserDto {
@IsString()
name: string;
@IsNumber()
age: number;
}
app.post('/users', validate({ body: CreateUserDto }), async (ctx) => {
const user = await ctx.body(); // Validated and transformed
return ctx.json({ user });
});
```
### Auth Plugin
[Section titled “Auth Plugin”](#auth-plugin)
**Packages**: `arctic`, `jose`
```bash
bun add arctic jose
```
**Usage**:
```typescript
import { AuthPlugin } from 'shokupan';
const auth = new AuthPlugin({
jwtSecret: process.env.JWT_SECRET,
providers: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
redirectUri: 'http://localhost:3000/auth/github/callback'
}
}
});
app.mount('/auth', auth);
```
### OpenAPI Validator Plugin
[Section titled “OpenAPI Validator Plugin”](#openapi-validator-plugin)
**Packages**: `ajv`, `ajv-formats`
```bash
bun add ajv ajv-formats
```
**Usage**:
```typescript
import { enableOpenApiValidation } from 'shokupan';
const app = new Shokupan({ enableOpenApiGen: true });
// Add routes...
enableOpenApiValidation(app); // Validates requests against OpenAPI spec
```
### Scalar API Documentation
[Section titled “Scalar API Documentation”](#scalar-api-documentation)
**Packages**: `@scalar/api-reference`, `eta`
```bash
bun add @scalar/api-reference eta
```
**Usage**:
```typescript
import { mountScalar } from 'shokupan';
const app = new Shokupan({ enableOpenApiGen: true });
// Add routes...
mountScalar(app, '/docs', {
title: 'My API Documentation'
});
```
### Static File Serving
[Section titled “Static File Serving”](#static-file-serving)
**Packages**: `eta`
```bash
bun add eta
```
**Usage**:
```typescript
import { serveStatic } from 'shokupan';
app.mount('/static', serveStatic({
root: './public',
listDirectory: true
}));
```
### JSON Parser Options
[Section titled “JSON Parser Options”](#json-parser-options)
**Packages**: `parse-json`, `secure-json-parse`
```bash
# For better error messages
bun add parse-json
# For security against prototype pollution
bun add secure-json-parse
```
**Usage**:
```typescript
const app = new Shokupan({
jsonParser: 'parse-json' // or 'secure-json-parse' or 'native'
});
```
## Core Dependencies
[Section titled “Core Dependencies”](#core-dependencies)
These are always installed and required for core functionality:
| Package | Purpose |
| ----------------------- | ---------------------------- |
| `@scalar/openapi-types` | TypeScript types for OpenAPI |
| `@opentelemetry/*` | Optional tracing support |
| `@surrealdb/node` | Session storage backend |
| `tslib` | TypeScript runtime helpers |
## Error Messages
[Section titled “Error Messages”](#error-messages)
When you try to use a plugin without its dependencies installed, you’ll get a clear error message:
```plaintext
Error: class-transformer and class-validator are required for class-based validation.
Install them with: bun add class-transformer class-validator reflect-metadata
```
## Migration from v0.4.x
[Section titled “Migration from v0.4.x”](#migration-from-v04x)
If you’re upgrading from an earlier version where all dependencies were bundled:
### 1. Identify which plugins you use
[Section titled “1. Identify which plugins you use”](#1-identify-which-plugins-you-use)
Check your code for imports from:
* `validation.ts` → needs class-validator packages
* `auth.ts` / `AuthPlugin` → needs arctic, jose
* `openapi-validator.ts` → needs ajv packages
* `serveStatic` / `mountScalar` → needs eta
* `@scalar/api-reference` → needs @scalar/api-reference
### 2. Install the dependencies you need
[Section titled “2. Install the dependencies you need”](#2-install-the-dependencies-you-need)
```bash
# Example: If you use validation and auth
bun add class-transformer class-validator reflect-metadata arctic jose
```
### 3. No code changes needed!
[Section titled “3. No code changes needed!”](#3-no-code-changes-needed)
Your existing code will continue to work. The only difference is you need to install the dependencies explicitly.
## Development vs Production
[Section titled “Development vs Production”](#development-vs-production)
### Development Best Practices
[Section titled “Development Best Practices”](#development-best-practices)
Install all optional dependencies for development:
```bash
bun add -d class-transformer class-validator reflect-metadata \
arctic jose ajv ajv-formats @scalar/api-reference eta \
parse-json secure-json-parse
```
### Production Best Practices
[Section titled “Production Best Practices”](#production-best-practices)
Install only what you use:
```bash
# Example: Auth-only API
bun add arctic jose
# Example: Validated REST API with docs
bun add class-transformer class-validator reflect-metadata \
@scalar/api-reference eta
```
## Bundle Size Impact
[Section titled “Bundle Size Impact”](#bundle-size-impact)
Approximate package sizes (minified + gzipped):
| Package | Size | Purpose |
| ----------------------- | ------- | ---------------------- |
| `class-validator` | \~50KB | Validation decorators |
| `class-transformer` | \~20KB | Object transformation |
| `arctic` | \~30KB | OAuth providers |
| `jose` | \~25KB | JWT operations |
| `ajv` | \~45KB | JSON Schema validation |
| `@scalar/api-reference` | \~200KB | API documentation UI |
| `eta` | \~5KB | Template engine |
**Total if using all**: \~375KB\
**Core framework only**: \~50KB
By installing only what you need, you can significantly reduce your bundle size!
## Troubleshooting
[Section titled “Troubleshooting”](#troubleshooting)
### ”Cannot find module” errors
[Section titled “”Cannot find module” errors”](#cannot-find-module-errors)
**Solution**: Install the missing package shown in the error message.
### Reflection metadata errors
[Section titled “Reflection metadata errors”](#reflection-metadata-errors)
If using class-validator, ensure you have:
1. Installed `reflect-metadata`
2. Imported it at the top of your entry file:
```typescript
import 'reflect-metadata';
```
### TypeScript errors
[Section titled “TypeScript errors”](#typescript-errors)
Ensure you have the type definitions installed:
```bash
bun add -d @types/node
```
## See Also
[Section titled “See Also”](#see-also)
* [Validation Plugin Documentation](./validation.md)
* [Authentication Plugin Documentation](./auth.md)
* [JSON Parser Configuration](./json-parser-configuration.md)
# Production Best Practices
> Comprehensive guide for running Shokupan applications in production
This guide covers best practices, performance optimization, and recommended configurations for running Shokupan in production environments.
## Configuration
[Section titled “Configuration”](#configuration)
### Basic Production Setup
[Section titled “Basic Production Setup”](#basic-production-setup)
```typescript
import { Shokupan, Compression, SecurityHeaders, RateLimit } from 'shokupan';
const app = new Shokupan({
port: parseInt(process.env.PORT || '3000'),
development: false,
enableAsyncLocalStorage: false, // Disable unless needed
logger: {
verbose: false,
info: console.info,
debug: () => {}, // Disable debug logs in production
warning: console.warn,
error: console.error,
fatal: console.error
}
});
// Apply production middleware
app.use(SecurityHeaders());
app.use(RateLimit({ windowMs: 60000, max: 100 }));
app.use(Compression({ threshold: 1024 }));
await app.listen();
```
## Logging
[Section titled “Logging”](#logging)
### Structured Logging
[Section titled “Structured Logging”](#structured-logging)
Use a structured logging library for better observability:
```typescript
import { Shokupan } from 'shokupan';
import pino from 'pino';
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: false,
translateTime: 'SYS:standard',
ignore: 'pid,hostname'
}
}
});
const app = new Shokupan({
logger: {
verbose: false,
info: (msg) => logger.info(msg),
debug: (msg) => logger.debug(msg),
warning: (msg) => logger.warn(msg),
error: (msg) => logger.error(msg),
fatal: (msg) => logger.fatal(msg)
}
});
```
### Request Logging Middleware
[Section titled “Request Logging Middleware”](#request-logging-middleware)
```typescript
app.use(async (ctx, next) => {
const start = Date.now();
const result = await next();
const duration = Date.now() - start;
logger.info({
method: ctx.request.method,
path: ctx.path,
status: ctx.response?.status || 200,
duration,
ip: ctx.request.headers.get('x-forwarded-for') || 'unknown'
});
return result;
});
```
## Performance Optimization
[Section titled “Performance Optimization”](#performance-optimization)
### Enable Compression
[Section titled “Enable Compression”](#enable-compression)
> \[!IMPORTANT] Compression can dramatically improve performance for larger payloads by reducing network I/O overhead.
```typescript
import { Compression } from 'shokupan';
app.use(Compression({
threshold: 1024 // Only compress responses larger than 1KB
}));
```
#### Why zstd Compression Improves Performance
[Section titled “Why zstd Compression Improves Performance”](#why-zstd-compression-improves-performance)
When running on Bun, zstd compression provides **significant performance benefits**:
**Benchmark Results** (Shokupan on Bun):
* **Without compression**: 3,389 req/s
* **With zstd compression**: 4,120 req/s (\~21% improvement)
**Compression Ratios**:
* Small payloads (1.2 MB): **99.8% reduction** (540x compression ratio)
* Large payloads (16 MB): **99.7% reduction** (387x compression ratio)
**Why it’s faster**:
1. **Reduced network I/O**: Transmitting 2-40 KB instead of 1-16 MB
2. **Less memory operations**: Fewer buffer allocations and memory copies through the network stack
3. **Fast compression**: Bun’s native `zstdCompress` is extremely efficient
4. **Lower total CPU**: The CPU cost of compression is less than the saved I/O processing overhead
> \[!TIP] For APIs serving JSON responses larger than 10 KB, enable compression for measurable performance gains.
### Disable Async Local Storage
[Section titled “Disable Async Local Storage”](#disable-async-local-storage)
Unless you specifically need AsyncLocalStorage (for request tracing, etc.), disable it:
```typescript
const app = new Shokupan({
enableAsyncLocalStorage: false // ~5-10% performance improvement
});
```
### Connection Pooling
[Section titled “Connection Pooling”](#connection-pooling)
For database connections, use connection pooling:
```typescript
import { Pool } from 'pg';
const pool = new Pool({
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
// Use the pool in your routes
app.get('/users', async (ctx) => {
const { rows } = await pool.query('SELECT * FROM users');
return ctx.json(rows);
});
```
## Security
[Section titled “Security”](#security)
### Security Headers
[Section titled “Security Headers”](#security-headers)
```typescript
import { SecurityHeaders } from 'shokupan';
app.use(SecurityHeaders({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'"],
imgSrc: ["'self'", 'data:', 'https:'],
}
},
strictTransportSecurity: {
maxAge: 31536000,
includeSubDomains: true,
preload: true
}
}));
```
### CORS Configuration
[Section titled “CORS Configuration”](#cors-configuration)
```typescript
import { CORS } from 'shokupan';
app.use(CORS({
origin: process.env.ALLOWED_ORIGINS?.split(',') || ['https://yourdomain.com'],
credentials: true,
maxAge: 86400
}));
```
### Rate Limiting
[Section titled “Rate Limiting”](#rate-limiting)
```typescript
import { RateLimit } from 'shokupan';
// Global rate limit
app.use(RateLimit({
windowMs: 60000, // 1 minute
max: 100, // 100 requests per minute
standardHeaders: true,
legacyHeaders: false
}));
// Stricter rate limit for auth endpoints
app.post('/auth/login',
RateLimit({ windowMs: 60000, max: 5 }),
async (ctx) => {
// Login logic
}
);
```
### Authentication
[Section titled “Authentication”](#authentication)
```typescript
import { Authentication } from 'shokupan';
app.use(Authentication({
secret: process.env.JWT_SECRET!,
algorithms: ['HS256'],
exclude: ['/health', '/auth/login', '/auth/register']
}));
```
## Error Handling
[Section titled “Error Handling”](#error-handling)
### Global Error Handler
[Section titled “Global Error Handler”](#global-error-handler)
```typescript
app.use(async (ctx, next) => {
try {
return await next();
} catch (error: any) {
logger.error({
error: error.message,
stack: error.stack,
path: ctx.path,
method: ctx.request.method
});
// Don't expose internal errors in production
if (process.env.NODE_ENV === 'production') {
return ctx.json({
error: 'Internal Server Error',
message: 'An unexpected error occurred'
}, 500);
}
return ctx.json({
error: error.message,
stack: error.stack
}, 500);
}
});
```
### Graceful Shutdown
[Section titled “Graceful Shutdown”](#graceful-shutdown)
```typescript
const server = await app.listen(3000);
const shutdown = async () => {
logger.info('Shutting down gracefully...');
// Close database connections
await pool.end();
// Stop server
server.stop();
process.exit(0);
};
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);
```
## Monitoring
[Section titled “Monitoring”](#monitoring)
### Health Check Endpoint
[Section titled “Health Check Endpoint”](#health-check-endpoint)
```typescript
app.get('/health', (ctx) => {
return ctx.json({
status: 'ok',
timestamp: new Date().toISOString(),
uptime: process.uptime()
});
});
app.get('/health/ready', async (ctx) => {
try {
// Check database connection
await pool.query('SELECT 1');
return ctx.json({ status: 'ready' });
} catch (error) {
return ctx.json({ status: 'not ready' }, 503);
}
});
```
### Metrics
[Section titled “Metrics”](#metrics)
```typescript
let requestCount = 0;
let errorCount = 0;
app.use(async (ctx, next) => {
requestCount++;
try {
return await next();
} catch (error) {
errorCount++;
throw error;
}
});
app.get('/metrics', (ctx) => {
return ctx.json({
requests: requestCount,
errors: errorCount,
errorRate: requestCount > 0 ? errorCount / requestCount : 0,
uptime: process.uptime(),
memory: process.memoryUsage()
});
});
```
## Environment Variables
[Section titled “Environment Variables”](#environment-variables)
### Required Variables
[Section titled “Required Variables”](#required-variables)
```bash
# Server
PORT=3000
NODE_ENV=production
# Security
JWT_SECRET=your-super-secret-jwt-key-change-this
ALLOWED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
# Database
DATABASE_URL=postgresql://user:pass@host:5432/dbname
# Logging
LOG_LEVEL=info
```
### Loading Environment Variables
[Section titled “Loading Environment Variables”](#loading-environment-variables)
```typescript
// Bun automatically loads .env files
// For Node.js, use dotenv:
import 'dotenv/config';
// Validate required variables
const requiredEnvVars = ['JWT_SECRET', 'DATABASE_URL'];
for (const envVar of requiredEnvVars) {
if (!process.env[envVar]) {
throw new Error(`Missing required environment variable: ${envVar}`);
}
}
```
## Deployment Platforms
[Section titled “Deployment Platforms”](#deployment-platforms)
### Docker
[Section titled “Docker”](#docker)
See the [Deployment Guide](/guides/deployment/) for Docker configuration.
### Bun with systemd
[Section titled “Bun with systemd”](#bun-with-systemd)
Create `/etc/systemd/system/myapp.service`:
```ini
[Unit]
Description=My Shokupan Application
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
Environment="NODE_ENV=production"
EnvironmentFile=/opt/myapp/.env
ExecStart=/usr/local/bin/bun run src/index.ts
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Enable and start:
```bash
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp
```
## Production Checklist
[Section titled “Production Checklist”](#production-checklist)
* [ ] **Logging**: Configure structured logging with appropriate log levels
* [ ] **Compression**: Enable compression middleware for responses > 1KB
* [ ] **Security Headers**: Apply security headers plugin
* [ ] **CORS**: Configure CORS with specific allowed origins
* [ ] **Rate Limiting**: Implement rate limiting on all endpoints
* [ ] **Authentication**: Secure private endpoints with JWT or sessions
* [ ] **Error Handling**: Implement global error handler
* [ ] **Graceful Shutdown**: Handle SIGTERM/SIGINT signals
* [ ] **Health Checks**: Add `/health` and `/health/ready` endpoints
* [ ] **Environment Variables**: Use env vars for all secrets and config
* [ ] **HTTPS**: Enable HTTPS (via reverse proxy like nginx/Caddy)
* [ ] **Database**: Use connection pooling
* [ ] **Monitoring**: Set up metrics and alerting
* [ ] **AsyncLocalStorage**: Disable if not needed for performance
* [ ] **Debug Logs**: Disable debug logging in production
## Reverse Proxy (nginx)
[Section titled “Reverse Proxy (nginx)”](#reverse-proxy-nginx)
Run Shokupan behind nginx for HTTPS and load balancing:
```nginx
upstream shokupan {
server localhost:3000;
server localhost:3001;
server localhost:3002;
}
server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://shokupan;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
```
## Performance Tips
[Section titled “Performance Tips”](#performance-tips)
1. **Use Bun Runtime**: Bun provides the best performance for Shokupan
2. **Enable zstd Compression**: 20%+ performance improvement for JSON APIs
3. **Minimize Middleware**: Only use middleware you actually need
4. **Connection Pooling**: Pool database connections (max 20-50 connections)
5. **Caching**: Use Redis or in-memory caching for frequently accessed data
6. **Static Assets**: Serve static files through CDN or nginx
7. **Database Indexes**: Ensure proper database indexing
8. **Monitor Memory**: Watch for memory leaks with process.memoryUsage()
# Testing
> Test your Shokupan applications with popular JavaScript test runners
Shokupan provides powerful testing utilities that work seamlessly with popular JavaScript test runners. This guide covers testing with Bun Test, Jest, Vitest, and Mocha.
## Table of Contents
[Section titled “Table of Contents”](#table-of-contents)
* [Testing Methods](#testing-methods)
* [testRequest()](#testrequest)
* [internalRequest()](#internalrequest)
* [Bun Test](#bun-test)
* [Basic Tests](#basic-tests)
* [Testing Middleware](#testing-middleware)
* [Testing Controllers](#testing-controllers)
* [Testing Internal Requests](#testing-internal-requests)
* [Jest](#jest)
* [Vitest](#vitest)
* [Mocha](#mocha)
* [Testing Routers Directly](#testing-routers-directly)
* [Testing with Plugins](#testing-with-plugins)
* [Best Practices](#best-practices)
* [Coverage](#coverage)
## Testing Methods
[Section titled “Testing Methods”](#testing-methods)
Shokupan provides two primary methods for testing your applications:
### `testRequest()`
[Section titled “testRequest()”](#testrequest)
A testing utility that processes requests and returns a simplified result object. This method:
* Goes through the **full application stack** (middleware, hooks, error handling)
* Returns `{ status, headers, data }` for easy assertions
* Automatically parses JSON responses
* Perfect for integration tests
```typescript
const result = await app.testRequest({
method: 'GET',
path: '/users',
headers: { 'Authorization': 'Bearer token' },
body: { name: 'Alice' },
query: { page: '1' }
});
// result = { status: 200, headers: {...}, data: {...} }
```
### `internalRequest()`
[Section titled “internalRequest()”](#internalrequest)
Makes an internal request through the full routing pipeline. This method:
* Returns a raw `Response` object
* Supports streaming responses
* Useful for testing route proxying and internal requests
* Ideal for testing Response headers and status codes directly
```typescript
const response = await app.internalRequest({
path: '/api/users',
method: 'POST',
body: { name: 'Bob' }
});
// response is a standard Response object
const data = await response.json();
```
## Bun Test
[Section titled “Bun Test”](#bun-test)
Shokupan works perfectly with [Bun’s built-in test runner](https://bun.sh/docs/cli/test), which is blazingly fast and requires no configuration.
### Setup
[Section titled “Setup”](#setup)
```bash
# No installation needed - Bun includes the test runner
bun test
```
### Basic Tests
[Section titled “Basic Tests”](#basic-tests)
```typescript
import { describe, it, expect } from 'bun:test';
import { Shokupan } from 'shokupan';
describe('API Tests', () => {
it('should return hello world', async () => {
const app = new Shokupan();
app.get('/', () => ({ message: 'Hello World' }));
const res = await app.testRequest({
method: 'GET',
path: '/'
});
expect(res.status).toBe(200);
expect(res.data).toEqual({ message: 'Hello World' });
});
it('should handle POST requests', async () => {
const app = new Shokupan();
app.post('/users', async (ctx) => {
const body = await ctx.body();
return { created: body };
});
const res = await app.testRequest({
method: 'POST',
path: '/users',
body: { name: 'Alice', email: 'alice@example.com' }
});
expect(res.status).toBe(200);
expect(res.data.created).toEqual({
name: 'Alice',
email: 'alice@example.com'
});
});
});
```
### Testing Middleware
[Section titled “Testing Middleware”](#testing-middleware)
```typescript
import { describe, it, expect, beforeEach } from 'bun:test';
import { Shokupan } from 'shokupan';
describe('Middleware Tests', () => {
let app: Shokupan;
beforeEach(() => {
app = new Shokupan();
});
it('should execute middleware in order', async () => {
const calls: string[] = [];
app.use(async (ctx, next) => {
calls.push('middleware1');
return next?.();
});
app.use(async (ctx, next) => {
calls.push('middleware2');
return next?.();
});
app.get('/', () => {
calls.push('handler');
return 'ok';
});
await app.testRequest({ path: '/' });
expect(calls).toEqual(['middleware1', 'middleware2', 'handler']);
});
it('should handle authentication middleware', async () => {
app.use(async (ctx, next) => {
const token = ctx.req.headers.get('Authorization');
if (!token) {
return ctx.json({ error: 'Unauthorized' }, 401);
}
return next?.();
});
app.get('/protected', () => ({ data: 'secret' }));
// Test without auth
const unauthorized = await app.testRequest({ path: '/protected' });
expect(unauthorized.status).toBe(401);
// Test with auth
const authorized = await app.testRequest({
path: '/protected',
headers: { 'Authorization': 'Bearer token123' }
});
expect(authorized.status).toBe(200);
expect(authorized.data).toEqual({ data: 'secret' });
});
});
```
### Testing Controllers
[Section titled “Testing Controllers”](#testing-controllers)
```typescript
import { describe, it, expect } from 'bun:test';
import { Shokupan } from 'shokupan';
import { Get, Post, Param, Body } from 'shokupan';
class UserController {
@Get('/')
getUsers() {
return [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' }
];
}
@Get('/:id')
getUser(@Param('id') id: string) {
return { id, name: 'Test User' };
}
@Post('/')
createUser(@Body() body: any) {
return { id: 3, ...body };
}
}
describe('UserController', () => {
it('should get all users', async () => {
const app = new Shokupan();
app.mount('/users', UserController);
const res = await app.testRequest({
method: 'GET',
path: '/users'
});
expect(res.status).toBe(200);
expect(res.data).toHaveLength(2);
});
it('should get user by id', async () => {
const app = new Shokupan();
app.mount('/users', UserController);
const res = await app.testRequest({
method: 'GET',
path: '/users/123'
});
expect(res.data).toEqual({ id: '123', name: 'Test User' });
});
});
```
### Testing Internal Requests
[Section titled “Testing Internal Requests”](#testing-internal-requests)
```typescript
import { describe, it, expect } from 'bun:test';
import { Shokupan, ShokupanRouter } from 'shokupan';
describe('Internal Request Tests', () => {
it('should make internal requests between routes', async () => {
const app = new Shokupan();
const router = new ShokupanRouter();
// Target route
router.get('/wines/red', () => ({ type: 'red', varieties: ['Merlot', 'Cabernet'] }));
router.get('/wines/white', () => ({ type: 'white', varieties: ['Chardonnay', 'Riesling'] }));
// Proxy route that calls other routes internally
router.get('/wines/all', async (ctx) => {
const [red, white] = await Promise.all([
router.internalRequest('/api/wines/red'),
router.internalRequest('/api/wines/white')
]);
return {
red: await red.json(),
white: await white.json()
};
});
app.mount('/api', router);
const res = await app.testRequest({ path: '/api/wines/all' });
expect(res.status).toBe(200);
expect(res.data.red.type).toBe('red');
expect(res.data.white.type).toBe('white');
});
});
```
## Jest
[Section titled “Jest”](#jest)
[Jest](https://jestjs.io/) is a popular testing framework with great TypeScript support.
### Setup
[Section titled “Setup”](#setup-1)
```bash
npm install --save-dev jest @types/jest ts-jest
```
**jest.config.js:**
```javascript
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/__tests__/**/*.test.ts'],
collectCoverageFrom: ['src/**/*.ts']
};
```
### Example Tests
[Section titled “Example Tests”](#example-tests)
```typescript
import { Shokupan } from 'shokupan';
describe('Shokupan with Jest', () => {
let app: Shokupan;
beforeEach(() => {
app = new Shokupan();
});
afterEach(() => {
// Cleanup if needed
});
describe('GET /health', () => {
it('should return 200 OK', async () => {
app.get('/health', () => ({ status: 'ok' }));
const response = await app.testRequest({
method: 'GET',
path: '/health'
});
expect(response.status).toBe(200);
expect(response.data).toMatchObject({ status: 'ok' });
});
});
describe('Error Handling', () => {
it('should return 404 for unknown routes', async () => {
const response = await app.testRequest({
path: '/unknown-route'
});
expect(response.status).toBe(404);
});
it('should handle errors gracefully', async () => {
app.get('/error', () => {
throw new Error('Test error');
});
const response = await app.testRequest({ path: '/error' });
expect(response.status).toBe(500);
expect(response.data).toHaveProperty('error');
});
});
});
```
### Snapshot Testing
[Section titled “Snapshot Testing”](#snapshot-testing)
```typescript
describe('API Response Snapshots', () => {
it('should match snapshot', async () => {
const app = new Shokupan();
app.get('/api/data', () => ({
version: '1.0.0',
items: [1, 2, 3]
}));
const response = await app.testRequest({ path: '/api/data' });
expect(response.data).toMatchSnapshot();
});
});
```
## Vitest
[Section titled “Vitest”](#vitest)
[Vitest](https://vitest.dev/) is a blazing-fast test runner compatible with Jest’s API.
### Setup
[Section titled “Setup”](#setup-2)
```bash
npm install --save-dev vitest
```
**vitest.config.ts:**
```typescript
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'node',
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html']
}
}
});
```
### Example Tests
[Section titled “Example Tests”](#example-tests-1)
```typescript
import { describe, it, expect, beforeEach } from 'vitest';
import { Shokupan } from 'shokupan';
describe('Shokupan with Vitest', () => {
let app: Shokupan;
beforeEach(() => {
app = new Shokupan();
});
it('should handle query parameters', async () => {
app.get('/search', (ctx) => {
const query = ctx.req.query.get('q');
return { results: [`Result for: ${query}`] };
});
const response = await app.testRequest({
path: '/search',
query: { q: 'test' }
});
expect(response.status).toBe(200);
expect(response.data.results).toContain('Result for: test');
});
it('should handle path parameters', async () => {
app.get('/users/:id/posts/:postId', (ctx) => ({
userId: ctx.params.id,
postId: ctx.params.postId
}));
const response = await app.testRequest({
path: '/users/42/posts/123'
});
expect(response.data).toEqual({
userId: '42',
postId: '123'
});
});
});
```
## Mocha
[Section titled “Mocha”](#mocha)
[Mocha](https://mochajs.org/) is a flexible testing framework often paired with Chai for assertions.
### Setup
[Section titled “Setup”](#setup-3)
```bash
npm install --save-dev mocha @types/mocha chai @types/chai ts-node
```
**test/mocha.opts:**
```plaintext
--require ts-node/register
--require source-map-support/register
--recursive
--extension ts
```
### Example Tests
[Section titled “Example Tests”](#example-tests-2)
```typescript
import { expect } from 'chai';
import { Shokupan } from 'shokupan';
describe('Shokupan with Mocha', () => {
let app: Shokupan;
beforeEach(() => {
app = new Shokupan();
});
describe('JSON Handling', () => {
it('should parse and return JSON', async () => {
app.post('/api/echo', async (ctx) => {
const body = await ctx.body();
return { echo: body };
});
const response = await app.testRequest({
method: 'POST',
path: '/api/echo',
headers: { 'Content-Type': 'application/json' },
body: { message: 'hello' }
});
expect(response.status).to.equal(200);
expect(response.data).to.deep.equal({
echo: { message: 'hello' }
});
});
});
describe('Headers', () => {
it('should set custom headers', async () => {
app.get('/custom-headers', (ctx) => {
return ctx.text('OK', 200, {
'X-Custom-Header': 'CustomValue'
});
});
const response = await app.testRequest({
path: '/custom-headers'
});
expect(response.headers['x-custom-header']).to.equal('CustomValue');
});
});
});
```
## Testing Routers Directly
[Section titled “Testing Routers Directly”](#testing-routers-directly)
You can test `ShokupanRouter` instances independently from the application. This is useful for testing modular router logic, API route groups, or reusable router components.
### Key Differences
[Section titled “Key Differences”](#key-differences)
When testing routers directly:
* **Router.testRequest()** bypasses application-level middleware
* Only router-specific middleware (via `router.use()`) is executed
* No application hooks are triggered
* Useful for unit testing router logic in isolation
### Basic Router Testing
[Section titled “Basic Router Testing”](#basic-router-testing)
```typescript
import { describe, it, expect } from 'bun:test';
import { ShokupanRouter } from 'shokupan';
describe('API Router', () => {
it('should test router independently', async () => {
const router = new ShokupanRouter();
router.get('/items', () => ({ items: [] }));
router.get('/items/:id', (ctx) => ({
id: ctx.params.id,
name: 'Item'
}));
router.post('/items', async (ctx) => {
const body = await ctx.body();
return { created: body };
});
// Test GET /items
const listRes = await router.testRequest({
method: 'GET',
path: '/items'
});
expect(listRes.status).toBe(200);
expect(listRes.data).toEqual({ items: [] });
// Test GET /items/:id
const getRes = await router.testRequest({
path: '/items/123'
});
expect(getRes.data.id).toBe('123');
// Test POST /items
const createRes = await router.testRequest({
method: 'POST',
path: '/items',
body: { name: 'New Item' }
});
expect(createRes.data.created).toEqual({ name: 'New Item' });
});
});
```
### Testing Router Middleware
[Section titled “Testing Router Middleware”](#testing-router-middleware)
Test middleware that applies only to specific routers:
```typescript
import { describe, it, expect, beforeEach } from 'bun:test';
import { ShokupanRouter } from 'shokupan';
describe('Router Middleware', () => {
let router: ShokupanRouter;
beforeEach(() => {
router = new ShokupanRouter();
});
it('should apply router-level middleware', async () => {
const calls: string[] = [];
// Router-level middleware
router.use(async (ctx, next) => {
calls.push('router-middleware');
return next?.();
});
router.get('/test', () => {
calls.push('handler');
return { success: true };
});
await router.testRequest({ path: '/test' });
expect(calls).toEqual(['router-middleware', 'handler']);
});
it('should handle router-level guards', async () => {
// Add authentication guard to router
router.guard({ description: 'Auth Guard' }, async (ctx, next) => {
const apiKey = ctx.req.headers.get('X-API-Key');
if (apiKey !== 'secret') {
return ctx.json({ error: 'Unauthorized' }, 401);
}
return next?.();
});
router.get('/protected', () => ({ data: 'sensitive' }));
// Test without API key
const unauthorized = await router.testRequest({
path: '/protected'
});
expect(unauthorized.status).toBe(401);
// Test with API key
const authorized = await router.testRequest({
path: '/protected',
headers: { 'X-API-Key': 'secret' }
});
expect(authorized.status).toBe(200);
expect(authorized.data).toEqual({ data: 'sensitive' });
});
});
```
### Testing Nested Routers
[Section titled “Testing Nested Routers”](#testing-nested-routers)
```typescript
import { describe, it, expect } from 'bun:test';
import { ShokupanRouter } from 'shokupan';
describe('Nested Routers', () => {
it('should test nested router structure', async () => {
const apiRouter = new ShokupanRouter();
const usersRouter = new ShokupanRouter();
const postsRouter = new ShokupanRouter();
// Users router
usersRouter.get('/', () => ({ users: [] }));
usersRouter.get('/:id', (ctx) => ({
id: ctx.params.id,
name: 'User'
}));
// Posts router
postsRouter.get('/', () => ({ posts: [] }));
postsRouter.post('/', async (ctx) => {
const body = await ctx.body();
return { created: body };
});
// Mount routers
apiRouter.mount('/users', usersRouter);
apiRouter.mount('/posts', postsRouter);
// Test users routes (note: paths include /users prefix)
const usersRes = await apiRouter.testRequest({
path: '/users'
});
expect(usersRes.data).toEqual({ users: [] });
const userRes = await apiRouter.testRequest({
path: '/users/42'
});
expect(userRes.data.id).toBe('42');
// Test posts routes
const postsRes = await apiRouter.testRequest({
path: '/posts'
});
expect(postsRes.data).toEqual({ posts: [] });
});
});
```
### Testing Router with Controllers
[Section titled “Testing Router with Controllers”](#testing-router-with-controllers)
```typescript
import { describe, it, expect } from 'bun:test';
import { ShokupanRouter } from 'shokupan';
import { Get, Post, Param } from 'shokupan';
class ProductController {
@Get('/')
list() {
return { products: ['Product 1', 'Product 2'] };
}
@Get('/:id')
get(@Param('id') id: string) {
return { id, name: `Product ${id}` };
}
}
describe('Router with Controllers', () => {
it('should test router with mounted controller', async () => {
const router = new ShokupanRouter();
router.mount('/products', ProductController);
const listRes = await router.testRequest({
path: '/products'
});
expect(listRes.data.products).toHaveLength(2);
const getRes = await router.testRequest({
path: '/products/123'
});
expect(getRes.data.id).toBe('123');
});
});
```
### Testing Router Internal Requests
[Section titled “Testing Router Internal Requests”](#testing-router-internal-requests)
Test routers that make internal requests to other routes:
```typescript
import { describe, it, expect } from 'bun:test';
import { ShokupanRouter } from 'shokupan';
describe('Router Internal Requests', () => {
it('should handle internal route calls', async () => {
const router = new ShokupanRouter();
// Data routes
router.get('/data/cats', () => ({
category: 'cats',
items: ['Tabby', 'Siamese']
}));
router.get('/data/dogs', () => ({
category: 'dogs',
items: ['Labrador', 'Poodle']
}));
// Aggregator route
router.get('/data/all', async () => {
const [catsRes, dogsRes] = await Promise.all([
router.internalRequest('/data/cats'),
router.internalRequest('/data/dogs')
]);
return {
cats: await catsRes.json(),
dogs: await dogsRes.json()
};
});
const res = await router.testRequest({ path: '/data/all' });
expect(res.status).toBe(200);
expect(res.data.cats.category).toBe('cats');
expect(res.data.dogs.category).toBe('dogs');
});
});
```
### Testing vs Mounting in App
[Section titled “Testing vs Mounting in App”](#testing-vs-mounting-in-app)
When deciding between testing a router directly or mounting it in an app:
**Test Router Directly:**
```typescript
// Unit test: isolated router logic only
const router = new ShokupanRouter();
router.get('/items', () => ({ items: [] }));
const res = await router.testRequest({ path: '/items' });
// No app middleware, no hooks, fast execution
```
**Test Via App:**
```typescript
// Integration test: full application stack
const app = new Shokupan();
app.use(SomeMiddleware()); // This runs
app.mount('/api', router);
const res = await app.testRequest({ path: '/api/items' });
// Includes middleware, hooks, full app behavior
```
## Testing with Plugins
[Section titled “Testing with Plugins”](#testing-with-plugins)
```typescript
import { describe, it, expect } from 'bun:test';
import { Shokupan } from 'shokupan';
import { Compression } from 'shokupan/plugins';
describe('Plugin Tests', () => {
it('should compress responses', async () => {
const app = new Shokupan();
app.use(Compression());
app.get('/data', () => {
return 'x'.repeat(1000); // Large response
});
const response = await app.testRequest({
path: '/data',
headers: { 'Accept-Encoding': 'gzip' }
});
expect(response.status).toBe(200);
// Response should be compressed if size threshold is met
});
});
```
## Best Practices
[Section titled “Best Practices”](#best-practices)
### 1. **Isolate Tests**
[Section titled “1. Isolate Tests”](#1-isolate-tests)
Create a new app instance for each test to avoid state pollution:
```typescript
beforeEach(() => {
app = new Shokupan();
});
```
### 2. **Test Error Cases**
[Section titled “2. Test Error Cases”](#2-test-error-cases)
Always test both success and error scenarios:
```typescript
it('should validate input', async () => {
app.post('/users', async (ctx) => {
const body = await ctx.body();
if (!body.email) {
return ctx.json({ error: 'Email required' }, 400);
}
return { success: true };
});
// Test error case
const errorRes = await app.testRequest({
method: 'POST',
path: '/users',
body: { name: 'Alice' }
});
expect(errorRes.status).toBe(400);
// Test success case
const successRes = await app.testRequest({
method: 'POST',
path: '/users',
body: { email: 'alice@example.com' }
});
expect(successRes.status).toBe(200);
});
```
### 3. **Use Type Safety**
[Section titled “3. Use Type Safety”](#3-use-type-safety)
Leverage TypeScript for type-safe tests:
```typescript
interface User {
id: number;
name: string;
}
it('should return typed data', async () => {
app.get('/users/:id', (ctx) => ({
id: parseInt(ctx.params.id),
name: 'Alice'
}));
const response = await app.testRequest({ path: '/users/1' });
const user = response.data as User;
expect(user.id).toBe(1);
expect(user.name).toBe('Alice');
});
```
### 4. **Test Async Operations**
[Section titled “4. Test Async Operations”](#4-test-async-operations)
Use `async/await` for testing asynchronous routes:
```typescript
it('should handle async operations', async () => {
app.get('/async', async () => {
await new Promise(resolve => setTimeout(resolve, 100));
return { done: true };
});
const response = await app.testRequest({ path: '/async' });
expect(response.data.done).toBe(true);
});
```
## Coverage
[Section titled “Coverage”](#coverage)
### Bun Test Coverage
[Section titled “Bun Test Coverage”](#bun-test-coverage)
```bash
bun test --coverage
```
### Jest Coverage
[Section titled “Jest Coverage”](#jest-coverage)
```bash
npm test -- --coverage
```
### Vitest Coverage
[Section titled “Vitest Coverage”](#vitest-coverage)
```bash
npx vitest --coverage
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Deployment](/guides/deployment/) - Deploy your app
* [Production Setup](/guides/production/) - Production best practices
* [CLI Tools](/guides/cli/) - Code generation
# Express Middleware
> Use Express middleware with Shokupan
Many Express middleware packages work with Shokupan using the compatibility layer.
## useExpress Adapter
[Section titled “useExpress Adapter”](#useexpress-adapter)
```typescript
import { useExpress } from 'shokupan';
import helmet from 'helmet';
app.use(useExpress(helmet()));
```
## Native Alternatives
[Section titled “Native Alternatives”](#native-alternatives)
For better performance, use native Shokupan plugins:
```typescript
import { SecurityHeaders, Compression, Cors } from 'shokupan';
app.use(SecurityHeaders());
app.use(Compression());
app.use(Cors());
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Plugins](/plugins/cors/) - Native Shokupan plugins
# Migrating from Express
> Guide to migrating from Express.js to Shokupan
Shokupan is designed to feel familiar to Express developers. This guide shows you how to migrate your Express app.
## Key Differences
[Section titled “Key Differences”](#key-differences)
1. **Context vs Req/Res**: Single `ctx` object instead of separate `req` and `res`
2. **Return vs Send**: Return values directly instead of calling `res.json()`
3. **Built-in Parsing**: Body parsing is automatic
4. **Async by Default**: All handlers are naturally async
5. **Web Standards**: Uses `Headers`, `URL`, `Response` from web standards
## Basic Server
[Section titled “Basic Server”](#basic-server)
**Express:**
```typescript
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.json({ message: 'Hello' });
});
app.listen(3000);
```
**Shokupan:**
```typescript
import { Shokupan } from 'shokupan';
const app = new Shokupan({ port: 3000 });
app.get('/', (ctx) => {
return { message: 'Hello' };
});
app.listen();
```
## Middleware
[Section titled “Middleware”](#middleware)
**Express:**
```typescript
app.use((req, res, next) => {
console.log(req.method, req.path);
next();
});
```
**Shokupan:**
```typescript
app.use(async (ctx, next) => {
console.log(ctx.method, ctx.path);
return next(); // Must return!
});
```
## Migration Checklist
[Section titled “Migration Checklist”](#migration-checklist)
* [ ] Replace `req` and `res` with `ctx`
* [ ] Change `res.json()` to `return`
* [ ] Remove `express.json()` middleware
* [ ] Return values from middleware
* [ ] Update header access: `req.headers.key` → `ctx.headers.get('key')`
* [ ] Update query params: `req.query.key` → `ctx.query.get('key')`
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Routing](/core/routing/) - Learn Shokupan patterns
* [Controllers](/core/controllers/) - Use decorators
# Migrating from Koa
> Guide to migrating from Koa to Shokupan
Shokupan’s context-based approach is inspired by Koa. Migration is straightforward.
## Key Differences
[Section titled “Key Differences”](#key-differences)
1. **Return Value**: Shokupan requires returning the response from middleware
2. **Routing**: Built-in routing, no need for external router
3. **Body Parsing**: Built-in, no need for koa-bodyparser
## Middleware
[Section titled “Middleware”](#middleware)
**Koa:**
```typescript
app.use(async (ctx, next) => {
await next();
});
```
**Shokupan:**
```typescript
app.use(async (ctx, next) => {
const result = await next();
return result; // Must return!
});
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Core Concepts](/core/routing/) - Learn Shokupan patterns
# Migrating from NestJS
> Guide to migrating from NestJS to Shokupan
Shokupan supports NestJS-style decorators with a lighter-weight approach.
## Controllers
[Section titled “Controllers”](#controllers)
**NestJS:**
```typescript
@Controller('users')
export class UserController {
@Get(':id')
getUser(@Param('id') id: string) {
return { id };
}
}
```
**Shokupan:**
```typescript
export class UserController {
@Get('/:id')
getUser(@Param('id') id: string) {
return { id };
}
}
app.mount('/users', UserController);
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Controllers](/core/controllers/) - Full controller documentation
# Benchmarks
> Performance benchmarks comparing Shokupan to other frameworks
Shokupan is built with performance as a top priority. This page contains comprehensive benchmark results comparing Shokupan against other popular Node.js web frameworks across both **Bun** and **Node.js** runtimes.
## Overview
[Section titled “Overview”](#overview)
Our benchmark suite tests frameworks under both basic and advanced scenarios to provide a realistic comparison of performance characteristics. All benchmarks use [autocannon](https://github.com/mcollina/autocannon) for load testing with **100 concurrent connections**.
## Frameworks Tested
[Section titled “Frameworks Tested”](#frameworks-tested)
* **Shokupan** - The framework being benchmarked
* **Fastify** - High-performance web framework
* **Express** - De-facto standard Node.js framework
* **Koa** - Modern, lightweight framework by Express creators
* **Hapi** - Enterprise-grade framework
* **NestJS** - TypeScript-first progressive framework
* **Hono** - Ultrafast web framework (advanced benchmarks)
* **Elysia** - End-to-end type-safe framework for Bun (advanced benchmarks)
## Basic Benchmark Suite
[Section titled “Basic Benchmark Suite”](#basic-benchmark-suite)
The basic benchmark suite tests fundamental request handling capabilities across three standardized endpoints:
### Test Endpoints
[Section titled “Test Endpoints”](#test-endpoints)
1. **`/static`** - Returns plain text “Hello World”
* Tests raw throughput with minimal overhead
* Pure routing and response generation performance
2. **`/json`** - Returns a medium-sized JSON object (\~500 bytes)
* Tests JSON serialization performance
* Measures overhead of content-type headers
3. **`/dynamic/:id`** - Returns dynamic content with path parameter interpolation
* Tests routing with path parameters
* Measures parameter extraction overhead
### Metrics Collected
[Section titled “Metrics Collected”](#metrics-collected)
* **Requests/sec** (average) - Higher is better
* **Latency** (average, in milliseconds) - Lower is better
* **Throughput** (average, in MB/s) - Higher is better
### Interactive Results
[Section titled “Interactive Results”](#interactive-results)
## Advanced Benchmark Suite
[Section titled “Advanced Benchmark Suite”](#advanced-benchmark-suite)
The advanced benchmark suite tests frameworks under more realistic and challenging scenarios that go beyond basic request handling.
### Advanced Scenarios
[Section titled “Advanced Scenarios”](#advanced-scenarios)
#### 1. **Compression Performance**
[Section titled “1. Compression Performance”](#1-compression-performance)
Tests compression across multiple algorithms:
* **gzip** - Standard compression
* **brotli** - Modern high-compression algorithm
* **deflate** - Legacy compression
* **zstd** - Facebook’s high-performance compression
* **store** - No compression baseline
Measures throughput and latency with compressed responses. Note that not all frameworks support all compression algorithms.
#### 2. **Large Payloads**
[Section titled “2. Large Payloads”](#2-large-payloads)
Stress tests handling of large data:
* **Request**: POST with 10MB body
* **Response**: 5MB JSON response
* **Headers**: 100+ headers stress test
Tests memory efficiency and streaming capabilities.
#### 3. **Math Middleware Chain**
[Section titled “3. Math Middleware Chain”](#3-math-middleware-chain)
Tests middleware overhead with CPU-bound operations:
* Chain of 10 middleware functions
* Each performs MD5 hashing on request data
* Measures framework efficiency in chaining middleware
* Identifies middleware processing overhead
#### 4. **Route Scaling (1000 Handlers)**
[Section titled “4. Route Scaling (1000 Handlers)”](#4-route-scaling-1000-handlers)
Tests routing performance at scale:
* Registers 1000 unique routes
* Measures route lookup performance
* Identifies O(n) vs O(1) route lookup implementations
* Tests framework scalability
#### 5. **Property Access**
[Section titled “5. Property Access”](#5-property-access)
Tests context property access patterns:
* Multiple property reads per request
* Measures getter overhead
* Tests framework internals efficiency
#### 6. **Fully-Loaded Performance**
[Section titled “6. Fully-Loaded Performance”](#6-fully-loaded-performance)
Measures overhead of production-ready configurations:
* OpenTelemetry tracing enabled
* Request validation active
* AsyncLocalStorage for request context
* Compares baseline vs fully-instrumented performance
* Simulates real-world production setups
#### 7. **Long-Pending Parallelization**
[Section titled “7. Long-Pending Parallelization”](#7-long-pending-parallelization)
Tests concurrent connection handling:
* 10000+ concurrent requests with delays
* Tests connection handling capacity
* Measures timeout behavior
* Identifies framework parallelization capabilities
### Framework Limitations
[Section titled “Framework Limitations”](#framework-limitations)
Not all frameworks support all scenarios. Common limitations include:
* **Compression**: Some frameworks lack native brotli/zstd support
* **Math Middleware**: NestJS has limited dynamic middleware support
* **Long-Pending**: Some frameworks may not handle 10000+ connections efficiently
Failed scenarios are marked as “FAILED” in the report with error details.
### Interactive Results
[Section titled “Interactive Results”](#interactive-results-1)
## Running Benchmarks Yourself
[Section titled “Running Benchmarks Yourself”](#running-benchmarks-yourself)
### Basic Benchmarks
[Section titled “Basic Benchmarks”](#basic-benchmarks)
```bash
cd src/benchmarking
bun install
bun run test
```
Filter by framework:
```bash
bun runner.ts --filter shokupan
```
### Advanced Benchmarks
[Section titled “Advanced Benchmarks”](#advanced-benchmarks)
```bash
cd src/benchmarking
bun run bench:advanced
```
Filter by framework:
```bash
bun advanced-runner.ts --filter shokupan
```
Filter by scenario:
```bash
bun advanced-runner.ts --scenario compression-gzip
```
Combine filters:
```bash
bun advanced-runner.ts --filter fastify --scenario large-payload-response
```
### Reports and History
[Section titled “Reports and History”](#reports-and-history)
Both benchmark suites automatically generate interactive HTML reports that:
* Sort frameworks by performance (Requests/Sec)
* Track the last 10 benchmark runs for historical comparison
* Automatically open in your default browser after completion
* Persist results in JSON format for programmatic access
## Performance Tips
[Section titled “Performance Tips”](#performance-tips)
For optimal Shokupan performance in production:
1. **Enable Compression** - Use `Compression()` plugin with zstd for large payloads
2. **Disable Logging** - Set `NODE_ENV=production` to disable development logs
3. **Use Bun Runtime** - Shokupan is optimized for Bun’s performance characteristics
4. **Minimize Middleware** - Each middleware adds overhead; use only what you need
5. **Enable Caching** - Cache responses where appropriate using `ShokupanContext.set()` headers
See our [Production Best Practices](/guides/production/) guide for more detailed recommendations.
## Contributing Benchmarks
[Section titled “Contributing Benchmarks”](#contributing-benchmarks)
To add new frameworks or scenarios to the benchmark suite, see the [benchmark README](https://github.com/knackstedt/shokupan/tree/HEAD/src/benchmarking) for detailed instructions.
# Authentication
> OAuth2 authentication with multiple providers
Shokupan provides built-in OAuth2 authentication with support for GitHub, Google, Microsoft, Apple, Auth0, Okta, and custom providers.
## Quick Start
[Section titled “Quick Start”](#quick-start)
```bash
bun add shokupan
```
```typescript
import { Shokupan, AuthPlugin } from 'shokupan';
const app = new Shokupan();
const auth = new AuthPlugin({
jwtSecret: process.env.JWT_SECRET!,
jwtExpiration: '7d',
cookieOptions: {
httpOnly: true,
secure: true,
sameSite: 'lax'
},
github: {
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/github/callback'
}
});
// Mount auth routes at /auth
app.mount('/auth', auth);
// Protect routes
app.get('/protected', auth.middleware(), (ctx) => {
return { user: ctx.state.user };
});
app.listen();
```
## Supported Providers
[Section titled “Supported Providers”](#supported-providers)
### GitHub
[Section titled “GitHub”](#github)
```typescript
const auth = new AuthPlugin({
jwtSecret: 'your-secret',
github: {
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/github/callback'
}
});
```
### Google
[Section titled “Google”](#google)
```typescript
google: {
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/google/callback'
}
```
### Microsoft
[Section titled “Microsoft”](#microsoft)
```typescript
microsoft: {
clientId: process.env.MICROSOFT_CLIENT_ID!,
clientSecret: process.env.MICROSOFT_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/microsoft/callback',
tenantId: 'common' // or your tenant ID
}
```
### Apple
[Section titled “Apple”](#apple)
```typescript
apple: {
clientId: process.env.APPLE_CLIENT_ID!,
clientSecret: process.env.APPLE_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/apple/callback',
teamId: process.env.APPLE_TEAM_ID!,
keyId: process.env.APPLE_KEY_ID!
}
```
### Auth0
[Section titled “Auth0”](#auth0)
```typescript
auth0: {
clientId: process.env.AUTH0_CLIENT_ID!,
clientSecret: process.env.AUTH0_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/auth0/callback',
domain: 'your-tenant.auth0.com'
}
```
### Okta
[Section titled “Okta”](#okta)
```typescript
okta: {
clientId: process.env.OKTA_CLIENT_ID!,
clientSecret: process.env.OKTA_CLIENT_SECRET!,
redirectUri: 'http://localhost:3000/auth/okta/callback',
domain: 'your-domain.okta.com'
}
```
### Custom OAuth2
[Section titled “Custom OAuth2”](#custom-oauth2)
```typescript
oauth2: {
clientId: 'your-client-id',
clientSecret: 'your-client-secret',
redirectUri: 'http://localhost:3000/auth/custom/callback',
authUrl: 'https://provider.com/oauth/authorize',
tokenUrl: 'https://provider.com/oauth/token',
userInfoUrl: 'https://provider.com/oauth/userinfo'
}
```
## Auth Routes
[Section titled “Auth Routes”](#auth-routes)
The plugin automatically creates these routes:
* `GET /auth/{provider}` - Initiate OAuth flow
* `GET /auth/{provider}/callback` - OAuth callback
* `GET /auth/logout` - Logout
* `GET /auth/me` - Get current user (protected)
Example flow:
```plaintext
1. User visits → GET /auth/github
2. Redirected to GitHub OAuth
3. User authorizes
4. Callback → GET /auth/github/callback
5. JWT cookie set
6. Redirected to your app
```
## Protecting Routes
[Section titled “Protecting Routes”](#protecting-routes)
Use the auth middleware to protect routes:
```typescript
// Single route
app.get('/profile', auth.middleware(), (ctx) => {
return ctx.state.user;
});
// Multiple routes
const protectedRouter = new ShokupanRouter();
protectedRouter.use(auth.middleware());
protectedRouter.get('/profile', (ctx) => ({ user: ctx.state.user }));
protectedRouter.get('/settings', (ctx) => ({ settings: {} }));
app.mount('/api', protectedRouter);
```
## With Controllers
[Section titled “With Controllers”](#with-controllers)
```typescript
import { Use } from 'shokupan';
@Use(auth.middleware())
export class UserController {
@Get('/profile')
getProfile(@Ctx() ctx: any) {
return ctx.state.user;
}
}
```
## JWT Configuration
[Section titled “JWT Configuration”](#jwt-configuration)
Configure JWT tokens:
```typescript
const auth = new AuthPlugin({
jwtSecret: process.env.JWT_SECRET!,
jwtExpiration: '7d', // or: '1h', '30d', etc.
cookieOptions: {
httpOnly: true, // Prevent XSS
secure: true, // HTTPS only
sameSite: 'lax', // CSRF protection
maxAge: 7 * 24 * 60 * 60 * 1000 // 7 days
}
});
```
## User Object
[Section titled “User Object”](#user-object)
After authentication, the user object is available at `ctx.state.user`:
```typescript
app.get('/me', auth.middleware(), (ctx) => {
const user = ctx.state.user;
// {
// id: 'github:12345',
// email: 'user@example.com',
// name: 'John Doe',
// avatar: 'https://...',
// provider: 'github'
// }
return user;
});
```
## Frontend Integration
[Section titled “Frontend Integration”](#frontend-integration)
### OAuth Flow
[Section titled “OAuth Flow”](#oauth-flow)
```typescript
// In your frontend
function login(provider: string) {
window.location.href = `http://localhost:3000/auth/${provider}`;
}
// Button
```
### Check Auth Status
[Section titled “Check Auth Status”](#check-auth-status)
```typescript
async function checkAuth() {
const response = await fetch('http://localhost:3000/auth/me', {
credentials: 'include' // Send cookies
});
if (response.ok) {
const user = await response.json();
return user;
}
return null;
}
```
### Logout
[Section titled “Logout”](#logout)
```typescript
async function logout() {
await fetch('http://localhost:3000/auth/logout', {
credentials: 'include'
});
// Redirect or update UI
}
```
## Environment Variables
[Section titled “Environment Variables”](#environment-variables)
Create a `.env` file:
```bash
# JWT
JWT_SECRET=your-super-secret-key-change-this
# GitHub
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
# Google
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
# Microsoft
MICROSOFT_CLIENT_ID=your-microsoft-client-id
MICROSOFT_CLIENT_SECRET=your-microsoft-client-secret
MICROSOFT_TENANT_ID=common
```
## Security Best Practices
[Section titled “Security Best Practices”](#security-best-practices)
Production Security
* Always use HTTPS in production (`secure: true`)
* Use strong, random JWT secrets
* Set appropriate cookie expiration
* Validate redirect URIs
* Store secrets in environment variables
```typescript
const auth = new AuthPlugin({
jwtSecret: process.env.JWT_SECRET!, // Strong, random secret
jwtExpiration: '1h', // Short expiration
cookieOptions: {
httpOnly: true, // Prevent XSS
secure: process.env.NODE_ENV === 'production', // HTTPS only
sameSite: 'strict', // Strong CSRF protection
maxAge: 60 * 60 * 1000 // 1 hour
}
});
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Sessions](/plugins/sessions/) - Session management
* [Validation](/plugins/validation/) - Validate user input
* [Rate Limiting](/plugins/rate-limiting/) - Protect auth endpoints
# Compression
> Enable response compression
The Compression plugin compresses HTTP responses to reduce bandwidth and improve performance.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
```typescript
import { Shokupan, Compression } from 'shokupan';
const app = new Shokupan();
app.use(Compression());
app.listen();
```
## Configuration
[Section titled “Configuration”](#configuration)
```typescript
app.use(Compression({
threshold: 1024, // Only compress responses larger than 1KB
level: 6 // Compression level (1-9, default: 6)
}));
```
## Options
[Section titled “Options”](#options)
* **threshold**: Minimum response size to compress (in bytes, default: 1024)
* **level**: Compression level from 1 (fastest) to 9 (best compression), default: 6
## How It Works
[Section titled “How It Works”](#how-it-works)
The plugin automatically:
* Checks if the client supports gzip encoding
* Compresses responses larger than the threshold
* Sets appropriate `Content-Encoding` header
* Adjusts `Content-Length` header
## Best Practices
[Section titled “Best Practices”](#best-practices)
```typescript
// Use default settings for most cases
app.use(Compression());
// For better performance, increase threshold
app.use(Compression({
threshold: 2048 // 2KB
}));
// For better compression, increase level
app.use(Compression({
level: 9 // Maximum compression
}));
```
Tip
Higher compression levels provide better compression but use more CPU. Level 6 is a good balance for most applications.
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [CORS](/plugins/cors/) - Configure CORS
* [Security Headers](/plugins/security-headers/) - Add security headers
# CORS
> Configure Cross-Origin Resource Sharing
The CORS plugin handles Cross-Origin Resource Sharing configuration for your API.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
Allow all origins (development only):
```typescript
import { Shokupan, Cors } from 'shokupan';
const app = new Shokupan();
app.use(Cors());
app.listen();
```
## Configuration
[Section titled “Configuration”](#configuration)
### Single Origin
[Section titled “Single Origin”](#single-origin)
```typescript
app.use(Cors({
origin: 'https://example.com',
credentials: true
}));
```
### Multiple Origins
[Section titled “Multiple Origins”](#multiple-origins)
```typescript
app.use(Cors({
origin: ['https://example.com', 'https://app.example.com'],
credentials: true
}));
```
### Dynamic Origin
[Section titled “Dynamic Origin”](#dynamic-origin)
Validate origins dynamically:
```typescript
app.use(Cors({
origin: (ctx) => {
const origin = ctx.headers.get('origin');
// Allow subdomains of example.com
if (origin?.endsWith('.example.com')) {
return origin;
}
// Allow specific origins
const allowedOrigins = [
'https://example.com',
'https://app.example.com'
];
return allowedOrigins.includes(origin) ? origin : false;
},
credentials: true
}));
```
## Full Options
[Section titled “Full Options”](#full-options)
```typescript
app.use(Cors({
// Which origins are allowed
origin: '*', // or string, string[], or function
// Which HTTP methods are allowed
methods: ['GET', 'POST', 'PUT', 'DELETE'],
// or: methods: 'GET,POST,PUT,DELETE'
// Which headers can be sent
allowedHeaders: ['Content-Type', 'Authorization'],
// or: allowedHeaders: 'Content-Type, Authorization'
// Which headers are exposed to the client
exposedHeaders: ['X-Total-Count', 'X-Page-Count'],
// or: exposedHeaders: 'X-Total-Count, X-Page-Count'
// Allow credentials (cookies, authorization headers)
credentials: true,
// How long preflight requests can be cached (in seconds)
maxAge: 86400 // 24 hours
}));
```
## Common Patterns
[Section titled “Common Patterns”](#common-patterns)
### API with Authentication
[Section titled “API with Authentication”](#api-with-authentication)
```typescript
app.use(Cors({
origin: process.env.FRONTEND_URL || 'http://localhost:3000',
credentials: true,
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
```
### Public API
[Section titled “Public API”](#public-api)
```typescript
app.use(Cors({
origin: '*',
methods: ['GET'],
credentials: false
}));
```
### Development vs Production
[Section titled “Development vs Production”](#development-vs-production)
```typescript
const isDev = process.env.NODE_ENV !== 'production';
app.use(Cors({
origin: isDev ? '*' : process.env.ALLOWED_ORIGINS?.split(','),
credentials: !isDev,
methods: ['GET', 'POST', 'PUT', 'DELETE']
}));
```
## Preflight Requests
[Section titled “Preflight Requests”](#preflight-requests)
The CORS plugin automatically handles OPTIONS preflight requests:
```plaintext
Client Server
│ │
│──OPTIONS /api/users──→│
│ (preflight) │
│ │
│←──200 OK──────────────│
│ Access-Control-* │
│ │
│──POST /api/users────→│
│ (actual request) │
│ │
│←──201 Created─────────│
│ │
```
## Per-Route CORS
[Section titled “Per-Route CORS”](#per-route-cors)
Apply CORS to specific routes:
```typescript
const corsPublic = Cors({ origin: '*' });
const corsPrivate = Cors({
origin: 'https://app.example.com',
credentials: true
});
// Public endpoint
app.get('/api/public', corsPublic, (ctx) => {
return { data: 'public' };
});
// Private endpoint
app.get('/api/private', corsPrivate, (ctx) => {
return { data: 'private' };
});
```
## Troubleshooting
[Section titled “Troubleshooting”](#troubleshooting)
### Credentials and Wildcard
[Section titled “Credentials and Wildcard”](#credentials-and-wildcard)
Caution
You cannot use `origin: '*'` with `credentials: true`. Specify exact origins instead.
```typescript
// ❌ Invalid
app.use(Cors({
origin: '*',
credentials: true
}));
// ✅ Valid
app.use(Cors({
origin: ['https://example.com'],
credentials: true
}));
```
### Headers Not Exposed
[Section titled “Headers Not Exposed”](#headers-not-exposed)
If custom headers aren’t visible to the client, add them to `exposedHeaders`:
```typescript
app.use(Cors({
origin: 'https://example.com',
exposedHeaders: ['X-Custom-Header', 'X-Total-Count']
}));
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Security Headers](/plugins/security-headers/) - Add security headers
* [Authentication](/plugins/authentication/) - Secure your API
* [Rate Limiting](/plugins/rate-limiting/) - Prevent abuse
# Debug Dashboard
> Visual dashboard for inspecting your Shokupan application.
The `Dashboard` provides a visual interface to inspect your running application. It allows you to:
* View real-time metrics (requests/sec, errors, latency).
* Visualize the middleware graph and request flow.
* Inspect the component registry (controllers, routes).
* View middleware execution logs if `enableMiddlewareTracking` is on.
* Inspect and replay failed requests captured by `FailedRequestRecorder`.

## Installation
[Section titled “Installation”](#installation)
```typescript
import { Dashboard } from 'shokupan';
// Mount the dashboard at a path of your choice
app.mount('/debug', new Dashboard({
retentionMs: 7200000 // Keep logs for 2 hours
}));
```
## Configuration
[Section titled “Configuration”](#configuration)
| Option | Type | Description |
| :------------------ | :----------------------------- | :-------------------------------------------------------------------------------------------- |
| `retentionMs` | `number` | How long to keep in-memory metrics and logs (ms). |
| `getRequestHeaders` | `() => Record` | Hook to provide custom headers (e.g. auth tokens) when replaying requests from the dashboard. |
## Features
[Section titled “Features”](#features)
### Middleware Graph
[Section titled “Middleware Graph”](#middleware-graph)
Visualizes the structure of your application, showing how routers, controllers, and middleware are connected.

### Component Registry
[Section titled “Component Registry”](#component-registry)
Inspect all registered routes and controllers in a flat or hierarchical view.

### Requests View
[Section titled “Requests View”](#requests-view)
Analyze incoming requests, their duration, and the time spent in each middleware.

### Failed Requests
[Section titled “Failed Requests”](#failed-requests)
Lists requests that resulted in errors. You can click on a failure to see details and replay it.
### Playback
[Section titled “Playback”](#playback)
Replaying a request sends the identical request payload to the server again, which is useful for debugging idempotent operations or testing fixes.
# Failed Request Recorder
> Capture and store details of failed requests.
The `FailedRequestRecorder` middleware captures details about requests that result in unhandled exceptions or 500 errors. These records can be used for debugging or replaying requests later.
## Usage
[Section titled “Usage”](#usage)
```typescript
import { FailedRequestRecorder } from 'shokupan';
app.use(FailedRequestRecorder());
```
## Integration with Debug Dashboard
[Section titled “Integration with Debug Dashboard”](#integration-with-debug-dashboard)
The captured failures are viewable in the [Debug Dashboard](/plugins/debug-dashboard). You can inspect the error, stack trace, headers, and body, and even replay the request from the dashboard.
## Configuration
[Section titled “Configuration”](#configuration)
| Option | Type | Default | Description |
| :------------ | :------- | :--------------- | :------------------------------------------ |
| `maxCapacity` | `number` | `10000` | Maximum number of failed requests to store. |
| `ttl` | `number` | `86400000` (24h) | Time to live for stored failures (ms). |
# Idempotency
> Prevent duplicate operations with Idempotency middleware.
The `Idempotency` middleware ensures that multiple identical requests do not result in different outcomes. It works by caching the response of the first request associated with a specific idempotency key and returning the cached response for subsequent requests.
## Usage
[Section titled “Usage”](#usage)
```typescript
import { Idempotency } from 'shokupan';
app.post('/payments',
Idempotency({
header: 'Idempotency-Key',
ttl: 86400000 // 24 hours
}),
async (ctx) => {
// ... process payment
return { status: 'charged' };
}
);
```
## How it works
[Section titled “How it works”](#how-it-works)
1. Client sends a request with an `Idempotency-Key` header.
2. If the key has been seen before, the server returns the saved response (status, headers, body) without executing the handler again.
3. If the key is new, the handler executes, and the resulting response is saved.
## Configuration
[Section titled “Configuration”](#configuration)
| Option | Type | Default | Description |
| :------- | :------- | :------------------ | :----------------------------------------- |
| `header` | `string` | `'Idempotency-Key'` | The request header to look for the key. |
| `ttl` | `number` | `86400000` (24h) | Time to live for the cached response (ms). |
# OpenAPI Validation
> Validate requests against your OpenAPI specification
Shokupan provides a powerful way to enforce your API contract by validating incoming requests directly against your generated OpenAPI specification.
## Overview
[Section titled “Overview”](#overview)
Instead of maintaining separate validation schemas (like Zod) that might drift from your OpenAPI spec, Shokupan can:
1. Generate the OpenAPI spec at startup.
2. Compile high-performance [Ajv](https://ajv.js.org/) validators from that spec.
3. Validate every request against the defined schema before it reaches your handler.
## Installation
[Section titled “Installation”](#installation)
The validation plugin is built-in, but requires `ajv` and `ajv-formats`:
```bash
bun add ajv ajv-formats
```
## Enabling the Flow
[Section titled “Enabling the Flow”](#enabling-the-flow)
To set up the “Spec-First” validation flow where validation schemas are prepared before the server starts listening:
```typescript
import { Shokupan, enableOpenApiValidation } from 'shokupan';
const app = new Shokupan({
// Enable OpenAPI generation (required)
enableOpenApiGen: true,
port: 3000
});
// Enable the validation flow
enableOpenApiValidation(app);
// ... mount routes ...
await app.listen();
```
### How it works
[Section titled “How it works”](#how-it-works)
1. **Boot**: When you call `app.listen()`, the server starts up.
2. **Generation**: It generates the full OpenAPI spec from your code and decorators.
3. **Compilation**: The `onSpecAvailable` hook triggers, compiling Ajv validators for every path and method operation in your spec.
4. **Listening**: The server binds to the port and accepts requests.
## Usage with Controllers
[Section titled “Usage with Controllers”](#usage-with-controllers)
Define your routes as usual. The validator infers types from usage or respects explicit specs.
```typescript
import { Controller, Get, Post, Body } from 'shokupan/decorators';
import { ShokupanContext } from 'shokupan';
@Controller('/users')
class UserController {
@Post('/') // Explicit spec overrides inference if needed
createUser(ctx: ShokupanContext) {
// Request body is validated against schema!
// If invalid, 400 Bad Request is returned automatically.
return ctx.json({ created: true });
}
@Get('/:id')
getUser(ctx: ShokupanContext) {
// ctx.params.id is validated
return ctx.json({ id: ctx.params.id });
}
}
```
## Validation Errors
[Section titled “Validation Errors”](#validation-errors)
When a request fails validation (body, query, params, or headers), Shokupan returns a `400 Bad Request` with details:
```json
{
"error": "Validation Error",
"details": [
{
"location": "body",
"message": "must have required property 'email'",
"params": { "missingProperty": "email" }
}
]
}
```
## Comparison with Zod/Runtime Validation
[Section titled “Comparison with Zod/Runtime Validation”](#comparison-with-zodruntime-validation)
| Feature | OpenAPI Validation | Runtime Validation (Zod/Valibot) |
| ------------------- | ----------------------- | -------------------------------- |
| **Source of Truth** | OpenAPI Spec | TypeScript Code |
| **Maintenance** | Single definition | separate schema vs spec |
| **Performance** | High (Pre-compiled Ajv) | High |
| **Flexibility** | Rigid (Spec-compliant) | Flexible (Custom rules) |
Use OpenAPI Validation when you want strictly enforced API contracts. Use Runtime Validation when you need complex custom logic or conditional validation not easily expressible in OpenAPI.
# Proxy
> Forward requests to another server using the Proxy middleware.
The `Proxy` middleware allows you to forward requests to another server, acting as a reverse proxy. It supports both HTTP and WebSocket connections.
## Usage
[Section titled “Usage”](#usage)
```typescript
import { Proxy } from 'shokupan';
// Forward /api requests to an external API
app.use('/api', Proxy({
target: 'https://api.external.com',
changeOrigin: true
}));
```
## Options
[Section titled “Options”](#options)
| Option | Type | Required | Description |
| :------------- | :------------------------- | :------- | :------------------------------------------------------- |
| `target` | `string` | Yes | The target URL to forward requests to. |
| `pathRewrite` | `(path: string) => string` | No | Function to rewrite the URL path before forwarding. |
| `changeOrigin` | `boolean` | No | Changes the origin of the host header to the target URL. |
| `ws` | `boolean` | No | Enable WebSocket proxying. |
| `headers` | `Record` | No | Custom headers to add to the forwarded request. |
## Examples
[Section titled “Examples”](#examples)
### Path Rewriting
[Section titled “Path Rewriting”](#path-rewriting)
Remove the prefix from the forwarded path:
```typescript
app.use('/api/v1', Proxy({
target: 'https://api.service.com',
pathRewrite: (path) => path.replace('/api/v1', '')
}));
// request: /api/v1/users -> target: https://api.service.com/users
```
### WebSocket Proxy
[Section titled “WebSocket Proxy”](#websocket-proxy)
Forward WebSocket connections:
```typescript
app.use('/socket', Proxy({
target: 'ws://ws.service.com',
ws: true
}));
```
# Rate Limiting
> Protect your API from abuse
The Rate Limit plugin protects your API from abuse by limiting the number of requests from a single IP address.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
```typescript
import { Shokupan, RateLimit } from 'shokupan';
const app = new Shokupan();
// 100 requests per 15 minutes
app.use(RateLimit({
windowMs: 15 * 60 * 1000,
max: 100
}));
app.listen();
```
## Configuration
[Section titled “Configuration”](#configuration)
```typescript
app.use(RateLimit({
windowMs: 15 * 60 * 1000, // Time window (15 minutes)
max: 100, // Max requests per window
message: 'Too many requests from this IP, please try again later',
statusCode: 429, // HTTP status code
keyGenerator: (ctx) => ctx.ip // How to identify clients
}));
```
## Different Limits per Route
[Section titled “Different Limits per Route”](#different-limits-per-route)
```typescript
const apiLimiter = RateLimit({
windowMs: 15 * 60 * 1000,
max: 100
});
const authLimiter = RateLimit({
windowMs: 15 * 60 * 1000,
max: 5,
message: 'Too many login attempts'
});
app.use('/api', apiLimiter);
app.use('/auth/login', authLimiter);
```
## Custom Key Generator
[Section titled “Custom Key Generator”](#custom-key-generator)
Rate limit by user ID instead of IP:
```typescript
app.use(RateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
keyGenerator: (ctx) => {
// Use user ID if authenticated, otherwise IP
return ctx.state.user?.id || ctx.ip;
}
}));
```
## Skip Requests
[Section titled “Skip Requests”](#skip-requests)
Skip rate limiting for certain requests:
```typescript
app.use(RateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
skip: (ctx) => {
// Skip rate limiting for admin users
return ctx.state.user?.role === 'admin';
}
}));
```
## Response Headers
[Section titled “Response Headers”](#response-headers)
The plugin adds these headers to responses:
* `X-RateLimit-Limit`: Maximum requests allowed
* `X-RateLimit-Remaining`: Requests remaining
* `X-RateLimit-Reset`: Time when the limit resets (Unix timestamp)
## Common Patterns
[Section titled “Common Patterns”](#common-patterns)
### API Protection
[Section titled “API Protection”](#api-protection)
```typescript
app.use('/api', RateLimit({
windowMs: 15 * 60 * 1000,
max: 100
}));
```
### Auth Protection
[Section titled “Auth Protection”](#auth-protection)
```typescript
app.use('/auth/login', RateLimit({
windowMs: 15 * 60 * 1000,
max: 5
}));
```
### Registration Protection
[Section titled “Registration Protection”](#registration-protection)
```typescript
app.use('/auth/register', RateLimit({
windowMs: 60 * 60 * 1000, // 1 hour
max: 3
}));
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Security Headers](/plugins/security-headers/) - Add security headers
* [Authentication](/plugins/authentication/) - Secure your API
* [CORS](/plugins/cors/) - Configure CORS
# Scalar (OpenAPI)
> Beautiful interactive API documentation
The Scalar plugin provides beautiful, interactive OpenAPI (Swagger) documentation for your API.
## Quick Start
[Section titled “Quick Start”](#quick-start)
```typescript
import { Shokupan, ScalarPlugin } from 'shokupan';
const app = new Shokupan();
app.mount('/docs', new ScalarPlugin({
baseDocument: {
info: {
title: 'My API',
version: '1.0.0',
description: 'API documentation for my application'
}
},
config: {
theme: 'purple',
layout: 'modern'
}
}));
app.listen();
// Documentation available at: http://localhost:3000/docs
```

## Configuration
[Section titled “Configuration”](#configuration)
```typescript
app.mount('/docs', new ScalarPlugin({
baseDocument: {
info: {
title: 'My API',
version: '1.0.0',
description: 'Comprehensive API documentation',
contact: {
name: 'API Support',
email: 'support@example.com',
url: 'https://example.com/support'
},
license: {
name: 'MIT',
url: 'https://opensource.org/licenses/MIT'
}
},
servers: [
{
url: 'https://api.example.com',
description: 'Production server'
},
{
url: 'https://staging-api.example.com',
description: 'Staging server'
},
{
url: 'http://localhost:3000',
description: 'Development server'
}
]
},
config: {
theme: 'purple', // 'purple', 'blue', 'green', etc.
layout: 'modern', // 'modern' or 'classic'
showSidebar: true,
hideDownloadButton: false
}
}));
```
## Automatic OpenAPI Generation
[Section titled “Automatic OpenAPI Generation”](#automatic-openapi-generation)
Shokupan automatically generates OpenAPI specs from your routes and controllers. You can enhance them with metadata:
```typescript
app.get('/users/:id', {
summary: 'Get user by ID',
description: 'Retrieves a single user by their unique identifier',
tags: ['Users'],
parameters: [{
name: 'id',
in: 'path',
required: true,
schema: { type: 'string' },
description: 'User ID'
}],
responses: {
200: {
description: 'User found',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
id: { type: 'string' },
name: { type: 'string' },
email: { type: 'string' }
}
}
}
}
},
404: {
description: 'User not found'
}
}
}, (ctx) => {
return { id: ctx.params.id, name: 'Alice', email: 'alice@example.com' };
});
```
## Themes
[Section titled “Themes”](#themes)
Available themes:
* `purple` (default)
* `blue`
* `green`
* `red`
* `orange`
* `yellow`
* `dark`
* `light`
```typescript
config: {
theme: 'blue'
}
```
## Security
[Section titled “Security”](#security)
Add authentication to your docs in production:
```typescript
const docsAuth = async (ctx, next) => {
// Basic auth for docs
const auth = ctx.headers.get('authorization');
if (!auth || !validateDocsAuth(auth)) {
ctx.set('WWW-Authenticate', 'Basic realm="Documentation"');
return ctx.status(401);
}
return next();
};
if (process.env.NODE_ENV === 'production') {
app.use('/docs', docsAuth);
}
app.mount('/docs', new ScalarPlugin({...}));
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [OpenAPI Generation](/advanced/openapi/) - Advanced OpenAPI features
* [Validation](/plugins/validation/) - Generate schemas from validators
* [Controllers](/core/controllers/) - Document controller endpoints
# Security Headers
> Add security headers to responses
The Security Headers plugin adds important security headers to protect your application from common web vulnerabilities.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
```typescript
import { Shokupan, SecurityHeaders } from 'shokupan';
const app = new Shokupan();
// Default secure headers
app.use(SecurityHeaders());
app.listen();
```
This adds:
* `X-Content-Type-Options: nosniff`
* `X-Frame-Options: DENY`
* `X-XSS-Protection: 1; mode=block`
* `Strict-Transport-Security` (HSTS)
* Content Security Policy (CSP)
## Custom Configuration
[Section titled “Custom Configuration”](#custom-configuration)
```typescript
app.use(SecurityHeaders({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'", "https://trusted-cdn.com"],
imgSrc: ["'self'", "data:", "https:"],
connectSrc: ["'self'", "https://api.example.com"],
fontSrc: ["'self'", "https://fonts.gstatic.com"],
objectSrc: ["'none'"],
mediaSrc: ["'self'"],
frameSrc: ["'none'"]
}
},
hsts: {
maxAge: 31536000, // 1 year
includeSubDomains: true,
preload: true
},
frameguard: {
action: 'deny' // or 'sameorigin'
}
}));
```
## Content Security Policy (CSP)
[Section titled “Content Security Policy (CSP)”](#content-security-policy-csp)
Prevent XSS and injection attacks:
```typescript
app.use(SecurityHeaders({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'", "https://cdn.example.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
fontSrc: ["'self'", "https://fonts.gstatic.com"],
connectSrc: ["'self'", "https://api.example.com"],
frameSrc: ["'none'"],
objectSrc: ["'none'"]
}
}
}));
```
## HSTS (HTTP Strict Transport Security)
[Section titled “HSTS (HTTP Strict Transport Security)”](#hsts-http-strict-transport-security)
Force HTTPS connections:
```typescript
app.use(SecurityHeaders({
hsts: {
maxAge: 31536000, // 1 year in seconds
includeSubDomains: true, // Apply to all subdomains
preload: true // Submit to HSTS preload list
}
}));
```
## Frame Options
[Section titled “Frame Options”](#frame-options)
Prevent clickjacking:
```typescript
app.use(SecurityHeaders({
frameguard: {
action: 'deny' // Don't allow in iframes at all
// or
action: 'sameorigin' // Allow only same origin
}
}));
```
## Disable Specific Headers
[Section titled “Disable Specific Headers”](#disable-specific-headers)
```typescript
app.use(SecurityHeaders({
contentSecurityPolicy: false, // Disable CSP
hsts: false // Disable HSTS
}));
```
## Development vs Production
[Section titled “Development vs Production”](#development-vs-production)
```typescript
const isDev = process.env.NODE_ENV !== 'production';
app.use(SecurityHeaders({
hsts: isDev ? false : {
maxAge: 31536000,
includeSubDomains: true,
preload: true
},
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: isDev
? ["'self'", "'unsafe-inline'", "'unsafe-eval'"]
: ["'self'"]
}
}
}));
```
## All Headers Explained
[Section titled “All Headers Explained”](#all-headers-explained)
* **Content-Security-Policy**: Prevents XSS attacks
* **X-Content-Type-Options**: Prevents MIME type sniffing
* **X-Frame-Options**: Prevents clickjacking
* **X-XSS-Protection**: Browser XSS protection
* **Strict-Transport-Security**: Forces HTTPS
* **Referrer-Policy**: Controls referrer information
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [CORS](/plugins/cors/) - Configure CORS
* [Rate Limiting](/plugins/rate-limiting/) - Prevent abuse
* [Authentication](/plugins/authentication/) - Secure your API
# Sessions
> Session management with connect-style store support
Shokupan provides session management compatible with connect/express-session stores.
## Basic Usage
[Section titled “Basic Usage”](#basic-usage)
```typescript
import { Shokupan, Session } from 'shokupan';
const app = new Shokupan();
app.use(Session({
secret: 'your-secret-key'
}));
app.get('/login', (ctx) => {
ctx.session.user = { id: '123', name: 'Alice' };
return { message: 'Logged in' };
});
app.get('/profile', (ctx) => {
if (!ctx.session.user) {
return ctx.json({ error: 'Not authenticated' }, 401);
}
return ctx.session.user;
});
app.get('/logout', (ctx) => {
ctx.session.destroy();
return { message: 'Logged out' };
});
app.listen();
```
## Configuration
[Section titled “Configuration”](#configuration)
```typescript
app.use(Session({
secret: 'your-secret-key', // Required
name: 'sessionId', // Cookie name (default: 'connect.sid')
resave: false, // Don't save unchanged sessions
saveUninitialized: false, // Don't create sessions until needed
cookie: {
httpOnly: true,
secure: true, // HTTPS only
maxAge: 24 * 60 * 60 * 1000, // 24 hours
sameSite: 'lax'
}
}));
```
## Session Stores
[Section titled “Session Stores”](#session-stores)
### Memory Store (Development)
[Section titled “Memory Store (Development)”](#memory-store-development)
The default memory store is for development only:
```typescript
app.use(Session({
secret: 'dev-secret'
// Uses memory store by default
}));
```
Production Warning
Memory store doesn’t scale and loses data on restart. Use a persistent store in production.
### Redis Store
[Section titled “Redis Store”](#redis-store)
```bash
bun add connect-redis redis
```
```typescript
import { Session } from 'shokupan';
import RedisStore from 'connect-redis';
import { createClient } from 'redis';
const redisClient = createClient();
await redisClient.connect();
app.use(Session({
secret: process.env.SESSION_SECRET!,
store: new RedisStore({ client: redisClient }),
cookie: {
maxAge: 24 * 60 * 60 * 1000
}
}));
```
### MongoDB Store
[Section titled “MongoDB Store”](#mongodb-store)
```bash
bun add connect-mongo
```
```typescript
import MongoStore from 'connect-mongo';
app.use(Session({
secret: process.env.SESSION_SECRET!,
store: MongoStore.create({
mongoUrl: process.env.MONGODB_URL!
})
}));
```
### SQLite Store
[Section titled “SQLite Store”](#sqlite-store)
```bash
bun add connect-sqlite3
```
```typescript
import SQLiteStore from 'connect-sqlite3';
const SQLiteSession = SQLiteStore(Session);
app.use(Session({
secret: process.env.SESSION_SECRET!,
store: new SQLiteSession({
db: 'sessions.db',
dir: './data'
})
}));
```
## Session Methods
[Section titled “Session Methods”](#session-methods)
### Set Data
[Section titled “Set Data”](#set-data)
```typescript
app.post('/cart/add', async (ctx) => {
const { productId } = await ctx.body();
if (!ctx.session.cart) {
ctx.session.cart = [];
}
ctx.session.cart.push(productId);
return { cart: ctx.session.cart };
});
```
### Get Data
[Section titled “Get Data”](#get-data)
```typescript
app.get('/cart', (ctx) => {
return {
cart: ctx.session.cart || []
};
});
```
### Delete Data
[Section titled “Delete Data”](#delete-data)
```typescript
app.post('/cart/clear', (ctx) => {
delete ctx.session.cart;
return { message: 'Cart cleared' };
});
```
### Destroy Session
[Section titled “Destroy Session”](#destroy-session)
```typescript
app.post('/logout', (ctx) => {
ctx.session.destroy();
return { message: 'Logged out' };
});
```
### Regenerate Session
[Section titled “Regenerate Session”](#regenerate-session)
```typescript
app.post('/login', async (ctx) => {
const { username, password } = await ctx.body();
// Validate credentials
const user = await validateUser(username, password);
if (user) {
// Regenerate session ID (security best practice)
await ctx.session.regenerate();
ctx.session.user = user;
return { message: 'Logged in' };
}
return ctx.json({ error: 'Invalid credentials' }, 401);
});
```
## Common Patterns
[Section titled “Common Patterns”](#common-patterns)
### Authentication
[Section titled “Authentication”](#authentication)
```typescript
// Login
app.post('/login', async (ctx) => {
const { email, password } = await ctx.body();
const user = await authenticateUser(email, password);
if (!user) {
return ctx.json({ error: 'Invalid credentials' }, 401);
}
ctx.session.userId = user.id;
ctx.session.email = user.email;
return { user };
});
// Protected route
const requireAuth = async (ctx, next) => {
if (!ctx.session.userId) {
return ctx.json({ error: 'Unauthorized' }, 401);
}
ctx.state.user = await getUserById(ctx.session.userId);
return next();
};
app.get('/profile', requireAuth, (ctx) => {
return ctx.state.user;
});
// Logout
app.post('/logout', (ctx) => {
ctx.session.destroy();
return { message: 'Logged out' };
});
```
### Shopping Cart
[Section titled “Shopping Cart”](#shopping-cart)
```typescript
app.get('/cart', (ctx) => {
return { items: ctx.session.cart || [] };
});
app.post('/cart', async (ctx) => {
const { productId, quantity } = await ctx.body();
if (!ctx.session.cart) {
ctx.session.cart = [];
}
ctx.session.cart.push({ productId, quantity });
return { cart: ctx.session.cart };
});
```
### Flash Messages
[Section titled “Flash Messages”](#flash-messages)
```typescript
app.post('/submit', async (ctx) => {
// Process form
ctx.session.flash = {
type: 'success',
message: 'Form submitted successfully'
};
return ctx.redirect('/dashboard');
});
app.get('/dashboard', (ctx) => {
const flash = ctx.session.flash;
delete ctx.session.flash; // Remove after reading
return { flash };
});
```
## Security Best Practices
[Section titled “Security Best Practices”](#security-best-practices)
Security
* Use HTTPS in production
* Set `httpOnly: true` to prevent XSS
* Set `secure: true` in production
* Use strong session secrets
* Regenerate sessions after login
* Set appropriate expiration times
```typescript
app.use(Session({
secret: process.env.SESSION_SECRET!, // Strong, random secret
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true, // Prevent XSS
secure: process.env.NODE_ENV === 'production', // HTTPS only
sameSite: 'strict', // CSRF protection
maxAge: 60 * 60 * 1000 // 1 hour
}
}));
```
## TypeScript Types
[Section titled “TypeScript Types”](#typescript-types)
Type your session data:
```typescript
import { ShokupanContext } from 'shokupan';
interface SessionData {
userId?: string;
email?: string;
cart?: Array<{ productId: string; quantity: number }>;
}
declare module 'shokupan' {
interface ShokupanContext {
session: SessionData & {
destroy: () => void;
regenerate: () => Promise;
};
}
}
// Now you have type safety
app.get('/profile', (ctx) => {
const userId = ctx.session.userId; // Typed as string | undefined
});
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Authentication](/plugins/authentication/) - OAuth2 support
* [Rate Limiting](/plugins/rate-limiting/) - Protect login endpoints
* [Security Headers](/plugins/security-headers/) - Add security headers
# Validation
> Validate request data with Zod, TypeBox, Ajv, or Valibot
Shokupan supports multiple validation libraries, giving you the flexibility to use your preferred validator.
## Zod Validation
[Section titled “Zod Validation”](#zod-validation)
[Zod](https://zod.dev/) is the recommended validation library for TypeScript:
```bash
bun add zod
```
### Basic Usage
[Section titled “Basic Usage”](#basic-usage)
```typescript
import { validate } from 'shokupan';
import { z } from 'zod';
const userSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
age: z.number().min(18)
});
app.post('/users',
validate({ body: userSchema }),
async (ctx) => {
const body = await ctx.body(); // Already validated!
return { created: body };
}
);
```
### Validate Different Parts
[Section titled “Validate Different Parts”](#validate-different-parts)
```typescript
import { z } from 'zod';
// Body validation
const createUserSchema = z.object({
name: z.string().min(2),
email: z.string().email()
});
app.post('/users',
validate({ body: createUserSchema }),
async (ctx) => { /* ... */ }
);
// Query validation
const searchSchema = z.object({
q: z.string(),
page: z.coerce.number().default(1),
limit: z.coerce.number().max(100).default(10)
});
app.get('/search',
validate({ query: searchSchema }),
(ctx) => {
const q = ctx.query.get('q');
const page = ctx.query.get('page');
return { q, page };
}
);
// Path parameters validation
app.get('/users/:id',
validate({
params: z.object({
id: z.string().uuid()
})
}),
(ctx) => {
return { id: ctx.params.id };
}
);
// Header validation
app.post('/webhook',
validate({
headers: z.object({
'x-webhook-signature': z.string()
})
}),
async (ctx) => {
// Process webhook
}
);
```
### Complex Schemas
[Section titled “Complex Schemas”](#complex-schemas)
```typescript
const productSchema = z.object({
name: z.string().min(1).max(100),
price: z.number().positive(),
category: z.enum(['electronics', 'clothing', 'food']),
tags: z.array(z.string()).optional(),
metadata: z.record(z.string()).optional(),
inStock: z.boolean().default(true)
});
app.post('/products',
validate({ body: productSchema }),
async (ctx) => {
const product = await ctx.body();
return { created: product };
}
);
```
## TypeBox Validation
[Section titled “TypeBox Validation”](#typebox-validation)
[TypeBox](https://github.com/sinclairzx81/typebox) provides JSON Schema validation:
```bash
bun add @sinclair/typebox
```
```typescript
import { Type } from '@sinclair/typebox';
import { validate } from 'shokupan';
const UserSchema = Type.Object({
name: Type.String({ minLength: 2 }),
email: Type.String({ format: 'email' }),
age: Type.Number({ minimum: 18 })
});
app.post('/users',
validate({ body: UserSchema }),
async (ctx) => {
const user = await ctx.body();
return { created: user };
}
);
```
## Ajv Validation
[Section titled “Ajv Validation”](#ajv-validation)
[Ajv](https://ajv.js.org/) is a fast JSON Schema validator:
```bash
bun add ajv
```
```typescript
import Ajv from 'ajv';
import { validate } from 'shokupan';
const ajv = new Ajv();
const userSchema = ajv.compile({
type: 'object',
properties: {
name: { type: 'string', minLength: 2 },
email: { type: 'string', format: 'email' },
age: { type: 'number', minimum: 18 }
},
required: ['name', 'email', 'age']
});
app.post('/users',
validate({ body: userSchema }),
async (ctx) => {
const user = await ctx.body();
return { created: user };
}
);
```
## Valibot Validation
[Section titled “Valibot Validation”](#valibot-validation)
[Valibot](https://valibot.dev/) is a lightweight alternative:
```bash
bun add valibot
```
```typescript
import * as v from 'valibot';
import { validate, valibot } from 'shokupan';
const UserSchema = v.object({
name: v.pipe(v.string(), v.minLength(2)),
email: v.pipe(v.string(), v.email()),
age: v.pipe(v.number(), v.minValue(18))
});
app.post('/users',
validate({
body: valibot(UserSchema, v.parseAsync)
}),
async (ctx) => {
const user = await ctx.body();
return { created: user };
}
);
```
## Error Handling
[Section titled “Error Handling”](#error-handling)
Validation errors automatically return 400 responses:
```typescript
// POST /users with invalid data
// {
// "name": "A", // Too short
// "email": "invalid", // Not an email
// "age": 15 // Too young
// }
// Response: 400 Bad Request
// {
// "error": "Validation failed",
// "details": [
// {
// "field": "name",
// "message": "String must contain at least 2 character(s)"
// },
// {
// "field": "email",
// "message": "Invalid email"
// },
// {
// "field": "age",
// "message": "Number must be greater than or equal to 18"
// }
// ]
// }
```
## Custom Error Messages
[Section titled “Custom Error Messages”](#custom-error-messages)
Override default error messages:
```typescript
const userSchema = z.object({
name: z.string().min(2, 'Name must be at least 2 characters'),
email: z.string().email('Please provide a valid email'),
age: z.number().min(18, 'You must be 18 or older')
});
```
## With Controllers
[Section titled “With Controllers”](#with-controllers)
Use validation with controller decorators:
```typescript
import { Post, Body, Use } from 'shokupan';
import { validate } from 'shokupan';
import { z } from 'zod';
const createUserSchema = z.object({
name: z.string().min(2),
email: z.string().email()
});
export class UserController {
@Post('/')
@Use(validate({ body: createUserSchema }))
async createUser(@Body() body: any) {
return { created: body };
}
}
```
## Conditional Validation
[Section titled “Conditional Validation”](#conditional-validation)
Validate based on conditions:
```typescript
const createSchema = z.object({
name: z.string(),
email: z.string().email()
});
const updateSchema = z.object({
name: z.string().optional(),
email: z.string().email().optional()
}).refine(data => data.name || data.email, {
message: 'At least one field must be provided'
});
app.post('/users', validate({ body: createSchema }), createHandler);
app.put('/users/:id', validate({ body: updateSchema }), updateHandler);
```
## Transform Data
[Section titled “Transform Data”](#transform-data)
Use validators to transform data:
```typescript
const productSchema = z.object({
name: z.string().trim().toLowerCase(),
price: z.string().transform(val => parseFloat(val)),
tags: z.string().transform(val => val.split(','))
});
app.post('/products',
validate({ body: productSchema }),
async (ctx) => {
const product = await ctx.body();
// product.name is trimmed and lowercase
// product.price is a number
// product.tags is an array
return { product };
}
);
```
## Next Steps
[Section titled “Next Steps”](#next-steps)
* [Controllers](/core/controllers/) - Use validation with controllers
* [Authentication](/plugins/authentication/) - Secure your API
* [OpenAPI](/advanced/openapi/) - Generate API docs from schemas
# Roadmap
> Future features and development plans
## Current Features ✅
[Section titled “Current Features ✅”](#current-features)
* **Built for Bun** - Native performance
* **Express Ecosystem** - Middleware support
* **TypeScript First** - Decorators, Generics, Type Safety
* **Auto OpenAPI** - Scalar documentation
* **Rich Plugin System** - CORS, Session, Validation, Rate Limiting
* **Dependency Injection** - Container for dependency injection
* **OpenTelemetry** - Built-in traces
* **OAuth2** - Built-in OAuth2 support
* **Request-Scoped Globals** - Via AsyncLocalStorage
## Future Features 🔄
[Section titled “Future Features 🔄”](#future-features)
### Runtime Compatibility
[Section titled “Runtime Compatibility”](#runtime-compatibility)
* Support for Deno and Node.js
* Cross-runtime testing
### Framework Plugins
[Section titled “Framework Plugins”](#framework-plugins)
* Drop-in adapters for Express, Koa, and Elysia
### Enhanced WebSockets
[Section titled “Enhanced WebSockets”](#enhanced-websockets)
* Event support
* HTTP simulation
### Deep Introspection
[Section titled “Deep Introspection”](#deep-introspection)
* Type analysis for enhanced OpenAPI generation
* Automatic schema generation from TypeScript types
### Benchmarks
[Section titled “Benchmarks”](#benchmarks)
* Comprehensive performance comparisons
* CI/CD performance tracking
### Scaling
[Section titled “Scaling”](#scaling)
* Automatic clustering support
* Load balancing
### RPC Support
[Section titled “RPC Support”](#rpc-support)
* tRPC integration
* gRPC support
### Binary Formats
[Section titled “Binary Formats”](#binary-formats)
* Protobuf support
* MessagePack support
### Reliability
[Section titled “Reliability”](#reliability)
* Circuit breaker pattern
* Retry mechanisms
* Health checks
### Strict Mode
[Section titled “Strict Mode”](#strict-mode)
* Enforced controller patterns
* Compile-time route validation
### Standardized Errors
[Section titled “Standardized Errors”](#standardized-errors)
* Consistent 4xx/5xx error formats
* Error cataloging
## Contributing
[Section titled “Contributing”](#contributing)
We welcome contributions! Check out our [GitHub repository](https://github.com/knackstedt/shokupan) to get involved.
# Changelog
**v0.7.0** - 1/7/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.6.1...v0.7.0
**v0.6.1** - 1/5/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.6.0...v0.6.1
**v0.6.0** - 1/5/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.5.0...v0.6.0
**v0.5.0** - 1/2/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.4.5...v0.5.0
**v0.4.5** - 1/1/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.4.4...v0.4.5
**v0.4.4** - 1/1/2026
\*\*Full Changelog\*\*: https\://github.com/knackstedt/shokupan/compare/v0.4.3...v0.4.4