Skip to content

Commit 68855d9

Browse files
committed
ApiEndpointsからからjson schemaへの変換処理を共通化
1 parent fa31cac commit 68855d9

File tree

7 files changed

+57
-104
lines changed

7 files changed

+57
-104
lines changed

pkgs/docs/docs/07_openapi.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
sidebar_position: 7
3+
---
4+
5+
# OpenAPI
6+
7+
The [OpenAPI](https://swagger.io/specification) Specification (OAS) defines a standard, language-agnostic interface to HTTP APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined, a consumer can understand and interact with the remote service with a minimal amount of implementation logic.
8+
9+
typed-api-spec provides a way to generate OpenAPI specification from specs written by TypeScript.

pkgs/docs/docs/07_playground.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
sidebar_position: 7
2+
sidebar_position: 8
33
---
44

55
# Playground
Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,54 @@
11
import {
2+
AnyApiEndpoint,
3+
AnyApiEndpoints,
4+
AnyApiResponses,
5+
AnyApiSpec,
26
apiSpecRequestKeys,
37
extractExtraApiSpecProps,
48
extractExtraResponseProps,
59
JsonSchemaApiEndpoints,
610
JsonSchemaApiResponses,
711
JsonSchemaApiSpec,
812
Method,
9-
StatusCode,
10-
} from "../core";
11-
import {
12-
ZodAnyApiResponses,
13-
ZodApiEndpoint,
14-
ZodApiEndpoints,
15-
ZodApiSpec,
16-
} from "./index";
17-
import { createSchema } from "zod-openapi";
13+
} from "./spec";
14+
import { StatusCode } from "./hono-types";
1815
import { JSONSchema7 } from "json-schema";
19-
import { z } from "zod";
2016

21-
export const toJsonSchemaApiEndpoints = <E extends ZodApiEndpoints>(
17+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
18+
type ToSchema = (schema: any) => JSONSchema7;
19+
20+
export const toJsonSchemaApiEndpoints = <E extends AnyApiEndpoints>(
21+
toSchema: ToSchema,
2222
endpoints: E,
2323
): JsonSchemaApiEndpoints => {
2424
const ret: JsonSchemaApiEndpoints = {};
2525
for (const path of Object.keys(endpoints)) {
26-
ret[path] = toJsonSchemaEndpoint(endpoints[path]);
26+
ret[path] = toJsonSchemaEndpoint(toSchema, endpoints[path]);
2727
}
2828
return ret;
2929
};
3030

31-
export const toJsonSchemaEndpoint = <Endpoint extends ZodApiEndpoint>(
31+
export const toJsonSchemaEndpoint = <Endpoint extends AnyApiEndpoint>(
32+
toSchema: ToSchema,
3233
endpoint: Endpoint,
3334
) => {
3435
const ret: Partial<Record<Method, JsonSchemaApiSpec>> = {};
3536
for (const method of Method) {
3637
const spec = endpoint[method];
3738
if (spec) {
38-
ret[method] = toJsonSchemaApiSpec(spec);
39+
ret[method] = toJsonSchemaApiSpec(toSchema, spec);
3940
}
4041
}
4142
return ret;
4243
};
4344

44-
export const toJsonSchemaApiSpec = <Spec extends ZodApiSpec>(
45+
export const toJsonSchemaApiSpec = <Spec extends AnyApiSpec>(
46+
toSchema: ToSchema,
4547
spec: Spec,
4648
): JsonSchemaApiSpec => {
4749
const extraProps = extractExtraApiSpecProps(spec);
4850
const ret: JsonSchemaApiSpec = {
49-
responses: toJsonSchemaResponses(spec.responses),
51+
responses: toJsonSchemaResponses(toSchema, spec.responses),
5052
};
5153
for (const key of apiSpecRequestKeys) {
5254
if (spec[key]) {
@@ -58,7 +60,8 @@ export const toJsonSchemaApiSpec = <Spec extends ZodApiSpec>(
5860
};
5961

6062
const toJsonSchemaResponses = (
61-
responses: ZodAnyApiResponses,
63+
toSchema: ToSchema,
64+
responses: AnyApiResponses,
6265
): JsonSchemaApiResponses => {
6366
const statusCodes = Object.keys(responses).map(Number) as StatusCode[];
6467
const ret: JsonSchemaApiResponses = {};
@@ -75,7 +78,3 @@ const toJsonSchemaResponses = (
7578
}
7679
return ret;
7780
};
78-
79-
const toSchema = (s: z.ZodTypeAny) => {
80-
return createSchema(s).schema as JSONSchema7;
81-
};
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from "./spec";
22
export * from "./util";
3-
export * from "./jsonschema";
43
export * from "./validator";
54
export * from "./openapi";

pkgs/typed-api-spec/src/valibot/jsonschema.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

pkgs/typed-api-spec/src/valibot/openapi.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { OpenAPIV3_1 } from "openapi-types";
2-
import { toJsonSchemaApiEndpoints } from "./jsonschema";
3-
import { toOpenApiDoc as toOpenApiDocOrg } from "../core";
2+
import {
3+
JsonSchemaApiEndpoints,
4+
toOpenApiDoc as toOpenApiDocOrg,
5+
} from "../core";
46
import { AnyV } from "./util";
57
import {
68
BaseOpenApiSpec,
@@ -9,7 +11,9 @@ import {
911
JsonSchemaOpenApiEndpoints,
1012
ToOpenApiResponse,
1113
} from "../core/openapi/spec";
12-
import { ValibotAnyApiResponse } from "./spec";
14+
import { ValibotAnyApiResponse, ValibotApiEndpoints } from "./spec";
15+
import { toJsonSchemaApiEndpoints as toEndpoints } from "../core/jsonschema";
16+
import { toJsonSchema } from "@valibot/to-json-schema";
1317

1418
export const toOpenApiDoc = <E extends ValibotOpenApiEndpoints>(
1519
doc: Omit<OpenAPIV3_1.Document, "paths">,
@@ -37,3 +41,7 @@ export type ValibotOpenApiSpec<
3741
RequestHeaders extends AnyV = AnyV,
3842
Responses extends ValibotAnyOpenApiResponses = ValibotAnyOpenApiResponses,
3943
> = BaseOpenApiSpec<Params, Query, Body, RequestHeaders, Responses>;
44+
45+
export const toJsonSchemaApiEndpoints = <E extends ValibotApiEndpoints>(
46+
endpoints: E,
47+
): JsonSchemaApiEndpoints => toEndpoints(toJsonSchema, endpoints);

pkgs/typed-api-spec/src/zod/openapi.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { OpenAPIV3_1 } from "openapi-types";
2-
import { toJsonSchemaApiEndpoints } from "./jsonschema";
3-
import { toOpenApiDoc as toOpenApiDocOrg } from "../core";
2+
import {
3+
JsonSchemaApiEndpoints,
4+
toOpenApiDoc as toOpenApiDocOrg,
5+
} from "../core";
46
import {
57
BaseOpenApiSpec,
68
DefineOpenApiEndpoint,
@@ -9,7 +11,10 @@ import {
911
ToOpenApiResponse,
1012
} from "../core/openapi/spec";
1113
import { z } from "zod";
12-
import { ZodAnyApiResponse } from "./index";
14+
import { ZodAnyApiResponse, ZodApiEndpoints } from "./index";
15+
import { toJsonSchemaApiEndpoints as toEndpoints } from "../core/jsonschema";
16+
import { createSchema } from "zod-openapi";
17+
import { JSONSchema7 } from "json-schema";
1318

1419
export const toOpenApiDoc = <E extends ZodOpenApiEndpoints>(
1520
doc: Omit<OpenAPIV3_1.Document, "paths">,
@@ -36,3 +41,11 @@ export type ZodOpenApiSpec<
3641
RequestHeaders extends z.ZodTypeAny = z.ZodTypeAny,
3742
Responses extends ZodAnyOpenApiResponses = ZodAnyOpenApiResponses,
3843
> = BaseOpenApiSpec<Params, Query, Body, RequestHeaders, Responses>;
44+
45+
export const toJsonSchemaApiEndpoints = <E extends ZodApiEndpoints>(
46+
endpoints: E,
47+
): JsonSchemaApiEndpoints => toEndpoints(toSchema, endpoints);
48+
49+
const toSchema = (s: z.ZodTypeAny) => {
50+
return createSchema(s).schema as JSONSchema7;
51+
};

0 commit comments

Comments
 (0)