An open API service indexing awesome lists of open source software.

https://github.com/narumincho/http-server


https://github.com/narumincho/http-server

Last synced: about 1 month ago
JSON representation

Awesome Lists containing this project

README

          

# http-server

[![JSR](https://jsr.io/badges/@narumincho/http-server)](https://jsr.io/@narumincho/http-server)

[Hono](https://github.com/honojs/hono) や
[Elysia](https://github.com/elysiajs/elysia) とは違い,
メソッド記法ではなく純粋な関数を組み合わせて作る, 型がついたHTTP サーバー

Deno を使って開発中. まだ機能不足

```ts
import {
body,
createHandler,
json,
operation,
query,
requestHeader,
response,
} from "jsr:@narumincho/http-server";
import {
createOpenApi,
createOpenApiOperation,
} from "jsr:@narumincho/http-server/openApi.ts";
import { createRedocOperation } from "jsr:@narumincho/http-server/redoc.ts";
import { createScalarOperation } from "jsr:@narumincho/http-server/scalar.ts";

const operations: Parameters["0"]["operations"] = [
operation.get({
path: "/items",
description: "アイテムを一覧で取得します",
queryParameters: {
filter: query.optional({
description: "フィルターのパラメーター",
queryItemType: query.string(),
example: "a",
}),
withDetail: query.optional({
description: "",
queryItemType: query.boolean(),
example: false,
}),
sampleRequired: query.required({
description: "必須パラメーター テスト",
queryItemType: query.string(),
example: "サンプル必須!",
}),
},
requestHeaders: [
requestHeader.required(requestHeader.authorizationBearer({}), {}),
],
responses: [
response.ok({
description: "取得結果を返します",
headers: [],
content: [
body.applicationJson(json.array(json.object({
name: json.string(),
}))),
body.applicationOctetStream(),
],
}),
],
// deno-lint-ignore require-await
handler: async ({ pathParameters, queryParameters, response }) => {
console.log(pathParameters, queryParameters);
return response["200"]({}, "application/json", [{ name: "" }]);
},
}),
operation.post({
path: "/items",
queryParameters: {},
responses: [response.ok({
headers: [],
description: "結果を返します",
content: [
body.applicationJson(json.object({
wip: json.string(),
})),
],
})],
// deno-lint-ignore require-await
handler: async ({ pathParameters, queryParameters, response }) => {
console.log(pathParameters, queryParameters);
return response["200"]({}, "application/json", { wip: "123" });
},
}),
operation.get({
path: "/items/:id",
queryParameters: {
withDetail: query.optional({
description: "詳細情報も取得するかどうか",
queryItemType: query.boolean(),
example: false,
}),
},
responses: [response.ok({
headers: [],
description: "結果を返します",
content: [
body.applicationJson(json.object({
wip: json.string(),
})),
],
})],
// deno-lint-ignore require-await
handler: async ({ pathParameters, queryParameters, response }) => {
console.log(pathParameters, queryParameters);
return response["200"]({}, "application/json", { wip: "123" });
},
}),
operation.patch({
path: "/items/:id",
responses: [response.ok({
headers: [],
description: "結果を返します",
content: [
body.applicationJson(json.object({
wip: json.string(),
})),
],
})],
// deno-lint-ignore require-await
handler: async ({ pathParameters, queryParameters, response }) => {
console.log(pathParameters, queryParameters);
return response["200"]({}, "application/json", { wip: "123" });
},
}),
operation.delete({
path: "/items/:id",
responses: [response.ok({
headers: [],
description: "結果を返します",
content: [
body.applicationJson(json.object({
wip: json.string(),
})),
],
})],
// deno-lint-ignore require-await
handler: async ({ pathParameters, queryParameters, response }) => {
console.log(pathParameters, queryParameters);
return response["200"]({}, "application/json", { wip: "123" });
},
}),
createOpenApiOperation({
path: "/openapi",
// deno-lint-ignore require-await
handler: async ({ response }) =>
response["200"](
{},
"application/json",
createOpenApi({
info: {
title: "@narumincho/http-server example",
version: "0.0.1",
},
operations,
}),
),
}),
createRedocOperation({ path: "/redoc", openApiPath: "/openapi" }),
createScalarOperation({ path: "/scalar", openApiPath: "/openapi" }),
];

Deno.serve(
createHandler({
operations,
}),
);
```