@beignet/core 0.0.1
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/CHANGELOG.md +5 -0
- package/README.md +288 -0
- package/dist/application/index.d.ts +260 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +324 -0
- package/dist/application/index.js.map +1 -0
- package/dist/client/client.d.ts +241 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +531 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +139 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +216 -0
- package/dist/config/index.js.map +1 -0
- package/dist/contracts/contract-builder.d.ts +121 -0
- package/dist/contracts/contract-builder.d.ts.map +1 -0
- package/dist/contracts/contract-builder.js +346 -0
- package/dist/contracts/contract-builder.js.map +1 -0
- package/dist/contracts/contract-group.d.ts +106 -0
- package/dist/contracts/contract-group.d.ts.map +1 -0
- package/dist/contracts/contract-group.js +240 -0
- package/dist/contracts/contract-group.js.map +1 -0
- package/dist/contracts/contract-like.d.ts +21 -0
- package/dist/contracts/contract-like.d.ts.map +1 -0
- package/dist/contracts/contract-like.js +9 -0
- package/dist/contracts/contract-like.js.map +1 -0
- package/dist/contracts/index.d.ts +15 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/openapi-meta.d.ts +23 -0
- package/dist/contracts/openapi-meta.d.ts.map +1 -0
- package/dist/contracts/openapi-meta.js +2 -0
- package/dist/contracts/openapi-meta.js.map +1 -0
- package/dist/contracts/path-template.d.ts +17 -0
- package/dist/contracts/path-template.d.ts.map +1 -0
- package/dist/contracts/path-template.js +50 -0
- package/dist/contracts/path-template.js.map +1 -0
- package/dist/contracts/rate-limit.d.ts +50 -0
- package/dist/contracts/rate-limit.d.ts.map +1 -0
- package/dist/contracts/rate-limit.js +2 -0
- package/dist/contracts/rate-limit.js.map +1 -0
- package/dist/contracts/types.d.ts +97 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +54 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/contracts/utils.d.ts +3 -0
- package/dist/contracts/utils.d.ts.map +1 -0
- package/dist/contracts/utils.js +44 -0
- package/dist/contracts/utils.js.map +1 -0
- package/dist/domain/entity.d.ts +87 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +155 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/events.d.ts +41 -0
- package/dist/domain/events.d.ts.map +1 -0
- package/dist/domain/events.js +21 -0
- package/dist/domain/events.js.map +1 -0
- package/dist/domain/index.d.ts +14 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +14 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-object.d.ts +60 -0
- package/dist/domain/value-object.d.ts.map +1 -0
- package/dist/domain/value-object.js +87 -0
- package/dist/domain/value-object.js.map +1 -0
- package/dist/errors/catalog.d.ts +71 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +71 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/http.d.ts +77 -0
- package/dist/errors/http.d.ts.map +1 -0
- package/dist/errors/http.js +74 -0
- package/dist/errors/http.js.map +1 -0
- package/dist/errors/index.d.ts +10 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/response.d.ts +26 -0
- package/dist/errors/response.d.ts.map +1 -0
- package/dist/errors/response.js +34 -0
- package/dist/errors/response.js.map +1 -0
- package/dist/errors/validation.d.ts +18 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +21 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/events/index.d.ts +58 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +102 -0
- package/dist/events/index.js.map +1 -0
- package/dist/jobs/index.d.ts +56 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +89 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/mail/index.d.ts +75 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +84 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/openapi/index.d.ts +207 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +449 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/schema-introspector.d.ts +38 -0
- package/dist/openapi/schema-introspector.d.ts.map +1 -0
- package/dist/openapi/schema-introspector.js +67 -0
- package/dist/openapi/schema-introspector.js.map +1 -0
- package/dist/ports/audit.d.ts +58 -0
- package/dist/ports/audit.d.ts.map +1 -0
- package/dist/ports/audit.js +74 -0
- package/dist/ports/audit.js.map +1 -0
- package/dist/ports/auth.d.ts +23 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +31 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/builder.d.ts +61 -0
- package/dist/ports/builder.d.ts.map +1 -0
- package/dist/ports/builder.js +48 -0
- package/dist/ports/builder.js.map +1 -0
- package/dist/ports/cache.d.ts +15 -0
- package/dist/ports/cache.d.ts.map +1 -0
- package/dist/ports/cache.js +57 -0
- package/dist/ports/cache.js.map +1 -0
- package/dist/ports/clock.d.ts +10 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +21 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/events.d.ts +71 -0
- package/dist/ports/events.d.ts.map +1 -0
- package/dist/ports/events.js +2 -0
- package/dist/ports/events.js.map +1 -0
- package/dist/ports/id-generator.d.ts +12 -0
- package/dist/ports/id-generator.d.ts.map +1 -0
- package/dist/ports/id-generator.js +22 -0
- package/dist/ports/id-generator.js.map +1 -0
- package/dist/ports/index.d.ts +98 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +67 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +22 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +34 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/mailer.d.ts +6 -0
- package/dist/ports/mailer.d.ts.map +1 -0
- package/dist/ports/mailer.js +2 -0
- package/dist/ports/mailer.js.map +1 -0
- package/dist/ports/policy.d.ts +53 -0
- package/dist/ports/policy.d.ts.map +1 -0
- package/dist/ports/policy.js +81 -0
- package/dist/ports/policy.js.map +1 -0
- package/dist/ports/rate-limit.d.ts +41 -0
- package/dist/ports/rate-limit.d.ts.map +1 -0
- package/dist/ports/rate-limit.js +37 -0
- package/dist/ports/rate-limit.js.map +1 -0
- package/dist/ports/redaction.d.ts +26 -0
- package/dist/ports/redaction.d.ts.map +1 -0
- package/dist/ports/redaction.js +126 -0
- package/dist/ports/redaction.js.map +1 -0
- package/dist/ports/schedules.d.ts +9 -0
- package/dist/ports/schedules.d.ts.map +1 -0
- package/dist/ports/schedules.js +2 -0
- package/dist/ports/schedules.js.map +1 -0
- package/dist/ports/storage.d.ts +47 -0
- package/dist/ports/storage.d.ts.map +1 -0
- package/dist/ports/storage.js +185 -0
- package/dist/ports/storage.js.map +1 -0
- package/dist/ports/testing.d.ts +73 -0
- package/dist/ports/testing.d.ts.map +1 -0
- package/dist/ports/testing.js +105 -0
- package/dist/ports/testing.js.map +1 -0
- package/dist/ports/unit-of-work.d.ts +56 -0
- package/dist/ports/unit-of-work.d.ts.map +1 -0
- package/dist/ports/unit-of-work.js +64 -0
- package/dist/ports/unit-of-work.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumentation.d.ts +91 -0
- package/dist/providers/instrumentation.d.ts.map +1 -0
- package/dist/providers/instrumentation.js +93 -0
- package/dist/providers/instrumentation.js.map +1 -0
- package/dist/providers/provider.d.ts +146 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +31 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/schedules/index.d.ts +105 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +178 -0
- package/dist/schedules/index.js.map +1 -0
- package/dist/server/contract-like.d.ts +5 -0
- package/dist/server/contract-like.d.ts.map +1 -0
- package/dist/server/contract-like.js +5 -0
- package/dist/server/contract-like.js.map +1 -0
- package/dist/server/health.d.ts +41 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +46 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/hooks/auth.d.ts +42 -0
- package/dist/server/hooks/auth.d.ts.map +1 -0
- package/dist/server/hooks/auth.js +61 -0
- package/dist/server/hooks/auth.js.map +1 -0
- package/dist/server/hooks/cors.d.ts +13 -0
- package/dist/server/hooks/cors.d.ts.map +1 -0
- package/dist/server/hooks/cors.js +70 -0
- package/dist/server/hooks/cors.js.map +1 -0
- package/dist/server/hooks/errors.d.ts +66 -0
- package/dist/server/hooks/errors.d.ts.map +1 -0
- package/dist/server/hooks/errors.js +83 -0
- package/dist/server/hooks/errors.js.map +1 -0
- package/dist/server/hooks/index.d.ts +12 -0
- package/dist/server/hooks/index.d.ts.map +1 -0
- package/dist/server/hooks/index.js +12 -0
- package/dist/server/hooks/index.js.map +1 -0
- package/dist/server/hooks/logging.d.ts +33 -0
- package/dist/server/hooks/logging.d.ts.map +1 -0
- package/dist/server/hooks/logging.js +90 -0
- package/dist/server/hooks/logging.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +29 -0
- package/dist/server/hooks/rate-limit.d.ts.map +1 -0
- package/dist/server/hooks/rate-limit.js +93 -0
- package/dist/server/hooks/rate-limit.js.map +1 -0
- package/dist/server/hooks/utils.d.ts +9 -0
- package/dist/server/hooks/utils.d.ts.map +1 -0
- package/dist/server/hooks/utils.js +16 -0
- package/dist/server/hooks/utils.js.map +1 -0
- package/dist/server/hooks.d.ts +2 -0
- package/dist/server/hooks.d.ts.map +1 -0
- package/dist/server/hooks.js +2 -0
- package/dist/server/hooks.js.map +1 -0
- package/dist/server/http.d.ts +124 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +2 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +19 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/openapi.d.ts +32 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/openapi.js +43 -0
- package/dist/server/openapi.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +4 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/loadProviderConfig.d.ts +7 -0
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -0
- package/dist/server/providers/loadProviderConfig.js +42 -0
- package/dist/server/providers/loadProviderConfig.js.map +1 -0
- package/dist/server/server.d.ts +86 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1031 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +3 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +129 -0
- package/src/application/index.ts +747 -0
- package/src/client/client.ts +1105 -0
- package/src/client/index.ts +45 -0
- package/src/client/types.ts +305 -0
- package/src/config/index.ts +497 -0
- package/src/contracts/contract-builder.ts +583 -0
- package/src/contracts/contract-group.ts +502 -0
- package/src/contracts/contract-like.ts +29 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/openapi-meta.ts +22 -0
- package/src/contracts/path-template.ts +91 -0
- package/src/contracts/rate-limit.ts +50 -0
- package/src/contracts/types.ts +207 -0
- package/src/contracts/utils.ts +56 -0
- package/src/domain/entity.ts +256 -0
- package/src/domain/events.ts +52 -0
- package/src/domain/index.ts +18 -0
- package/src/domain/value-object.ts +135 -0
- package/src/errors/catalog.ts +149 -0
- package/src/errors/http.ts +80 -0
- package/src/errors/index.ts +28 -0
- package/src/errors/response.ts +54 -0
- package/src/errors/validation.ts +35 -0
- package/src/events/index.ts +246 -0
- package/src/jobs/index.ts +211 -0
- package/src/mail/index.ts +177 -0
- package/src/openapi/index.ts +865 -0
- package/src/openapi/schema-introspector.ts +107 -0
- package/src/ports/audit.ts +176 -0
- package/src/ports/auth.ts +76 -0
- package/src/ports/builder.ts +97 -0
- package/src/ports/cache.ts +94 -0
- package/src/ports/clock.ts +34 -0
- package/src/ports/events.ts +100 -0
- package/src/ports/id-generator.ts +36 -0
- package/src/ports/index.ts +221 -0
- package/src/ports/logger.ts +67 -0
- package/src/ports/policy.ts +242 -0
- package/src/ports/rate-limit.ts +91 -0
- package/src/ports/redaction.ts +199 -0
- package/src/ports/storage.ts +282 -0
- package/src/ports/testing.ts +234 -0
- package/src/ports/unit-of-work.ts +134 -0
- package/src/providers/index.ts +40 -0
- package/src/providers/instrumentation.ts +248 -0
- package/src/providers/provider.ts +191 -0
- package/src/schedules/index.ts +442 -0
- package/src/server/contract-like.ts +8 -0
- package/src/server/health.ts +82 -0
- package/src/server/hooks/auth.ts +147 -0
- package/src/server/hooks/cors.ts +87 -0
- package/src/server/hooks/errors.ts +126 -0
- package/src/server/hooks/index.ts +43 -0
- package/src/server/hooks/logging.ts +121 -0
- package/src/server/hooks/rate-limit.ts +171 -0
- package/src/server/hooks/utils.ts +16 -0
- package/src/server/hooks.ts +1 -0
- package/src/server/http.ts +189 -0
- package/src/server/index.ts +35 -0
- package/src/server/openapi.ts +72 -0
- package/src/server/providers/index.ts +3 -0
- package/src/server/providers/loadProviderConfig.ts +72 -0
- package/src/server/server.ts +1521 -0
- package/src/server/types.ts +2 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
HttpContractConfig,
|
|
3
|
+
InferHeaderSchemaOutput,
|
|
4
|
+
InferOutput,
|
|
5
|
+
StandardSchema,
|
|
6
|
+
} from "../contracts";
|
|
7
|
+
import type { AnyPorts } from "../ports";
|
|
8
|
+
|
|
9
|
+
export interface HttpRequestLike {
|
|
10
|
+
method: string;
|
|
11
|
+
url: string;
|
|
12
|
+
headers: Headers;
|
|
13
|
+
/**
|
|
14
|
+
* The platform request when an adapter has one available.
|
|
15
|
+
*
|
|
16
|
+
* Use this as an escape hatch for platform-specific APIs. Prefer the
|
|
17
|
+
* framework-agnostic methods below when possible.
|
|
18
|
+
*/
|
|
19
|
+
raw?: Request;
|
|
20
|
+
json(): Promise<unknown>;
|
|
21
|
+
text(): Promise<string>;
|
|
22
|
+
arrayBuffer?(): Promise<ArrayBuffer>;
|
|
23
|
+
blob?(): Promise<Blob>;
|
|
24
|
+
formData?(): Promise<FormData>;
|
|
25
|
+
clone?(): HttpRequestLike;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface HttpResponseLike {
|
|
29
|
+
status: number;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
body?: unknown;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type HttpResponse = HttpResponseLike | Response;
|
|
35
|
+
|
|
36
|
+
type InferSchemaOrFallback<
|
|
37
|
+
T extends StandardSchema | null,
|
|
38
|
+
Fallback,
|
|
39
|
+
> = T extends StandardSchema ? InferOutput<T> : Fallback;
|
|
40
|
+
|
|
41
|
+
export type InferPath<C extends HttpContractConfig> = InferSchemaOrFallback<
|
|
42
|
+
C["pathParams"],
|
|
43
|
+
Record<string, string>
|
|
44
|
+
>;
|
|
45
|
+
|
|
46
|
+
export type InferQuery<C extends HttpContractConfig> = InferSchemaOrFallback<
|
|
47
|
+
C["query"],
|
|
48
|
+
Record<string, string | string[]>
|
|
49
|
+
>;
|
|
50
|
+
|
|
51
|
+
export type InferBody<C extends HttpContractConfig> = InferSchemaOrFallback<
|
|
52
|
+
C["body"],
|
|
53
|
+
unknown
|
|
54
|
+
>;
|
|
55
|
+
|
|
56
|
+
export type InferHeaders<C extends HttpContractConfig> =
|
|
57
|
+
InferHeaderSchemaOutput<Exclude<C["headers"], undefined>> extends undefined
|
|
58
|
+
? Record<string, string>
|
|
59
|
+
: InferHeaderSchemaOutput<Exclude<C["headers"], undefined>>;
|
|
60
|
+
|
|
61
|
+
export interface HandlerArgs<Ctx, C extends HttpContractConfig> {
|
|
62
|
+
req: HttpRequestLike;
|
|
63
|
+
ctx: Ctx;
|
|
64
|
+
contract: C;
|
|
65
|
+
|
|
66
|
+
// inferred from contract schemas
|
|
67
|
+
path: InferPath<C>;
|
|
68
|
+
query: InferQuery<C>;
|
|
69
|
+
headers: InferHeaders<C>;
|
|
70
|
+
body: InferBody<C>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export type Handler<Ctx, C extends HttpContractConfig> = (
|
|
74
|
+
args: HandlerArgs<Ctx, C>,
|
|
75
|
+
) => Promise<HttpResponse> | HttpResponse;
|
|
76
|
+
|
|
77
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
78
|
+
|
|
79
|
+
export type OnRequestHook<
|
|
80
|
+
Ports extends AnyPorts = AnyPorts,
|
|
81
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
82
|
+
> = (args: {
|
|
83
|
+
req: HttpRequestLike;
|
|
84
|
+
ports: Ports;
|
|
85
|
+
contract: C;
|
|
86
|
+
params: Record<string, string>;
|
|
87
|
+
}) => MaybePromise<HttpResponse | undefined>;
|
|
88
|
+
|
|
89
|
+
export type BeforeHandleResult<Ctx> =
|
|
90
|
+
| undefined
|
|
91
|
+
| HttpResponse
|
|
92
|
+
| {
|
|
93
|
+
ctx?: Ctx;
|
|
94
|
+
response?: HttpResponse;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export type BeforeHandleHook<
|
|
98
|
+
Ctx,
|
|
99
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
100
|
+
> = (args: {
|
|
101
|
+
req: HttpRequestLike;
|
|
102
|
+
ctx: Ctx;
|
|
103
|
+
contract: C;
|
|
104
|
+
path: InferPath<C>;
|
|
105
|
+
query: InferQuery<C>;
|
|
106
|
+
headers: InferHeaders<C>;
|
|
107
|
+
body: InferBody<C>;
|
|
108
|
+
}) => MaybePromise<BeforeHandleResult<Ctx>>;
|
|
109
|
+
|
|
110
|
+
export type BeforeSendHook<
|
|
111
|
+
Ctx,
|
|
112
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
113
|
+
> = (args: {
|
|
114
|
+
req: HttpRequestLike;
|
|
115
|
+
ctx?: Ctx;
|
|
116
|
+
contract: C;
|
|
117
|
+
path?: InferPath<C>;
|
|
118
|
+
query?: InferQuery<C>;
|
|
119
|
+
headers?: InferHeaders<C>;
|
|
120
|
+
body?: InferBody<C>;
|
|
121
|
+
response: HttpResponseLike;
|
|
122
|
+
error?: unknown;
|
|
123
|
+
}) => MaybePromise<HttpResponseLike | undefined>;
|
|
124
|
+
|
|
125
|
+
export type AfterSendHook<
|
|
126
|
+
Ctx,
|
|
127
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
128
|
+
> = (args: {
|
|
129
|
+
req: HttpRequestLike;
|
|
130
|
+
ctx?: Ctx;
|
|
131
|
+
contract: C;
|
|
132
|
+
path?: InferPath<C>;
|
|
133
|
+
query?: InferQuery<C>;
|
|
134
|
+
headers?: InferHeaders<C>;
|
|
135
|
+
body?: InferBody<C>;
|
|
136
|
+
response: HttpResponseLike;
|
|
137
|
+
error?: unknown;
|
|
138
|
+
durationMs: number;
|
|
139
|
+
}) => MaybePromise<void>;
|
|
140
|
+
|
|
141
|
+
export type ServerCaughtErrorHook<
|
|
142
|
+
Ctx,
|
|
143
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
144
|
+
> = (args: {
|
|
145
|
+
err: unknown;
|
|
146
|
+
req: HttpRequestLike;
|
|
147
|
+
ctx?: Ctx;
|
|
148
|
+
contract: C;
|
|
149
|
+
path?: InferPath<C>;
|
|
150
|
+
query?: InferQuery<C>;
|
|
151
|
+
headers?: InferHeaders<C>;
|
|
152
|
+
body?: InferBody<C>;
|
|
153
|
+
}) => MaybePromise<void>;
|
|
154
|
+
|
|
155
|
+
export type ServerUnhandledErrorMapper<
|
|
156
|
+
Ctx,
|
|
157
|
+
C extends HttpContractConfig = HttpContractConfig,
|
|
158
|
+
> = (args: {
|
|
159
|
+
err: unknown;
|
|
160
|
+
req: HttpRequestLike;
|
|
161
|
+
ctx?: Ctx;
|
|
162
|
+
contract: C;
|
|
163
|
+
path?: InferPath<C>;
|
|
164
|
+
query?: InferQuery<C>;
|
|
165
|
+
headers?: InferHeaders<C>;
|
|
166
|
+
body?: InferBody<C>;
|
|
167
|
+
}) => MaybePromise<HttpResponse | undefined>;
|
|
168
|
+
|
|
169
|
+
export interface ServerHook<Ctx, Ports extends AnyPorts = AnyPorts> {
|
|
170
|
+
name?: string;
|
|
171
|
+
onRequest?: OnRequestHook<Ports>;
|
|
172
|
+
beforeHandle?: BeforeHandleHook<Ctx>;
|
|
173
|
+
beforeSend?: BeforeSendHook<Ctx>;
|
|
174
|
+
afterSend?: AfterSendHook<Ctx>;
|
|
175
|
+
onCaughtError?: ServerCaughtErrorHook<Ctx>;
|
|
176
|
+
mapUnhandledError?: ServerUnhandledErrorMapper<Ctx>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export type ResolvedRoute<_Ctx, C extends HttpContractConfig> = {
|
|
180
|
+
contract: C;
|
|
181
|
+
handler: (
|
|
182
|
+
req: HttpRequestLike,
|
|
183
|
+
params?: Record<string, string>,
|
|
184
|
+
) => Promise<HttpResponse>;
|
|
185
|
+
match: (
|
|
186
|
+
method: string,
|
|
187
|
+
pathname: string,
|
|
188
|
+
) => { matched: true } | { matched: false };
|
|
189
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/server
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic HTTP server runtime for Beignet.
|
|
5
|
+
* Shared by Beignet server adapters.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Re-export types from dependencies for convenience
|
|
9
|
+
export type {
|
|
10
|
+
HttpContractConfig,
|
|
11
|
+
InferOutput,
|
|
12
|
+
StandardSchema,
|
|
13
|
+
StandardSchemaV1,
|
|
14
|
+
} from "../contracts";
|
|
15
|
+
export { AppError } from "../errors";
|
|
16
|
+
export type { AnyPorts } from "../ports";
|
|
17
|
+
export type { ServiceProvider } from "../providers";
|
|
18
|
+
export * from "./health";
|
|
19
|
+
export * from "./hooks";
|
|
20
|
+
export * from "./http";
|
|
21
|
+
export * from "./openapi";
|
|
22
|
+
export * from "./providers";
|
|
23
|
+
export type {
|
|
24
|
+
CreateServerOptions,
|
|
25
|
+
RouteDef,
|
|
26
|
+
RouteGroup,
|
|
27
|
+
ServerInstance,
|
|
28
|
+
} from "./server";
|
|
29
|
+
export {
|
|
30
|
+
contractsFromRoutes,
|
|
31
|
+
createServer,
|
|
32
|
+
defineRouteGroup,
|
|
33
|
+
defineRoutes,
|
|
34
|
+
} from "./server";
|
|
35
|
+
export * from "./types";
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI generation handler
|
|
3
|
+
* OpenAPI helpers for the Beignet server runtime.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { HttpContractConfig } from "../contracts";
|
|
7
|
+
import type { AppEnvironment } from "./health";
|
|
8
|
+
import type { HttpRequestLike, HttpResponseLike } from "./types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* OpenAPI configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface OpenAPIConfig {
|
|
14
|
+
/** Enable OpenAPI endpoint (default: false) */
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Suggested path for the OpenAPI endpoint (e.g., "/api/openapi.json").
|
|
18
|
+
* NOTE: This field is for documentation/metadata only and does not control routing.
|
|
19
|
+
* You must manually wire the openapiHandler to your desired route.
|
|
20
|
+
*/
|
|
21
|
+
suggestedPath?: string;
|
|
22
|
+
/** API title */
|
|
23
|
+
title?: string;
|
|
24
|
+
/** API version */
|
|
25
|
+
version?: string;
|
|
26
|
+
/** API description */
|
|
27
|
+
description?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Create an OpenAPI handler
|
|
32
|
+
* Returns a function that can be called with an HttpRequestLike to get an HttpResponseLike
|
|
33
|
+
*/
|
|
34
|
+
export function createOpenAPIHandler(
|
|
35
|
+
contracts: readonly HttpContractConfig[],
|
|
36
|
+
openapiConfig: OpenAPIConfig | undefined,
|
|
37
|
+
_env: AppEnvironment,
|
|
38
|
+
): (req: HttpRequestLike) => Promise<HttpResponseLike> {
|
|
39
|
+
// Lazily generate OpenAPI spec on first request
|
|
40
|
+
let cachedSpec: object | null = null;
|
|
41
|
+
|
|
42
|
+
return async (_req: HttpRequestLike): Promise<HttpResponseLike> => {
|
|
43
|
+
// Generate spec if not cached
|
|
44
|
+
if (!cachedSpec) {
|
|
45
|
+
try {
|
|
46
|
+
// Dynamic import to avoid hard dependency
|
|
47
|
+
const { contractsToOpenAPI } = await import("../openapi");
|
|
48
|
+
cachedSpec = contractsToOpenAPI(contracts, {
|
|
49
|
+
title: openapiConfig?.title ?? "Beignet API",
|
|
50
|
+
version: openapiConfig?.version ?? "1.0.0",
|
|
51
|
+
description: openapiConfig?.description,
|
|
52
|
+
});
|
|
53
|
+
} catch (error) {
|
|
54
|
+
// OpenAPI generation failed
|
|
55
|
+
return {
|
|
56
|
+
status: 500,
|
|
57
|
+
body: {
|
|
58
|
+
error: "OpenAPI generation failed",
|
|
59
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
60
|
+
},
|
|
61
|
+
headers: { "Content-Type": "application/json" },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
status: 200,
|
|
68
|
+
body: cachedSpec,
|
|
69
|
+
headers: { "Content-Type": "application/json" },
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import {
|
|
3
|
+
ConfigValidationError,
|
|
4
|
+
parseStandardSchemaAsync,
|
|
5
|
+
readEnv,
|
|
6
|
+
} from "../../config";
|
|
7
|
+
import { SchemaValidationError } from "../../errors";
|
|
8
|
+
import type { AnyPorts } from "../../ports";
|
|
9
|
+
import type { ServiceProvider } from "../../providers";
|
|
10
|
+
|
|
11
|
+
type ProviderConfigDef<Schema extends StandardSchemaV1<unknown, unknown>> = {
|
|
12
|
+
schema: Schema;
|
|
13
|
+
envPrefix?: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
async function parseStandardSchema<
|
|
17
|
+
Schema extends StandardSchemaV1<unknown, unknown>,
|
|
18
|
+
>(
|
|
19
|
+
schema: Schema,
|
|
20
|
+
input: unknown,
|
|
21
|
+
): Promise<StandardSchemaV1.InferOutput<Schema>> {
|
|
22
|
+
try {
|
|
23
|
+
return await parseStandardSchemaAsync(schema, input);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
if (error instanceof ConfigValidationError) {
|
|
26
|
+
throw new SchemaValidationError(error.issues);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function loadProviderConfig<
|
|
34
|
+
Ports extends AnyPorts,
|
|
35
|
+
Schema extends StandardSchemaV1<unknown, unknown>,
|
|
36
|
+
>(
|
|
37
|
+
provider: ServiceProvider<Ports, Schema>,
|
|
38
|
+
env: Record<string, string | undefined>,
|
|
39
|
+
overrides: Record<string, unknown>,
|
|
40
|
+
): Promise<StandardSchemaV1.InferOutput<Schema> | undefined> {
|
|
41
|
+
const configDef = provider.config as ProviderConfigDef<Schema> | undefined;
|
|
42
|
+
if (!configDef) return undefined;
|
|
43
|
+
|
|
44
|
+
const { schema, envPrefix } = configDef;
|
|
45
|
+
const hasOverride = Object.hasOwn(overrides, provider.name);
|
|
46
|
+
const input = hasOverride
|
|
47
|
+
? overrides[provider.name]
|
|
48
|
+
: envPrefix
|
|
49
|
+
? readEnv({ env, prefix: envPrefix })
|
|
50
|
+
: {};
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
return await parseStandardSchema(schema, input);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
const suffix = envPrefix ? ` (envPrefix=${envPrefix})` : "";
|
|
56
|
+
const found = envPrefix
|
|
57
|
+
? Object.keys(env).filter(
|
|
58
|
+
(k) => k.startsWith(envPrefix) && env[k] !== undefined,
|
|
59
|
+
)
|
|
60
|
+
: [];
|
|
61
|
+
const hint = envPrefix
|
|
62
|
+
? found.length
|
|
63
|
+
? `\n Env vars found with prefix "${envPrefix}": ${found.join(", ")}`
|
|
64
|
+
: `\n No env vars found with prefix "${envPrefix}"`
|
|
65
|
+
: "";
|
|
66
|
+
throw new Error(
|
|
67
|
+
`Failed to load config for provider "${provider.name}"${suffix}: ${(error as Error).message}${hint}`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { parseStandardSchema };
|