@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,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beignet/core/client/base
|
|
3
|
+
*
|
|
4
|
+
* Base HTTP client for making contract-based requests
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { SchemaValidationError } from "../errors";
|
|
8
|
+
export type {
|
|
9
|
+
AnyContractError,
|
|
10
|
+
ClientContractError,
|
|
11
|
+
ContractErrorSource,
|
|
12
|
+
ContractErrorWithCode,
|
|
13
|
+
ContractErrorWithSource,
|
|
14
|
+
ContractErrorWithStatus,
|
|
15
|
+
HttpContractError,
|
|
16
|
+
InferEndpointContractError,
|
|
17
|
+
InferEndpointErrorCode,
|
|
18
|
+
NetworkContractError,
|
|
19
|
+
ResponseContractError,
|
|
20
|
+
} from "./client";
|
|
21
|
+
export {
|
|
22
|
+
Client,
|
|
23
|
+
ContractError,
|
|
24
|
+
createClient,
|
|
25
|
+
Endpoint,
|
|
26
|
+
isContractError,
|
|
27
|
+
} from "./client";
|
|
28
|
+
export type {
|
|
29
|
+
CallArgs,
|
|
30
|
+
ClientConfig,
|
|
31
|
+
EndpointCallArgs,
|
|
32
|
+
EndpointErrorResult,
|
|
33
|
+
EndpointResult,
|
|
34
|
+
EndpointSuccessResult,
|
|
35
|
+
InferBody,
|
|
36
|
+
InferEndpointErrorResponse,
|
|
37
|
+
InferEndpointErrorResponseByStatus,
|
|
38
|
+
InferEndpointErrorStatus,
|
|
39
|
+
InferErrorResponse,
|
|
40
|
+
InferErrorResponseByStatus,
|
|
41
|
+
InferHeaders,
|
|
42
|
+
InferPathParams,
|
|
43
|
+
InferQuery,
|
|
44
|
+
InferSuccessResponse,
|
|
45
|
+
} from "./types";
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BodyHttpMethod,
|
|
3
|
+
HttpContractConfig,
|
|
4
|
+
InferHeaderSchemaInput,
|
|
5
|
+
InferInput,
|
|
6
|
+
InferOutput,
|
|
7
|
+
StandardSchema,
|
|
8
|
+
StandardSchemaV1,
|
|
9
|
+
} from "../contracts";
|
|
10
|
+
import type { ErrorResponseBody } from "../errors";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Client configuration
|
|
14
|
+
*/
|
|
15
|
+
export type ClientConfig<TProvidedHeaders extends string = never> = {
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
headers?: () => Promise<Record<string, string>> | Record<string, string>;
|
|
18
|
+
providedHeaders?: readonly TProvidedHeaders[];
|
|
19
|
+
fetch?: typeof fetch;
|
|
20
|
+
/** Enable client-side input validation for path, query, and body. Default: false. */
|
|
21
|
+
validate?: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
type PathParamPrimitive = string | number | boolean;
|
|
25
|
+
|
|
26
|
+
type UnsupportedPathParamName<Name extends string> = Name extends ""
|
|
27
|
+
? true
|
|
28
|
+
: Name extends `...${string}`
|
|
29
|
+
? true
|
|
30
|
+
: Name extends `[${string}`
|
|
31
|
+
? true
|
|
32
|
+
: Name extends `${string}.${string}`
|
|
33
|
+
? true
|
|
34
|
+
: false;
|
|
35
|
+
|
|
36
|
+
type SegmentPathParam<Segment extends string> = Segment extends `:${infer Name}`
|
|
37
|
+
? UnsupportedPathParamName<Name> extends true
|
|
38
|
+
? never
|
|
39
|
+
: Name
|
|
40
|
+
: Segment extends `[${infer Name}]`
|
|
41
|
+
? UnsupportedPathParamName<Name> extends true
|
|
42
|
+
? never
|
|
43
|
+
: Name
|
|
44
|
+
: never;
|
|
45
|
+
|
|
46
|
+
type PathParamNames<TPath extends string> = string extends TPath
|
|
47
|
+
? never
|
|
48
|
+
: TPath extends `${infer Segment}/${infer Rest}`
|
|
49
|
+
? SegmentPathParam<Segment> | PathParamNames<Rest>
|
|
50
|
+
: SegmentPathParam<TPath>;
|
|
51
|
+
|
|
52
|
+
type InferPathParamsFromTemplate<TPath extends string> = [
|
|
53
|
+
PathParamNames<TPath>,
|
|
54
|
+
] extends [never]
|
|
55
|
+
? undefined
|
|
56
|
+
: { [K in PathParamNames<TPath>]: PathParamPrimitive };
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Infer path params from contract
|
|
60
|
+
*/
|
|
61
|
+
export type InferPathParams<TContract extends HttpContractConfig> =
|
|
62
|
+
TContract["pathParams"] extends StandardSchemaV1
|
|
63
|
+
? InferInput<TContract["pathParams"]>
|
|
64
|
+
: InferPathParamsFromTemplate<TContract["path"]>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Infer query params from contract
|
|
68
|
+
*/
|
|
69
|
+
export type InferQuery<TContract extends HttpContractConfig> =
|
|
70
|
+
TContract["query"] extends StandardSchemaV1
|
|
71
|
+
? InferInput<TContract["query"]>
|
|
72
|
+
: undefined;
|
|
73
|
+
|
|
74
|
+
export type InferHeaders<TContract extends HttpContractConfig> =
|
|
75
|
+
InferHeaderSchemaInput<
|
|
76
|
+
Exclude<TContract["headers"], undefined>
|
|
77
|
+
> extends undefined
|
|
78
|
+
? undefined
|
|
79
|
+
: InferHeaderSchemaInput<Exclude<TContract["headers"], undefined>>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Infer body from contract
|
|
83
|
+
*/
|
|
84
|
+
export type InferBody<TContract extends HttpContractConfig> =
|
|
85
|
+
TContract["method"] extends BodyHttpMethod
|
|
86
|
+
? TContract["body"] extends StandardSchemaV1
|
|
87
|
+
? InferInput<TContract["body"]>
|
|
88
|
+
: undefined
|
|
89
|
+
: undefined;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Any 2xx HTTP success status code (200–299).
|
|
93
|
+
*/
|
|
94
|
+
type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
95
|
+
type ToNumber<S extends string> = S extends `${infer N extends number}`
|
|
96
|
+
? N
|
|
97
|
+
: never;
|
|
98
|
+
type Any2xxCode = ToNumber<`2${Digit}${Digit}`>;
|
|
99
|
+
type NumericKey<K> = K extends number
|
|
100
|
+
? K
|
|
101
|
+
: K extends `${infer N extends number}`
|
|
102
|
+
? N
|
|
103
|
+
: never;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Find all 2xx status keys from a responses record
|
|
107
|
+
*/
|
|
108
|
+
type Any2xxKey<T extends object> = {
|
|
109
|
+
[K in keyof T]: NumericKey<K> extends Any2xxCode ? K : never;
|
|
110
|
+
}[keyof T];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Find all non-2xx status keys from a responses record
|
|
114
|
+
*/
|
|
115
|
+
type AnyErrorKey<T extends object> = {
|
|
116
|
+
[K in keyof T]: NumericKey<K> extends Any2xxCode ? never : K;
|
|
117
|
+
}[keyof T];
|
|
118
|
+
|
|
119
|
+
type ResponseForStatus<
|
|
120
|
+
TResponses extends object,
|
|
121
|
+
TStatus extends number,
|
|
122
|
+
> = TStatus extends keyof TResponses
|
|
123
|
+
? TResponses[TStatus]
|
|
124
|
+
: `${TStatus}` extends keyof TResponses
|
|
125
|
+
? TResponses[`${TStatus}`]
|
|
126
|
+
: never;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Infer a single response type from a schema or null
|
|
130
|
+
*/
|
|
131
|
+
type InferResponseType<T> = T extends null
|
|
132
|
+
? undefined
|
|
133
|
+
: T extends StandardSchemaV1
|
|
134
|
+
? InferOutput<T>
|
|
135
|
+
: unknown;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Infer success response from contract (union of all 2xx response types)
|
|
139
|
+
*/
|
|
140
|
+
export type InferSuccessResponse<TContract extends HttpContractConfig> =
|
|
141
|
+
TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
|
|
142
|
+
? Any2xxKey<TContract["responses"]> extends infer K
|
|
143
|
+
? K extends keyof TContract["responses"]
|
|
144
|
+
? InferResponseType<TContract["responses"][K]>
|
|
145
|
+
: unknown
|
|
146
|
+
: unknown
|
|
147
|
+
: unknown;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Infer error response from contract (union of all non-2xx response types)
|
|
151
|
+
*/
|
|
152
|
+
export type InferErrorResponse<TContract extends HttpContractConfig> =
|
|
153
|
+
TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
|
|
154
|
+
? AnyErrorKey<TContract["responses"]> extends infer K
|
|
155
|
+
? K extends keyof TContract["responses"]
|
|
156
|
+
? InferResponseType<TContract["responses"][K]>
|
|
157
|
+
: unknown
|
|
158
|
+
: unknown
|
|
159
|
+
: unknown;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Infer declared non-2xx status codes from a contract.
|
|
163
|
+
*/
|
|
164
|
+
export type InferEndpointErrorStatus<TContract extends HttpContractConfig> =
|
|
165
|
+
TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
|
|
166
|
+
? NumericKey<AnyErrorKey<TContract["responses"]>>
|
|
167
|
+
: never;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Infer a declared non-2xx response body for a specific status.
|
|
171
|
+
*/
|
|
172
|
+
export type InferErrorResponseByStatus<
|
|
173
|
+
TContract extends HttpContractConfig,
|
|
174
|
+
TStatus extends number,
|
|
175
|
+
> =
|
|
176
|
+
TContract["responses"] extends Partial<Record<number, StandardSchema | null>>
|
|
177
|
+
? InferResponseType<ResponseForStatus<TContract["responses"], TStatus>>
|
|
178
|
+
: unknown;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Error bodies a Beignet client can receive for a specific status.
|
|
182
|
+
*/
|
|
183
|
+
export type InferEndpointErrorResponseByStatus<
|
|
184
|
+
TContract extends HttpContractConfig,
|
|
185
|
+
TStatus extends number,
|
|
186
|
+
> =
|
|
187
|
+
| InferErrorResponseByStatus<TContract, TStatus>
|
|
188
|
+
| ErrorResponseBody
|
|
189
|
+
| string
|
|
190
|
+
| undefined;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Error bodies a Beignet client can receive for an endpoint.
|
|
194
|
+
*
|
|
195
|
+
* Declared route-owned errors come from the contract. Framework-owned errors
|
|
196
|
+
* use the standard envelope. Transport escape hatches may return text or no body.
|
|
197
|
+
*/
|
|
198
|
+
export type InferEndpointErrorResponse<TContract extends HttpContractConfig> =
|
|
199
|
+
| InferErrorResponse<TContract>
|
|
200
|
+
| ErrorResponseBody
|
|
201
|
+
| string
|
|
202
|
+
| undefined;
|
|
203
|
+
|
|
204
|
+
export type EndpointSuccessResult<TContract extends HttpContractConfig> = {
|
|
205
|
+
ok: true;
|
|
206
|
+
status: number;
|
|
207
|
+
data: InferSuccessResponse<TContract>;
|
|
208
|
+
response: Response;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
export type EndpointErrorResult<TError> = {
|
|
212
|
+
ok: false;
|
|
213
|
+
status?: number;
|
|
214
|
+
error: TError;
|
|
215
|
+
response?: Response;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
export type EndpointResult<TContract extends HttpContractConfig, TError> =
|
|
219
|
+
| EndpointSuccessResult<TContract>
|
|
220
|
+
| EndpointErrorResult<TError>;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Call arguments for an endpoint
|
|
224
|
+
*/
|
|
225
|
+
type RequestArg<
|
|
226
|
+
Name extends "path" | "query" | "body",
|
|
227
|
+
Value,
|
|
228
|
+
> = Value extends undefined
|
|
229
|
+
? { [K in Name]?: undefined }
|
|
230
|
+
: undefined extends Value
|
|
231
|
+
? { [K in Name]?: Value }
|
|
232
|
+
: { [K in Name]: Value };
|
|
233
|
+
|
|
234
|
+
type PathArgs<TContract extends HttpContractConfig> = RequestArg<
|
|
235
|
+
"path",
|
|
236
|
+
InferPathParams<TContract>
|
|
237
|
+
>;
|
|
238
|
+
|
|
239
|
+
type QueryArgs<TContract extends HttpContractConfig> = RequestArg<
|
|
240
|
+
"query",
|
|
241
|
+
InferQuery<TContract>
|
|
242
|
+
>;
|
|
243
|
+
|
|
244
|
+
type BodyArgs<TContract extends HttpContractConfig> = RequestArg<
|
|
245
|
+
"body",
|
|
246
|
+
InferBody<TContract>
|
|
247
|
+
>;
|
|
248
|
+
|
|
249
|
+
type ProvidedHeaderKeys<THeaders, TProvidedHeaders extends string> = Extract<
|
|
250
|
+
keyof THeaders,
|
|
251
|
+
TProvidedHeaders
|
|
252
|
+
>;
|
|
253
|
+
|
|
254
|
+
type ApplyProvidedHeaders<THeaders, TProvidedHeaders extends string> = Omit<
|
|
255
|
+
THeaders,
|
|
256
|
+
ProvidedHeaderKeys<THeaders, TProvidedHeaders>
|
|
257
|
+
> &
|
|
258
|
+
Partial<Pick<THeaders, ProvidedHeaderKeys<THeaders, TProvidedHeaders>>>;
|
|
259
|
+
|
|
260
|
+
type HeaderInput<
|
|
261
|
+
TContract extends HttpContractConfig,
|
|
262
|
+
TProvidedHeaders extends string,
|
|
263
|
+
> =
|
|
264
|
+
InferHeaders<TContract> extends undefined
|
|
265
|
+
? Record<string, string>
|
|
266
|
+
: ApplyProvidedHeaders<InferHeaders<TContract>, TProvidedHeaders>;
|
|
267
|
+
|
|
268
|
+
type HeadersArgs<
|
|
269
|
+
TContract extends HttpContractConfig,
|
|
270
|
+
TProvidedHeaders extends string,
|
|
271
|
+
> =
|
|
272
|
+
InferHeaders<TContract> extends undefined
|
|
273
|
+
? { headers?: Record<string, string> }
|
|
274
|
+
: HasRequiredKeys<HeaderInput<TContract, TProvidedHeaders>> extends never
|
|
275
|
+
? { headers?: HeaderInput<TContract, TProvidedHeaders> }
|
|
276
|
+
: { headers: HeaderInput<TContract, TProvidedHeaders> };
|
|
277
|
+
|
|
278
|
+
export type EndpointCallArgs<
|
|
279
|
+
TContract extends HttpContractConfig,
|
|
280
|
+
TProvidedHeaders extends string = never,
|
|
281
|
+
> = PathArgs<TContract> &
|
|
282
|
+
QueryArgs<TContract> &
|
|
283
|
+
BodyArgs<TContract> & {
|
|
284
|
+
/**
|
|
285
|
+
* Escape hatch for non-JSON request bodies such as FormData, Blob,
|
|
286
|
+
* ArrayBuffer, ReadableStream, or pre-serialized text.
|
|
287
|
+
*
|
|
288
|
+
* Use `body` for contract-validated JSON requests. `rawBody` is sent as-is
|
|
289
|
+
* and is not validated or JSON-serialized.
|
|
290
|
+
*/
|
|
291
|
+
rawBody?: TContract["method"] extends BodyHttpMethod ? BodyInit : never;
|
|
292
|
+
signal?: AbortSignal;
|
|
293
|
+
} & HeadersArgs<TContract, TProvidedHeaders>;
|
|
294
|
+
|
|
295
|
+
type HasRequiredKeys<T> = {
|
|
296
|
+
[K in keyof T]-?: Record<string, never> extends Pick<T, K> ? never : K;
|
|
297
|
+
}[keyof T];
|
|
298
|
+
|
|
299
|
+
export type CallArgs<
|
|
300
|
+
TContract extends HttpContractConfig,
|
|
301
|
+
TProvidedHeaders extends string = never,
|
|
302
|
+
> =
|
|
303
|
+
HasRequiredKeys<EndpointCallArgs<TContract, TProvidedHeaders>> extends never
|
|
304
|
+
? [args?: EndpointCallArgs<TContract, TProvidedHeaders>]
|
|
305
|
+
: [args: EndpointCallArgs<TContract, TProvidedHeaders>];
|