Skip to content

Commit

Permalink
sync
Browse files Browse the repository at this point in the history
  • Loading branch information
unnoq committed Dec 28, 2024
1 parent c2ac328 commit e8b8100
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 24 deletions.
12 changes: 9 additions & 3 deletions apps/content/content/docs/openapi/generator.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,18 @@ export const router = pub.router({
To generate an OpenAPI specification, you need either the type of the [router](/docs/server/router) you intend to use or the [contract](/docs/contract/builder).

```ts twoslash
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'
import { ZodToJsonSchemaConverter } from '@orpc/zod'
import { router } from 'examples/server'
import { contract } from 'examples/contract'

const spec = generateOpenAPI({
router: contract, // both router and contract are supported
const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

const spec = await openAPIGenerator.generate(contract /* or router */, {
info: {
title: 'My App',
version: '0.0.0',
Expand Down
15 changes: 10 additions & 5 deletions apps/content/examples/open-api.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'
import { ZodToJsonSchemaConverter } from '@orpc/zod'
import { contract } from 'examples/contract'
import { router } from 'examples/server'

export const specFromServerRouter = generateOpenAPI({
router,
const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

export const specFromServerRouter = await openAPIGenerator.generate(router, {
info: {
title: 'My App',
version: '0.0.0',
},
})

export const specFromContractRouter = generateOpenAPI({
router: contract,
export const specFromContractRouter = await openAPIGenerator.generate(contract, {
info: {
title: 'My App',
version: '0.0.0',
Expand Down
3 changes: 2 additions & 1 deletion packages/next/src/action-form.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Schema, SchemaInput } from '@orpc/contract'
import type { Context, CreateProcedureClientOptions } from '@orpc/server'
import { JSONSerializer } from '@orpc/openapi'
import { CompositeSchemaCoercer, OpenAPIPayloadCodec, type PublicOpenAPIPayloadCodec, type SchemaCoercer } from '@orpc/openapi/fetch'
import { createProcedureClient, ORPCError, unlazy } from '@orpc/server'
import { forbidden, notFound, unauthorized } from 'next/navigation'
Expand All @@ -21,7 +22,7 @@ export function createFormAction<

const formAction = async (input: FormData): Promise<void> => {
try {
const codec = opt.payloadCodec ?? new OpenAPIPayloadCodec()
const codec = opt.payloadCodec ?? new OpenAPIPayloadCodec(new JSONSerializer())
const coercer = new CompositeSchemaCoercer(opt.schemaCoercers ?? [])

const { default: procedure } = await unlazy(opt.procedure)
Expand Down
13 changes: 9 additions & 4 deletions playgrounds/contract-openapi/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { createServer } from 'node:http'
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'
import { OpenAPIServerHandler } from '@orpc/openapi/fetch'
import { CompositeHandler, ORPCHandler } from '@orpc/server/fetch'
import { ZodCoercer } from '@orpc/zod'
import { ZodCoercer, ZodToJsonSchemaConverter } from '@orpc/zod'
import { createServerAdapter } from '@whatwg-node/server'
import { contract } from './contract'
import { router } from './router'
Expand All @@ -23,6 +23,12 @@ const orpcHandler = new ORPCHandler(router, {
})
const compositeHandler = new CompositeHandler([openAPIHandler, orpcHandler])

const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

const server = createServer(
createServerAdapter(async (request: Request) => {
const url = new URL(request.url)
Expand All @@ -39,8 +45,7 @@ const server = createServer(
}

if (url.pathname === '/spec.json') {
const spec = await generateOpenAPI({
router: contract,
const spec = await openAPIGenerator.generate(contract, {
info: {
title: 'ORPC Playground',
version: '1.0.0',
Expand Down
12 changes: 8 additions & 4 deletions playgrounds/expressjs/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'
import { OpenAPIServerHandler } from '@orpc/openapi/fetch'
import { CompositeHandler, ORPCHandler } from '@orpc/server/fetch'
import { ZodCoercer } from '@orpc/zod'
import { ZodCoercer, ZodToJsonSchemaConverter } from '@orpc/zod'
import { createServerAdapter } from '@whatwg-node/server'
import express from 'express'
import { router } from './router'
Expand Down Expand Up @@ -37,10 +37,14 @@ app.all(
})
}),
)
const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

app.get('/spec.json', async (req, res) => {
const spec = await generateOpenAPI({
router,
const spec = await openAPIGenerator.generate(router, {
info: {
title: 'ORPC Playground',
version: '1.0.0',
Expand Down
13 changes: 10 additions & 3 deletions playgrounds/nextjs/src/app/spec/route.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'

import { ZodToJsonSchemaConverter } from '@orpc/zod'
import { router } from '../api/[...rest]/router'

const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

export async function GET(request: Request) {
const spec = await generateOpenAPI({
router,
const spec = await openAPIGenerator.generate(router, {
info: {
title: 'ORPC Playground',
version: '1.0.0',
Expand Down
13 changes: 9 additions & 4 deletions playgrounds/openapi/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { createServer } from 'node:http'
import { generateOpenAPI } from '@orpc/openapi'
import { OpenAPIGenerator } from '@orpc/openapi'
import { OpenAPIServerHandler } from '@orpc/openapi/fetch'
import { CompositeHandler, ORPCHandler } from '@orpc/server/fetch'
import { ZodCoercer } from '@orpc/zod'
import { ZodCoercer, ZodToJsonSchemaConverter } from '@orpc/zod'
import { createServerAdapter } from '@whatwg-node/server'
import { router } from './router'
import './polyfill'
Expand All @@ -22,6 +22,12 @@ const orpcHandler = new ORPCHandler(router, {
})
const compositeHandler = new CompositeHandler([openAPIHandler, orpcHandler])

const openAPIGenerator = new OpenAPIGenerator({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
})

const server = createServer(
createServerAdapter(async (request: Request) => {
const url = new URL(request.url)
Expand All @@ -38,8 +44,7 @@ const server = createServer(
}

if (url.pathname === '/spec.json') {
const spec = await generateOpenAPI({
router,
const spec = await openAPIGenerator.generate(router, {
info: {
title: 'ORPC Playground',
version: '1.0.0',
Expand Down

0 comments on commit e8b8100

Please sign in to comment.