Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47,444 changes: 45,621 additions & 1,823 deletions integration-tests/typescript-koa/src/api.github.com.yaml/generated.ts

Large diffs are not rendered by default.

5,791 changes: 5,760 additions & 31 deletions integration-tests/typescript-koa/src/api.github.com.yaml/models.ts

Large diffs are not rendered by default.

15,376 changes: 15,376 additions & 0 deletions integration-tests/typescript-koa/src/api.github.com.yaml/schemas.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,29 @@
import {
t_AddPetBodySchema,
t_DeletePetParamSchema,
t_Error,
t_FindPetByIdParamSchema,
t_FindPetsQuerySchema,
t_NewPet,
t_Pet,
} from "./models"
import { s_Error, s_NewPet, s_Pet } from "./schemas"
import KoaRouter from "@koa/router"
import {
Response,
ServerConfig,
StatusCode,
StatusCode2xx,
StatusCode3xx,
StatusCode4xx,
StatusCode5xx,
startServer,
} from "@nahkies/typescript-koa-runtime/server"
import { Params, parseRequestInput } from "@nahkies/typescript-koa-runtime/zod"
import {
Params,
parseRequestInput,
responseValidationFactory,
} from "@nahkies/typescript-koa-runtime/zod"
import { Context } from "koa"
import { z } from "zod"

Expand All @@ -23,22 +37,22 @@ import { z } from "zod"
export type FindPets = (
params: Params<void, t_FindPetsQuerySchema, void>,
ctx: Context
) => Promise<{ status: number; body: any }>
) => Promise<Response<200, t_Pet[]> | Response<StatusCode, t_Error>>

export type AddPet = (
params: Params<void, void, t_AddPetBodySchema>,
ctx: Context
) => Promise<{ status: number; body: any }>
) => Promise<Response<200, t_Pet> | Response<StatusCode, t_Error>>

export type FindPetById = (
params: Params<t_FindPetByIdParamSchema, void, void>,
ctx: Context
) => Promise<{ status: number; body: any }>
) => Promise<Response<200, t_Pet> | Response<StatusCode, t_Error>>

export type DeletePet = (
params: Params<t_DeletePetParamSchema, void, void>,
ctx: Context
) => Promise<{ status: number; body: any }>
) => Promise<Response<204, void> | Response<StatusCode, t_Error>>

export type Implementation = {
findPets: FindPets
Expand All @@ -59,6 +73,11 @@ export function bootstrap(
limit: z.coerce.number().optional(),
})

const findPetsResponseValidator = responseValidationFactory(
[["200", z.array(s_NewPet.merge(z.object({ id: z.coerce.number() })))]],
s_Error
)

router.get("findPets", "/pets", async (ctx, next) => {
const input = {
params: undefined,
Expand All @@ -67,15 +86,18 @@ export function bootstrap(
}

const { status, body } = await implementation.findPets(input, ctx)

ctx.body = findPetsResponseValidator(status, body)
ctx.status = status
ctx.body = body
return next()
})

const addPetBodySchema = z.object({
name: z.coerce.string(),
tag: z.coerce.string().optional(),
})
const addPetBodySchema = s_NewPet

const addPetResponseValidator = responseValidationFactory(
[["200", s_Pet]],
s_Error
)

router.post("addPet", "/pets", async (ctx, next) => {
const input = {
Expand All @@ -85,13 +107,19 @@ export function bootstrap(
}

const { status, body } = await implementation.addPet(input, ctx)

ctx.body = addPetResponseValidator(status, body)
ctx.status = status
ctx.body = body
return next()
})

const findPetByIdParamSchema = z.object({ id: z.coerce.number() })

const findPetByIdResponseValidator = responseValidationFactory(
[["200", s_Pet]],
s_Error
)

router.get("findPetById", "/pets/:id", async (ctx, next) => {
const input = {
params: parseRequestInput(findPetByIdParamSchema, ctx.params),
Expand All @@ -100,13 +128,19 @@ export function bootstrap(
}

const { status, body } = await implementation.findPetById(input, ctx)

ctx.body = findPetByIdResponseValidator(status, body)
ctx.status = status
ctx.body = body
return next()
})

const deletePetParamSchema = z.object({ id: z.coerce.number() })

const deletePetResponseValidator = responseValidationFactory(
[["204", z.void()]],
s_Error
)

router.delete("deletePet", "/pets/:id", async (ctx, next) => {
const input = {
params: parseRequestInput(deletePetParamSchema, ctx.params),
Expand All @@ -115,8 +149,9 @@ export function bootstrap(
}

const { status, body } = await implementation.deletePet(input, ctx)

ctx.body = deletePetResponseValidator(status, body)
ctx.status = status
ctx.body = body
return next()
})

Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,40 @@
import { bootstrap, FindPetById } from "./generated"

const notImplemented = async () => {
return { status: 501, body: { error: 'not implemented' } }
return {
status: 501 as const,
body: { code: 1, message: 'not implemented' }
}
}

const findPetById: FindPetById = async ({params}, ctx) => {
switch (params.id) {
case 1:
return {
status: 200,
status: 200 as const,
body: {
id: 1,
name: "Jake",
breed: "border-collie",
},
}

case 2:
return {
status: 200,
status: 200 as const,
body: {
id: 2,
name: "Lacy",
breed: "border-collie",
},
}

default:
return {
status: 404,
status: 404 as const,
body: {
error: 'not found',
code: 2,
message: 'not found',
},
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@
/* tslint:disable */
/* eslint:disable */

export type t_Error = {
code: number
message: string
}

export type t_NewPet = {
name: string
tag?: string
}

export type t_Pet = t_NewPet & {
id: number
}

export type t_AddPetBodySchema = {
name: string
tag?: string
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/** AUTOGENERATED - DO NOT EDIT **/
/* tslint:disable */
/* eslint:disable */

import { z } from "zod"

export const s_Error = z.object({
code: z.coerce.number(),
message: z.coerce.string(),
})

export const s_NewPet = z.object({
name: z.coerce.string(),
tag: z.coerce.string().optional(),
})

export const s_Pet = s_NewPet.merge(z.object({ id: z.coerce.number() }))
Loading