semola 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -20
- package/dist/api/core/index.cjs +206 -0
- package/dist/api/core/index.d.cts +21 -0
- package/dist/api/core/index.d.cts.map +1 -0
- package/dist/api/core/index.d.mts +21 -0
- package/dist/api/core/index.d.mts.map +1 -0
- package/dist/api/core/index.mjs +208 -0
- package/dist/api/core/index.mjs.map +1 -0
- package/dist/api/core/types.d.cts +107 -0
- package/dist/api/core/types.d.cts.map +1 -0
- package/dist/api/core/types.d.mts +107 -0
- package/dist/api/core/types.d.mts.map +1 -0
- package/dist/api/middleware/index.cjs +8 -0
- package/dist/api/middleware/index.d.cts +11 -0
- package/dist/api/middleware/index.d.cts.map +1 -0
- package/dist/api/middleware/index.d.mts +11 -0
- package/dist/api/middleware/index.d.mts.map +1 -0
- package/dist/api/middleware/index.mjs +10 -0
- package/dist/api/middleware/index.mjs.map +1 -0
- package/dist/api/middleware/types.d.cts +16 -0
- package/dist/api/middleware/types.d.cts.map +1 -0
- package/dist/api/middleware/types.d.mts +16 -0
- package/dist/api/middleware/types.d.mts.map +1 -0
- package/dist/api/openapi/index.cjs +254 -0
- package/dist/api/openapi/index.mjs +256 -0
- package/dist/api/openapi/index.mjs.map +1 -0
- package/dist/api/openapi/types.d.cts +60 -0
- package/dist/api/openapi/types.d.cts.map +1 -0
- package/dist/api/openapi/types.d.mts +60 -0
- package/dist/api/openapi/types.d.mts.map +1 -0
- package/dist/api/validation/index.cjs +64 -0
- package/dist/api/validation/index.mjs +61 -0
- package/dist/api/validation/index.mjs.map +1 -0
- package/dist/cache/types.d.cts +17 -0
- package/dist/cache/types.d.cts.map +1 -0
- package/dist/cache/types.d.mts +17 -0
- package/dist/cache/types.d.mts.map +1 -0
- package/dist/cron/scanner.cjs +237 -0
- package/dist/cron/scanner.mjs +238 -0
- package/dist/cron/scanner.mjs.map +1 -0
- package/dist/cron/types.d.cts +11 -0
- package/dist/cron/types.d.cts.map +1 -0
- package/dist/cron/types.d.mts +11 -0
- package/dist/cron/types.d.mts.map +1 -0
- package/dist/errors/types.d.cts +5 -0
- package/dist/errors/types.d.cts.map +1 -0
- package/dist/errors/types.d.mts +5 -0
- package/dist/errors/types.d.mts.map +1 -0
- package/dist/i18n/types.d.cts +13 -0
- package/dist/i18n/types.d.cts.map +1 -0
- package/dist/i18n/types.d.mts +13 -0
- package/dist/i18n/types.d.mts.map +1 -0
- package/dist/lib/api/index.cjs +5 -0
- package/dist/lib/api/index.d.cts +5 -0
- package/dist/lib/api/index.d.mts +5 -0
- package/dist/lib/api/index.mjs +3 -0
- package/dist/lib/cache/index.cjs +74 -0
- package/dist/lib/cache/index.d.cts +36 -0
- package/dist/lib/cache/index.d.cts.map +1 -0
- package/dist/lib/cache/index.d.mts +36 -0
- package/dist/lib/cache/index.d.mts.map +1 -0
- package/dist/lib/cache/index.mjs +75 -0
- package/dist/lib/cache/index.mjs.map +1 -0
- package/dist/lib/cron/index.cjs +276 -0
- package/dist/lib/cron/index.d.cts +39 -0
- package/dist/lib/cron/index.d.cts.map +1 -0
- package/dist/lib/cron/index.d.mts +39 -0
- package/dist/lib/cron/index.d.mts.map +1 -0
- package/dist/lib/cron/index.mjs +277 -0
- package/dist/lib/cron/index.mjs.map +1 -0
- package/dist/lib/errors/index.cjs +30 -0
- package/dist/lib/errors/index.d.cts +13 -0
- package/dist/lib/errors/index.d.cts.map +1 -0
- package/dist/lib/errors/index.d.mts +13 -0
- package/dist/lib/errors/index.d.mts.map +1 -0
- package/dist/lib/errors/index.mjs +28 -0
- package/dist/lib/errors/index.mjs.map +1 -0
- package/dist/lib/i18n/index.cjs +37 -0
- package/dist/lib/i18n/index.d.cts +20 -0
- package/dist/lib/i18n/index.d.cts.map +1 -0
- package/dist/lib/i18n/index.d.mts +20 -0
- package/dist/lib/i18n/index.d.mts.map +1 -0
- package/dist/lib/i18n/index.mjs +38 -0
- package/dist/lib/i18n/index.mjs.map +1 -0
- package/dist/lib/policy/index.cjs +99 -0
- package/dist/lib/policy/index.d.cts +21 -0
- package/dist/lib/policy/index.d.cts.map +1 -0
- package/dist/lib/policy/index.d.mts +21 -0
- package/dist/lib/policy/index.d.mts.map +1 -0
- package/dist/lib/policy/index.mjs +81 -0
- package/dist/lib/policy/index.mjs.map +1 -0
- package/dist/lib/prompts/index.cjs +409 -0
- package/dist/lib/prompts/index.d.cts +31 -0
- package/dist/lib/prompts/index.d.cts.map +1 -0
- package/dist/lib/prompts/index.d.mts +31 -0
- package/dist/lib/prompts/index.d.mts.map +1 -0
- package/dist/lib/prompts/index.mjs +405 -0
- package/dist/lib/prompts/index.mjs.map +1 -0
- package/dist/lib/pubsub/index.cjs +48 -0
- package/dist/lib/pubsub/index.d.cts +27 -0
- package/dist/lib/pubsub/index.d.cts.map +1 -0
- package/dist/lib/pubsub/index.d.mts +27 -0
- package/dist/lib/pubsub/index.d.mts.map +1 -0
- package/dist/lib/pubsub/index.mjs +49 -0
- package/dist/lib/pubsub/index.mjs.map +1 -0
- package/dist/lib/queue/index.cjs +182 -0
- package/dist/lib/queue/index.d.cts +32 -0
- package/dist/lib/queue/index.d.cts.map +1 -0
- package/dist/lib/queue/index.d.mts +32 -0
- package/dist/lib/queue/index.d.mts.map +1 -0
- package/dist/lib/queue/index.mjs +183 -0
- package/dist/lib/queue/index.mjs.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +1 -0
- package/dist/policy/helpers.cjs +206 -0
- package/dist/policy/helpers.d.cts +50 -0
- package/dist/policy/helpers.d.cts.map +1 -0
- package/dist/policy/helpers.d.mts +50 -0
- package/dist/policy/helpers.d.mts.map +1 -0
- package/dist/policy/helpers.mjs +190 -0
- package/dist/policy/helpers.mjs.map +1 -0
- package/dist/policy/types.d.cts +16 -0
- package/dist/policy/types.d.cts.map +1 -0
- package/dist/policy/types.d.mts +16 -0
- package/dist/policy/types.d.mts.map +1 -0
- package/dist/prompts/core/keys.cjs +165 -0
- package/dist/prompts/core/keys.mjs +167 -0
- package/dist/prompts/core/keys.mjs.map +1 -0
- package/dist/prompts/core/runtime.cjs +104 -0
- package/dist/prompts/core/runtime.mjs +106 -0
- package/dist/prompts/core/runtime.mjs.map +1 -0
- package/dist/prompts/core/session.cjs +98 -0
- package/dist/prompts/core/session.mjs +100 -0
- package/dist/prompts/core/session.mjs.map +1 -0
- package/dist/prompts/core/types.d.cts +21 -0
- package/dist/prompts/core/types.d.cts.map +1 -0
- package/dist/prompts/core/types.d.mts +21 -0
- package/dist/prompts/core/types.d.mts.map +1 -0
- package/dist/prompts/types.d.cts +52 -0
- package/dist/prompts/types.d.cts.map +1 -0
- package/dist/prompts/types.d.mts +52 -0
- package/dist/prompts/types.d.mts.map +1 -0
- package/dist/pubsub/types.d.cts +10 -0
- package/dist/pubsub/types.d.cts.map +1 -0
- package/dist/pubsub/types.d.mts +10 -0
- package/dist/pubsub/types.d.mts.map +1 -0
- package/dist/queue/types.d.cts +47 -0
- package/dist/queue/types.d.cts.map +1 -0
- package/dist/queue/types.d.mts +47 -0
- package/dist/queue/types.d.mts.map +1 -0
- package/package.json +86 -16
- package/dist/lib/api/core/index.d.ts +0 -15
- package/dist/lib/api/core/index.d.ts.map +0 -1
- package/dist/lib/api/core/index.js +0 -166
- package/dist/lib/api/core/index.js.map +0 -1
- package/dist/lib/api/core/index.test.d.ts +0 -2
- package/dist/lib/api/core/index.test.d.ts.map +0 -1
- package/dist/lib/api/core/index.test.js +0 -219
- package/dist/lib/api/core/index.test.js.map +0 -1
- package/dist/lib/api/core/types.d.ts +0 -102
- package/dist/lib/api/core/types.d.ts.map +0 -1
- package/dist/lib/api/core/types.js +0 -2
- package/dist/lib/api/core/types.js.map +0 -1
- package/dist/lib/api/index.d.ts +0 -5
- package/dist/lib/api/index.d.ts.map +0 -1
- package/dist/lib/api/index.js +0 -3
- package/dist/lib/api/index.js.map +0 -1
- package/dist/lib/api/middleware/index.d.ts +0 -7
- package/dist/lib/api/middleware/index.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.js +0 -7
- package/dist/lib/api/middleware/index.js.map +0 -1
- package/dist/lib/api/middleware/index.test.d.ts +0 -2
- package/dist/lib/api/middleware/index.test.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.test.js +0 -67
- package/dist/lib/api/middleware/index.test.js.map +0 -1
- package/dist/lib/api/middleware/types.d.ts +0 -12
- package/dist/lib/api/middleware/types.d.ts.map +0 -1
- package/dist/lib/api/middleware/types.js +0 -2
- package/dist/lib/api/middleware/types.js.map +0 -1
- package/dist/lib/api/openapi/index.d.ts +0 -31
- package/dist/lib/api/openapi/index.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.js +0 -328
- package/dist/lib/api/openapi/index.js.map +0 -1
- package/dist/lib/api/openapi/index.test.d.ts +0 -2
- package/dist/lib/api/openapi/index.test.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.test.js +0 -359
- package/dist/lib/api/openapi/index.test.js.map +0 -1
- package/dist/lib/api/openapi/types.d.ts +0 -57
- package/dist/lib/api/openapi/types.d.ts.map +0 -1
- package/dist/lib/api/openapi/types.js +0 -5
- package/dist/lib/api/openapi/types.js.map +0 -1
- package/dist/lib/api/validation/index.d.ts +0 -33
- package/dist/lib/api/validation/index.d.ts.map +0 -1
- package/dist/lib/api/validation/index.js +0 -81
- package/dist/lib/api/validation/index.js.map +0 -1
- package/dist/lib/api/validation/index.test.d.ts +0 -2
- package/dist/lib/api/validation/index.test.d.ts.map +0 -1
- package/dist/lib/api/validation/index.test.js +0 -135
- package/dist/lib/api/validation/index.test.js.map +0 -1
- package/dist/lib/cache/index.d.ts +0 -25
- package/dist/lib/cache/index.d.ts.map +0 -1
- package/dist/lib/cache/index.js +0 -62
- package/dist/lib/cache/index.js.map +0 -1
- package/dist/lib/cache/index.test.d.ts +0 -2
- package/dist/lib/cache/index.test.d.ts.map +0 -1
- package/dist/lib/cache/index.test.js +0 -314
- package/dist/lib/cache/index.test.js.map +0 -1
- package/dist/lib/cache/types.d.ts +0 -5
- package/dist/lib/cache/types.d.ts.map +0 -1
- package/dist/lib/cache/types.js +0 -2
- package/dist/lib/cache/types.js.map +0 -1
- package/dist/lib/errors/index.d.ts +0 -9
- package/dist/lib/errors/index.d.ts.map +0 -1
- package/dist/lib/errors/index.js +0 -25
- package/dist/lib/errors/index.js.map +0 -1
- package/dist/lib/errors/index.test.d.ts +0 -2
- package/dist/lib/errors/index.test.d.ts.map +0 -1
- package/dist/lib/errors/index.test.js +0 -197
- package/dist/lib/errors/index.test.js.map +0 -1
- package/dist/lib/errors/types.d.ts +0 -2
- package/dist/lib/errors/types.d.ts.map +0 -1
- package/dist/lib/errors/types.js +0 -2
- package/dist/lib/errors/types.js.map +0 -1
- package/dist/lib/i18n/index.d.ts +0 -18
- package/dist/lib/i18n/index.d.ts.map +0 -1
- package/dist/lib/i18n/index.js +0 -38
- package/dist/lib/i18n/index.js.map +0 -1
- package/dist/lib/i18n/index.test.d.ts +0 -2
- package/dist/lib/i18n/index.test.d.ts.map +0 -1
- package/dist/lib/i18n/index.test.js +0 -402
- package/dist/lib/i18n/index.test.js.map +0 -1
- package/dist/lib/i18n/types.d.ts +0 -15
- package/dist/lib/i18n/types.d.ts.map +0 -1
- package/dist/lib/i18n/types.js +0 -2
- package/dist/lib/i18n/types.js.map +0 -1
- package/dist/lib/policy/index.d.ts +0 -9
- package/dist/lib/policy/index.d.ts.map +0 -1
- package/dist/lib/policy/index.js +0 -51
- package/dist/lib/policy/index.js.map +0 -1
- package/dist/lib/policy/index.test.d.ts +0 -2
- package/dist/lib/policy/index.test.d.ts.map +0 -1
- package/dist/lib/policy/index.test.js +0 -328
- package/dist/lib/policy/index.test.js.map +0 -1
- package/dist/lib/policy/types.d.ts +0 -27
- package/dist/lib/policy/types.d.ts.map +0 -1
- package/dist/lib/policy/types.js +0 -2
- package/dist/lib/policy/types.js.map +0 -1
- package/dist/lib/pubsub/index.d.ts +0 -23
- package/dist/lib/pubsub/index.d.ts.map +0 -1
- package/dist/lib/pubsub/index.js +0 -55
- package/dist/lib/pubsub/index.js.map +0 -1
- package/dist/lib/pubsub/index.test.d.ts +0 -2
- package/dist/lib/pubsub/index.test.d.ts.map +0 -1
- package/dist/lib/pubsub/index.test.js +0 -550
- package/dist/lib/pubsub/index.test.js.map +0 -1
- package/dist/lib/pubsub/types.d.ts +0 -7
- package/dist/lib/pubsub/types.d.ts.map +0 -1
- package/dist/lib/pubsub/types.js +0 -2
- package/dist/lib/pubsub/types.js.map +0 -1
- package/dist/lib/queue/index.d.ts +0 -28
- package/dist/lib/queue/index.d.ts.map +0 -1
- package/dist/lib/queue/index.js +0 -211
- package/dist/lib/queue/index.js.map +0 -1
- package/dist/lib/queue/index.test.d.ts +0 -2
- package/dist/lib/queue/index.test.d.ts.map +0 -1
- package/dist/lib/queue/index.test.js +0 -740
- package/dist/lib/queue/index.test.js.map +0 -1
- package/dist/lib/queue/types.d.ts +0 -52
- package/dist/lib/queue/types.d.ts.map +0 -1
- package/dist/lib/queue/types.js +0 -2
- package/dist/lib/queue/types.js.map +0 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { StandardSchemaV1 } from "../../node_modules/@standard-schema/spec/dist/index.cjs";
|
|
2
|
+
import { MergeMiddlewareExtensions } from "../middleware/types.cjs";
|
|
3
|
+
import { Middleware } from "../middleware/index.cjs";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/api/core/types.d.ts
|
|
6
|
+
type ResponseSchema = {
|
|
7
|
+
[status: number]: StandardSchemaV1;
|
|
8
|
+
};
|
|
9
|
+
type RequestSchema = {
|
|
10
|
+
params?: StandardSchemaV1;
|
|
11
|
+
body?: StandardSchemaV1;
|
|
12
|
+
query?: StandardSchemaV1;
|
|
13
|
+
headers?: StandardSchemaV1;
|
|
14
|
+
cookies?: StandardSchemaV1;
|
|
15
|
+
};
|
|
16
|
+
type SafeTypeAccess<T, K extends "input" | "output"> = T extends StandardSchemaV1 ? T["~standard"] extends {
|
|
17
|
+
types?: infer U;
|
|
18
|
+
} ? U extends Record<K, infer V> ? V : never : never : undefined;
|
|
19
|
+
type InferOutput<T extends StandardSchemaV1 | undefined> = SafeTypeAccess<T, "output">;
|
|
20
|
+
type InferInput<T extends StandardSchemaV1 | undefined> = SafeTypeAccess<T, "input">;
|
|
21
|
+
type ExtractStatusCodes<T extends ResponseSchema> = keyof T & number;
|
|
22
|
+
type ExtractStatusCodesOrAny<T extends ResponseSchema | undefined> = T extends ResponseSchema ? ExtractStatusCodes<T> : number;
|
|
23
|
+
type ValidationOptions = boolean | {
|
|
24
|
+
input?: boolean;
|
|
25
|
+
output?: boolean;
|
|
26
|
+
};
|
|
27
|
+
type ApiOptions<TMiddlewares extends readonly Middleware[] = readonly []> = {
|
|
28
|
+
prefix?: string;
|
|
29
|
+
openapi?: OpenApiOptions;
|
|
30
|
+
middlewares?: TMiddlewares;
|
|
31
|
+
validation?: ValidationOptions;
|
|
32
|
+
};
|
|
33
|
+
type SecuritySchemeApiKey = {
|
|
34
|
+
type: "apiKey";
|
|
35
|
+
name: string;
|
|
36
|
+
in: "query" | "header" | "cookie";
|
|
37
|
+
description?: string;
|
|
38
|
+
};
|
|
39
|
+
type SecuritySchemeHttp = {
|
|
40
|
+
type: "http";
|
|
41
|
+
scheme: string;
|
|
42
|
+
bearerFormat?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
};
|
|
45
|
+
type SecuritySchemeOAuth2Flow = {
|
|
46
|
+
authorizationUrl?: string;
|
|
47
|
+
tokenUrl?: string;
|
|
48
|
+
refreshUrl?: string;
|
|
49
|
+
scopes: Record<string, string>;
|
|
50
|
+
};
|
|
51
|
+
type SecuritySchemeOAuth2 = {
|
|
52
|
+
type: "oauth2";
|
|
53
|
+
flows: {
|
|
54
|
+
implicit?: SecuritySchemeOAuth2Flow;
|
|
55
|
+
password?: SecuritySchemeOAuth2Flow;
|
|
56
|
+
clientCredentials?: SecuritySchemeOAuth2Flow;
|
|
57
|
+
authorizationCode?: SecuritySchemeOAuth2Flow;
|
|
58
|
+
};
|
|
59
|
+
description?: string;
|
|
60
|
+
};
|
|
61
|
+
type SecuritySchemeOpenIdConnect = {
|
|
62
|
+
type: "openIdConnect";
|
|
63
|
+
openIdConnectUrl: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
};
|
|
66
|
+
type SecurityScheme = SecuritySchemeApiKey | SecuritySchemeHttp | SecuritySchemeOAuth2 | SecuritySchemeOpenIdConnect;
|
|
67
|
+
type OpenApiOptions = {
|
|
68
|
+
version: string;
|
|
69
|
+
title: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
servers?: Array<{
|
|
72
|
+
url: string;
|
|
73
|
+
description?: string;
|
|
74
|
+
}>;
|
|
75
|
+
securitySchemes?: Record<string, SecurityScheme>;
|
|
76
|
+
};
|
|
77
|
+
type Context<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = {
|
|
78
|
+
raw: Request;
|
|
79
|
+
req: {
|
|
80
|
+
body: InferOutput<TReq["body"]>;
|
|
81
|
+
query: InferOutput<TReq["query"]>;
|
|
82
|
+
headers: InferOutput<TReq["headers"]>;
|
|
83
|
+
cookies: InferOutput<TReq["cookies"]>;
|
|
84
|
+
params: InferOutput<TReq["params"]>;
|
|
85
|
+
};
|
|
86
|
+
json: <S extends ExtractStatusCodesOrAny<TRes>>(status: S, data: TRes extends ResponseSchema ? InferOutput<TRes[S]> : unknown) => Response;
|
|
87
|
+
text: (status: number, text: string) => Response;
|
|
88
|
+
html: (status: number, html: string) => Response;
|
|
89
|
+
redirect: (status: number, url: string) => Response;
|
|
90
|
+
get: <K extends keyof TExt>(key: K) => TExt[K];
|
|
91
|
+
};
|
|
92
|
+
type RouteHandler<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = (c: Context<TReq, TRes, TExt>) => Response | Promise<Response>;
|
|
93
|
+
type RouteConfig<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TGlobalMiddlewares extends readonly Middleware[] = readonly [], TRouteMiddlewares extends readonly Middleware[] = readonly []> = {
|
|
94
|
+
path: string;
|
|
95
|
+
method: Bun.Serve.HTTPMethod;
|
|
96
|
+
request?: TReq;
|
|
97
|
+
response?: TRes;
|
|
98
|
+
middlewares?: TRouteMiddlewares;
|
|
99
|
+
handler: RouteHandler<TReq, TRes, MergeMiddlewareExtensions<TGlobalMiddlewares> & MergeMiddlewareExtensions<TRouteMiddlewares>>;
|
|
100
|
+
summary?: string;
|
|
101
|
+
description?: string;
|
|
102
|
+
operationId?: string;
|
|
103
|
+
tags?: string[];
|
|
104
|
+
};
|
|
105
|
+
//#endregion
|
|
106
|
+
export { ApiOptions, Context, ExtractStatusCodes, InferInput, InferOutput, OpenApiOptions, RequestSchema, ResponseSchema, RouteConfig, RouteHandler, SecurityScheme, SecuritySchemeApiKey, SecuritySchemeHttp, SecuritySchemeOAuth2, SecuritySchemeOAuth2Flow, SecuritySchemeOpenIdConnect };
|
|
107
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/lib/api/core/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { StandardSchemaV1 } from "../../node_modules/@standard-schema/spec/dist/index.mjs";
|
|
2
|
+
import { MergeMiddlewareExtensions } from "../middleware/types.mjs";
|
|
3
|
+
import { Middleware } from "../middleware/index.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/api/core/types.d.ts
|
|
6
|
+
type ResponseSchema = {
|
|
7
|
+
[status: number]: StandardSchemaV1;
|
|
8
|
+
};
|
|
9
|
+
type RequestSchema = {
|
|
10
|
+
params?: StandardSchemaV1;
|
|
11
|
+
body?: StandardSchemaV1;
|
|
12
|
+
query?: StandardSchemaV1;
|
|
13
|
+
headers?: StandardSchemaV1;
|
|
14
|
+
cookies?: StandardSchemaV1;
|
|
15
|
+
};
|
|
16
|
+
type SafeTypeAccess<T, K extends "input" | "output"> = T extends StandardSchemaV1 ? T["~standard"] extends {
|
|
17
|
+
types?: infer U;
|
|
18
|
+
} ? U extends Record<K, infer V> ? V : never : never : undefined;
|
|
19
|
+
type InferOutput<T extends StandardSchemaV1 | undefined> = SafeTypeAccess<T, "output">;
|
|
20
|
+
type InferInput<T extends StandardSchemaV1 | undefined> = SafeTypeAccess<T, "input">;
|
|
21
|
+
type ExtractStatusCodes<T extends ResponseSchema> = keyof T & number;
|
|
22
|
+
type ExtractStatusCodesOrAny<T extends ResponseSchema | undefined> = T extends ResponseSchema ? ExtractStatusCodes<T> : number;
|
|
23
|
+
type ValidationOptions = boolean | {
|
|
24
|
+
input?: boolean;
|
|
25
|
+
output?: boolean;
|
|
26
|
+
};
|
|
27
|
+
type ApiOptions<TMiddlewares extends readonly Middleware[] = readonly []> = {
|
|
28
|
+
prefix?: string;
|
|
29
|
+
openapi?: OpenApiOptions;
|
|
30
|
+
middlewares?: TMiddlewares;
|
|
31
|
+
validation?: ValidationOptions;
|
|
32
|
+
};
|
|
33
|
+
type SecuritySchemeApiKey = {
|
|
34
|
+
type: "apiKey";
|
|
35
|
+
name: string;
|
|
36
|
+
in: "query" | "header" | "cookie";
|
|
37
|
+
description?: string;
|
|
38
|
+
};
|
|
39
|
+
type SecuritySchemeHttp = {
|
|
40
|
+
type: "http";
|
|
41
|
+
scheme: string;
|
|
42
|
+
bearerFormat?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
};
|
|
45
|
+
type SecuritySchemeOAuth2Flow = {
|
|
46
|
+
authorizationUrl?: string;
|
|
47
|
+
tokenUrl?: string;
|
|
48
|
+
refreshUrl?: string;
|
|
49
|
+
scopes: Record<string, string>;
|
|
50
|
+
};
|
|
51
|
+
type SecuritySchemeOAuth2 = {
|
|
52
|
+
type: "oauth2";
|
|
53
|
+
flows: {
|
|
54
|
+
implicit?: SecuritySchemeOAuth2Flow;
|
|
55
|
+
password?: SecuritySchemeOAuth2Flow;
|
|
56
|
+
clientCredentials?: SecuritySchemeOAuth2Flow;
|
|
57
|
+
authorizationCode?: SecuritySchemeOAuth2Flow;
|
|
58
|
+
};
|
|
59
|
+
description?: string;
|
|
60
|
+
};
|
|
61
|
+
type SecuritySchemeOpenIdConnect = {
|
|
62
|
+
type: "openIdConnect";
|
|
63
|
+
openIdConnectUrl: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
};
|
|
66
|
+
type SecurityScheme = SecuritySchemeApiKey | SecuritySchemeHttp | SecuritySchemeOAuth2 | SecuritySchemeOpenIdConnect;
|
|
67
|
+
type OpenApiOptions = {
|
|
68
|
+
version: string;
|
|
69
|
+
title: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
servers?: Array<{
|
|
72
|
+
url: string;
|
|
73
|
+
description?: string;
|
|
74
|
+
}>;
|
|
75
|
+
securitySchemes?: Record<string, SecurityScheme>;
|
|
76
|
+
};
|
|
77
|
+
type Context<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = {
|
|
78
|
+
raw: Request;
|
|
79
|
+
req: {
|
|
80
|
+
body: InferOutput<TReq["body"]>;
|
|
81
|
+
query: InferOutput<TReq["query"]>;
|
|
82
|
+
headers: InferOutput<TReq["headers"]>;
|
|
83
|
+
cookies: InferOutput<TReq["cookies"]>;
|
|
84
|
+
params: InferOutput<TReq["params"]>;
|
|
85
|
+
};
|
|
86
|
+
json: <S extends ExtractStatusCodesOrAny<TRes>>(status: S, data: TRes extends ResponseSchema ? InferOutput<TRes[S]> : unknown) => Response;
|
|
87
|
+
text: (status: number, text: string) => Response;
|
|
88
|
+
html: (status: number, html: string) => Response;
|
|
89
|
+
redirect: (status: number, url: string) => Response;
|
|
90
|
+
get: <K extends keyof TExt>(key: K) => TExt[K];
|
|
91
|
+
};
|
|
92
|
+
type RouteHandler<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = (c: Context<TReq, TRes, TExt>) => Response | Promise<Response>;
|
|
93
|
+
type RouteConfig<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TGlobalMiddlewares extends readonly Middleware[] = readonly [], TRouteMiddlewares extends readonly Middleware[] = readonly []> = {
|
|
94
|
+
path: string;
|
|
95
|
+
method: Bun.Serve.HTTPMethod;
|
|
96
|
+
request?: TReq;
|
|
97
|
+
response?: TRes;
|
|
98
|
+
middlewares?: TRouteMiddlewares;
|
|
99
|
+
handler: RouteHandler<TReq, TRes, MergeMiddlewareExtensions<TGlobalMiddlewares> & MergeMiddlewareExtensions<TRouteMiddlewares>>;
|
|
100
|
+
summary?: string;
|
|
101
|
+
description?: string;
|
|
102
|
+
operationId?: string;
|
|
103
|
+
tags?: string[];
|
|
104
|
+
};
|
|
105
|
+
//#endregion
|
|
106
|
+
export { ApiOptions, Context, ExtractStatusCodes, InferInput, InferOutput, OpenApiOptions, RequestSchema, ResponseSchema, RouteConfig, RouteHandler, SecurityScheme, SecuritySchemeApiKey, SecuritySchemeHttp, SecuritySchemeOAuth2, SecuritySchemeOAuth2Flow, SecuritySchemeOpenIdConnect };
|
|
107
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/lib/api/core/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MiddlewareOptions } from "./types.cjs";
|
|
2
|
+
import { RequestSchema, ResponseSchema } from "../core/types.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/api/middleware/index.d.ts
|
|
5
|
+
declare class Middleware<TRequest extends RequestSchema = RequestSchema, TResponse extends ResponseSchema = ResponseSchema, TExtension extends Record<string, unknown> = Record<string, unknown>> {
|
|
6
|
+
options: MiddlewareOptions<TRequest, TResponse, TExtension>;
|
|
7
|
+
constructor(options: MiddlewareOptions<TRequest, TResponse, TExtension>);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { Middleware };
|
|
11
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/api/middleware/index.ts"],"mappings":";;;;cAGa,UAAA,kBACM,aAAA,GAAgB,aAAA,oBACf,cAAA,GAAiB,cAAA,qBAChB,MAAA,oBAA0B,MAAA;EAGpC,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,UAAA;cAAhD,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,UAAA;AAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MiddlewareOptions } from "./types.mjs";
|
|
2
|
+
import { RequestSchema, ResponseSchema } from "../core/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/api/middleware/index.d.ts
|
|
5
|
+
declare class Middleware<TRequest extends RequestSchema = RequestSchema, TResponse extends ResponseSchema = ResponseSchema, TExtension extends Record<string, unknown> = Record<string, unknown>> {
|
|
6
|
+
options: MiddlewareOptions<TRequest, TResponse, TExtension>;
|
|
7
|
+
constructor(options: MiddlewareOptions<TRequest, TResponse, TExtension>);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { Middleware };
|
|
11
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/api/middleware/index.ts"],"mappings":";;;;cAGa,UAAA,kBACM,aAAA,GAAgB,aAAA,oBACf,cAAA,GAAiB,cAAA,qBAChB,MAAA,oBAA0B,MAAA;EAGpC,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,UAAA;cAAhD,OAAA,EAAS,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,UAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/api/middleware/index.ts"],"sourcesContent":["import type { RequestSchema, ResponseSchema } from \"../core/types.js\";\nimport type { MiddlewareOptions } from \"./types.js\";\n\nexport class Middleware<\n TRequest extends RequestSchema = RequestSchema,\n TResponse extends ResponseSchema = ResponseSchema,\n TExtension extends Record<string, unknown> = Record<string, unknown>,\n> {\n public constructor(\n public options: MiddlewareOptions<TRequest, TResponse, TExtension>,\n ) {}\n}\n"],"mappings":";AAGA,IAAa,aAAb,MAIE;CACA,YACE,SACA;AADO,OAAA,UAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, RequestSchema, ResponseSchema } from "../core/types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/api/middleware/types.d.ts
|
|
4
|
+
type MiddlewareHandler<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<never, never>> = (c: Context<TReq, TRes>) => Response | TExt | undefined | Promise<Response | TExt | undefined> | Promise<void> | void;
|
|
5
|
+
type MiddlewareOptions<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = {
|
|
6
|
+
request?: TReq;
|
|
7
|
+
response?: TRes;
|
|
8
|
+
handler: MiddlewareHandler<TReq, TRes, TExt>;
|
|
9
|
+
};
|
|
10
|
+
type InferMiddlewareExtension<T> = T extends {
|
|
11
|
+
options: MiddlewareOptions<infer _TReq, infer _TRes, infer E>;
|
|
12
|
+
} ? E : never;
|
|
13
|
+
type MergeMiddlewareExtensions<T extends readonly unknown[]> = T extends readonly [infer First, ...infer Rest] ? InferMiddlewareExtension<First> & MergeMiddlewareExtensions<Rest> : {};
|
|
14
|
+
//#endregion
|
|
15
|
+
export { InferMiddlewareExtension, MergeMiddlewareExtensions, MiddlewareHandler, MiddlewareOptions };
|
|
16
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/lib/api/middleware/types.ts"],"mappings":";;;KAEY,iBAAA,cACG,aAAA,GAAgB,aAAA,eAChB,cAAA,uCACA,MAAA,oBAA0B,MAAA,mBAEvC,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,MAEf,QAAA,GACA,IAAA,eAEA,OAAA,CAAQ,QAAA,GAAW,IAAA,gBACnB,OAAA;AAAA,KAGQ,iBAAA,cACG,aAAA,GAAgB,aAAA,eAChB,cAAA,uCACA,MAAA,oBAA0B,MAAA;EAEvC,OAAA,GAAU,IAAA;EACV,QAAA,GAAW,IAAA;EACX,OAAA,EAAS,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,IAAA;AAAA;AAAA,KAG7B,wBAAA,MAA8B,CAAA;EACxC,OAAA,EAAS,iBAAA;AAAA,IAEP,CAAA;AAAA,KAGQ,yBAAA,iCACV,CAAA,iDACI,wBAAA,CAAyB,KAAA,IAAS,yBAAA,CAA0B,IAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, RequestSchema, ResponseSchema } from "../core/types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/api/middleware/types.d.ts
|
|
4
|
+
type MiddlewareHandler<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<never, never>> = (c: Context<TReq, TRes>) => Response | TExt | undefined | Promise<Response | TExt | undefined> | Promise<void> | void;
|
|
5
|
+
type MiddlewareOptions<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema | undefined = undefined, TExt extends Record<string, unknown> = Record<string, unknown>> = {
|
|
6
|
+
request?: TReq;
|
|
7
|
+
response?: TRes;
|
|
8
|
+
handler: MiddlewareHandler<TReq, TRes, TExt>;
|
|
9
|
+
};
|
|
10
|
+
type InferMiddlewareExtension<T> = T extends {
|
|
11
|
+
options: MiddlewareOptions<infer _TReq, infer _TRes, infer E>;
|
|
12
|
+
} ? E : never;
|
|
13
|
+
type MergeMiddlewareExtensions<T extends readonly unknown[]> = T extends readonly [infer First, ...infer Rest] ? InferMiddlewareExtension<First> & MergeMiddlewareExtensions<Rest> : {};
|
|
14
|
+
//#endregion
|
|
15
|
+
export { InferMiddlewareExtension, MergeMiddlewareExtensions, MiddlewareHandler, MiddlewareOptions };
|
|
16
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/lib/api/middleware/types.ts"],"mappings":";;;KAEY,iBAAA,cACG,aAAA,GAAgB,aAAA,eAChB,cAAA,uCACA,MAAA,oBAA0B,MAAA,mBAEvC,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,MAEf,QAAA,GACA,IAAA,eAEA,OAAA,CAAQ,QAAA,GAAW,IAAA,gBACnB,OAAA;AAAA,KAGQ,iBAAA,cACG,aAAA,GAAgB,aAAA,eAChB,cAAA,uCACA,MAAA,oBAA0B,MAAA;EAEvC,OAAA,GAAU,IAAA;EACV,QAAA,GAAW,IAAA;EACX,OAAA,EAAS,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,IAAA;AAAA;AAAA,KAG7B,wBAAA,MAA8B,CAAA;EACxC,OAAA,EAAS,iBAAA;AAAA,IAEP,CAAA;AAAA,KAGQ,yBAAA,iCACV,CAAA,iDACI,wBAAA,CAAyB,KAAA,IAAS,yBAAA,CAA0B,IAAA"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
//#region src/lib/api/openapi/index.ts
|
|
2
|
+
const toOpenAPISchema = (schema, io = "input") => ({ schema: schema["~standard"].jsonSchema[io]({ target: "draft-2020-12" }) });
|
|
3
|
+
const getSchemaDescription = (schema) => {
|
|
4
|
+
const metadata = schema["~standard"];
|
|
5
|
+
if (!metadata) return "";
|
|
6
|
+
if ("description" in metadata && typeof metadata.description === "string") return metadata.description;
|
|
7
|
+
return "";
|
|
8
|
+
};
|
|
9
|
+
const requestFields = [
|
|
10
|
+
"body",
|
|
11
|
+
"query",
|
|
12
|
+
"headers",
|
|
13
|
+
"cookies",
|
|
14
|
+
"params"
|
|
15
|
+
];
|
|
16
|
+
const mergeRequestSchemas = (schemas) => {
|
|
17
|
+
const merged = {};
|
|
18
|
+
for (const schema of schemas) {
|
|
19
|
+
if (!schema) continue;
|
|
20
|
+
for (const field of requestFields) if (schema[field]) merged[field] = schema[field];
|
|
21
|
+
}
|
|
22
|
+
return merged;
|
|
23
|
+
};
|
|
24
|
+
const mergeResponseSchemas = (schemas) => {
|
|
25
|
+
const merged = {};
|
|
26
|
+
for (const schema of schemas) {
|
|
27
|
+
if (!schema) continue;
|
|
28
|
+
for (const status in schema) {
|
|
29
|
+
const statusCode = Number(status);
|
|
30
|
+
const responseSchema = schema[statusCode];
|
|
31
|
+
if (responseSchema) merged[statusCode] = responseSchema;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
35
|
+
};
|
|
36
|
+
const convertSchemaToOpenApi = async (schema, io = "input") => {
|
|
37
|
+
const result = toOpenAPISchema(schema, io);
|
|
38
|
+
const { schema: jsonSchema } = result;
|
|
39
|
+
const schemaId = jsonSchema.id;
|
|
40
|
+
if (schemaId && typeof schemaId === "string") {
|
|
41
|
+
const schemaWithoutId = { ...jsonSchema };
|
|
42
|
+
delete schemaWithoutId.id;
|
|
43
|
+
delete schemaWithoutId.$schema;
|
|
44
|
+
return {
|
|
45
|
+
schema: { $ref: `#/components/schemas/${schemaId}` },
|
|
46
|
+
components: { schemas: { [schemaId]: schemaWithoutId } }
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (jsonSchema.$schema) {
|
|
50
|
+
const schemaWithoutMeta = { ...jsonSchema };
|
|
51
|
+
delete schemaWithoutMeta.$schema;
|
|
52
|
+
return {
|
|
53
|
+
schema: schemaWithoutMeta,
|
|
54
|
+
components: void 0
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
const convertSchemaToInlineOpenApi = async (schema, io = "input") => {
|
|
60
|
+
const { schema: jsonSchema } = toOpenAPISchema(schema, io);
|
|
61
|
+
const cleanSchema = { ...jsonSchema };
|
|
62
|
+
delete cleanSchema.$schema;
|
|
63
|
+
delete cleanSchema.id;
|
|
64
|
+
return {
|
|
65
|
+
schema: cleanSchema,
|
|
66
|
+
components: void 0
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const extractParametersFromSchema = async (schema, location) => {
|
|
70
|
+
const { schema: jsonSchema, components } = await convertSchemaToInlineOpenApi(schema);
|
|
71
|
+
if (jsonSchema.type !== "object") return {
|
|
72
|
+
parameters: [],
|
|
73
|
+
components
|
|
74
|
+
};
|
|
75
|
+
if (!jsonSchema.properties) return {
|
|
76
|
+
parameters: [],
|
|
77
|
+
components
|
|
78
|
+
};
|
|
79
|
+
const parameters = [];
|
|
80
|
+
const requiredFields = jsonSchema.required ?? [];
|
|
81
|
+
for (const name in jsonSchema.properties) {
|
|
82
|
+
const propertySchema = jsonSchema.properties[name];
|
|
83
|
+
const isRequired = requiredFields.includes(name);
|
|
84
|
+
parameters.push({
|
|
85
|
+
name,
|
|
86
|
+
in: location,
|
|
87
|
+
required: isRequired,
|
|
88
|
+
schema: propertySchema
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
parameters,
|
|
93
|
+
components
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
const normalizePathForOpenAPI = (path) => {
|
|
97
|
+
return path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, "{$1}");
|
|
98
|
+
};
|
|
99
|
+
const extractPathParameters = (path) => {
|
|
100
|
+
const matches = path.match(/:([a-zA-Z_][a-zA-Z0-9_]*)/g);
|
|
101
|
+
if (!matches) return [];
|
|
102
|
+
return matches.map((match) => match.slice(1));
|
|
103
|
+
};
|
|
104
|
+
const paramSources = [
|
|
105
|
+
["query", "query"],
|
|
106
|
+
["headers", "header"],
|
|
107
|
+
["cookies", "cookie"]
|
|
108
|
+
];
|
|
109
|
+
const createParameters = async (request, path) => {
|
|
110
|
+
const parameters = [];
|
|
111
|
+
const allComponents = [];
|
|
112
|
+
for (const [field, location] of paramSources) if (request[field]) {
|
|
113
|
+
const { parameters: params, components } = await extractParametersFromSchema(request[field], location);
|
|
114
|
+
parameters.push(...params);
|
|
115
|
+
if (components) allComponents.push(components);
|
|
116
|
+
}
|
|
117
|
+
const pathParamNames = extractPathParameters(path);
|
|
118
|
+
if (pathParamNames.length > 0 && request.params) {
|
|
119
|
+
const { schema: jsonSchema, components } = await convertSchemaToInlineOpenApi(request.params);
|
|
120
|
+
if (components) allComponents.push(components);
|
|
121
|
+
if (jsonSchema.type === "object" && jsonSchema.properties) for (const name of pathParamNames) {
|
|
122
|
+
const propertySchema = jsonSchema.properties[name];
|
|
123
|
+
if (propertySchema) parameters.push({
|
|
124
|
+
name,
|
|
125
|
+
in: "path",
|
|
126
|
+
required: true,
|
|
127
|
+
schema: propertySchema
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
parameters,
|
|
133
|
+
components: allComponents
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
const createRequestBody = async (bodySchema) => {
|
|
137
|
+
const { schema, components } = await convertSchemaToOpenApi(bodySchema);
|
|
138
|
+
return {
|
|
139
|
+
components,
|
|
140
|
+
requestBody: {
|
|
141
|
+
required: true,
|
|
142
|
+
content: { "application/json": { schema } }
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
const createResponses = async (response) => {
|
|
147
|
+
const responses = {};
|
|
148
|
+
const allComponents = [];
|
|
149
|
+
if (!response) return {
|
|
150
|
+
responses,
|
|
151
|
+
components: allComponents
|
|
152
|
+
};
|
|
153
|
+
for (const status in response) {
|
|
154
|
+
const statusCode = String(status);
|
|
155
|
+
const schema = response[Number(status)];
|
|
156
|
+
if (!schema) continue;
|
|
157
|
+
const description = getSchemaDescription(schema);
|
|
158
|
+
const { schema: jsonSchema, components } = await convertSchemaToOpenApi(schema, "output");
|
|
159
|
+
if (components) allComponents.push(components);
|
|
160
|
+
responses[statusCode] = {
|
|
161
|
+
description: description || `Response with status ${statusCode}`,
|
|
162
|
+
content: { "application/json": { schema: jsonSchema } }
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
responses,
|
|
167
|
+
components: allComponents
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
const createOperation = async (route, globalMiddlewares, prefix) => {
|
|
171
|
+
const allMiddlewares = [...globalMiddlewares ?? [], ...route.middlewares ?? []];
|
|
172
|
+
const requestSchemas = [];
|
|
173
|
+
const responseSchemas = [];
|
|
174
|
+
for (const middleware of allMiddlewares) {
|
|
175
|
+
requestSchemas.push(middleware.options.request);
|
|
176
|
+
responseSchemas.push(middleware.options.response);
|
|
177
|
+
}
|
|
178
|
+
requestSchemas.push(route.request);
|
|
179
|
+
responseSchemas.push(route.response);
|
|
180
|
+
const mergedRequest = mergeRequestSchemas(requestSchemas);
|
|
181
|
+
const mergedResponse = mergeResponseSchemas(responseSchemas);
|
|
182
|
+
const { parameters, components: parameterComponents } = await createParameters(mergedRequest, prefix ? prefix + route.path : route.path);
|
|
183
|
+
const { responses, components: responseComponents } = await createResponses(mergedResponse);
|
|
184
|
+
const operation = { responses };
|
|
185
|
+
const allComponents = [];
|
|
186
|
+
allComponents.push(...responseComponents);
|
|
187
|
+
allComponents.push(...parameterComponents);
|
|
188
|
+
for (const field of [
|
|
189
|
+
"summary",
|
|
190
|
+
"description",
|
|
191
|
+
"operationId"
|
|
192
|
+
]) if (route[field]) operation[field] = route[field];
|
|
193
|
+
if (route.tags && route.tags.length > 0) operation.tags = route.tags;
|
|
194
|
+
if (parameters.length > 0) operation.parameters = parameters;
|
|
195
|
+
const bodySchema = mergedRequest.body;
|
|
196
|
+
if (bodySchema) {
|
|
197
|
+
const { requestBody, components: bodyComponents } = await createRequestBody(bodySchema);
|
|
198
|
+
operation.requestBody = requestBody;
|
|
199
|
+
if (bodyComponents) allComponents.push(bodyComponents);
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
operation,
|
|
203
|
+
components: allComponents
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
const componentKeys = [
|
|
207
|
+
"schemas",
|
|
208
|
+
"responses",
|
|
209
|
+
"parameters",
|
|
210
|
+
"requestBodies"
|
|
211
|
+
];
|
|
212
|
+
const mergeComponents = (componentsArray) => {
|
|
213
|
+
const merged = {};
|
|
214
|
+
for (const components of componentsArray) {
|
|
215
|
+
if (!components) continue;
|
|
216
|
+
for (const key of componentKeys) if (components[key]) merged[key] = {
|
|
217
|
+
...merged[key],
|
|
218
|
+
...components[key]
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
return merged;
|
|
222
|
+
};
|
|
223
|
+
const generateOpenApiSpec = async (options) => {
|
|
224
|
+
const spec = {
|
|
225
|
+
openapi: "3.1.0",
|
|
226
|
+
info: {
|
|
227
|
+
title: options.title,
|
|
228
|
+
description: options.description,
|
|
229
|
+
version: options.version
|
|
230
|
+
},
|
|
231
|
+
paths: {}
|
|
232
|
+
};
|
|
233
|
+
if (options.servers && options.servers.length > 0) spec.servers = options.servers;
|
|
234
|
+
if (options.securitySchemes) spec.components = { securitySchemes: options.securitySchemes };
|
|
235
|
+
const allRouteComponents = [];
|
|
236
|
+
for (const route of options.routes) {
|
|
237
|
+
const openApiPath = normalizePathForOpenAPI(options.prefix ? options.prefix + route.path : route.path);
|
|
238
|
+
const method = route.method.toLowerCase();
|
|
239
|
+
if (!spec.paths[openApiPath]) spec.paths[openApiPath] = {};
|
|
240
|
+
const { operation, components } = await createOperation(route, options.globalMiddlewares ?? [], options.prefix);
|
|
241
|
+
spec.paths[openApiPath][method] = operation;
|
|
242
|
+
allRouteComponents.push(...components);
|
|
243
|
+
}
|
|
244
|
+
const mergedComponents = mergeComponents(allRouteComponents);
|
|
245
|
+
if (!spec.components) spec.components = {};
|
|
246
|
+
if (options.securitySchemes) spec.components.securitySchemes = options.securitySchemes;
|
|
247
|
+
for (const key of componentKeys) {
|
|
248
|
+
const value = mergedComponents[key];
|
|
249
|
+
if (value && Object.keys(value).length > 0) spec.components[key] = value;
|
|
250
|
+
}
|
|
251
|
+
return spec;
|
|
252
|
+
};
|
|
253
|
+
//#endregion
|
|
254
|
+
exports.generateOpenApiSpec = generateOpenApiSpec;
|