@lokalise/api-contracts 5.0.0-exp-testingContracts.6 → 5.2.0
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/dist/apiContracts.d.ts +10 -40
- package/dist/apiContracts.js +0 -3
- package/dist/apiContracts.js.map +1 -1
- package/package.json +6 -5
- package/dist/contractService.d.ts +0 -19
- package/dist/contractService.js +0 -57
- package/dist/contractService.js.map +0 -1
- package/dist/headers/createHeaderBuilderMiddleware.d.ts +0 -33
- package/dist/headers/createHeaderBuilderMiddleware.js +0 -44
- package/dist/headers/createHeaderBuilderMiddleware.js.map +0 -1
- package/dist/headers/headerBuilder.d.ts +0 -171
- package/dist/headers/headerBuilder.js +0 -173
- package/dist/headers/headerBuilder.js.map +0 -1
package/dist/apiContracts.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ZodSchema, z } from 'zod';
|
|
2
|
-
import type { AnyDeleteRoute, AnyGetRoute, AnyPayloadRoute, AnyRoute } from './contractService.js';
|
|
1
|
+
import type { ZodSchema, z } from 'zod/v4';
|
|
3
2
|
import type { HttpStatusCode } from './HttpStatusCodes.ts';
|
|
4
3
|
export type { HttpStatusCode };
|
|
5
4
|
export type InferSchemaInput<T extends ZodSchema | undefined> = T extends ZodSchema ? z.input<T> : T extends undefined ? undefined : never;
|
|
@@ -7,7 +6,7 @@ export type InferSchemaOutput<T extends ZodSchema | undefined> = T extends ZodSc
|
|
|
7
6
|
export type RoutePathResolver<PathParams> = (pathParams: PathParams) => string;
|
|
8
7
|
export interface CommonRouteDefinitionMetadata extends Record<string, unknown> {
|
|
9
8
|
}
|
|
10
|
-
export type CommonRouteDefinition<ResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false> = {
|
|
9
|
+
export type CommonRouteDefinition<ResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = {
|
|
11
10
|
isNonJSONResponseExpected?: IsNonJSONResponseExpected;
|
|
12
11
|
isEmptyResponseExpected?: IsEmptyResponseExpected;
|
|
13
12
|
successResponseBodySchema: ResponseBodySchema;
|
|
@@ -15,55 +14,26 @@ export type CommonRouteDefinition<ResponseBodySchema extends z.Schema | undefine
|
|
|
15
14
|
requestQuerySchema?: RequestQuerySchema;
|
|
16
15
|
requestHeaderSchema?: RequestHeaderSchema;
|
|
17
16
|
pathResolver: RoutePathResolver<InferSchemaOutput<PathParamsSchema>>;
|
|
18
|
-
responseSchemasByStatusCode?:
|
|
17
|
+
responseSchemasByStatusCode?: ResponseSchemasByStatusCode;
|
|
19
18
|
metadata?: CommonRouteDefinitionMetadata;
|
|
20
19
|
description?: string;
|
|
21
20
|
summary?: string;
|
|
22
21
|
tags?: readonly string[];
|
|
23
22
|
};
|
|
24
|
-
export type PayloadRouteDefinition<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected> & {
|
|
23
|
+
export type PayloadRouteDefinition<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode> & {
|
|
25
24
|
method: 'post' | 'put' | 'patch';
|
|
26
25
|
requestBodySchema: RequestBodySchema;
|
|
27
26
|
};
|
|
28
|
-
export type GetRouteDefinition<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected> & {
|
|
27
|
+
export type GetRouteDefinition<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode> & {
|
|
29
28
|
method: 'get';
|
|
30
29
|
};
|
|
31
|
-
export type DeleteRouteDefinition<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected> & {
|
|
30
|
+
export type DeleteRouteDefinition<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode> & {
|
|
32
31
|
method: 'delete';
|
|
33
32
|
};
|
|
34
|
-
export declare function buildPayloadRoute<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false>(params: PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>): PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>;
|
|
35
|
-
export declare function buildGetRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false>(params: Omit<GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>, 'method'>): GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>;
|
|
36
|
-
export declare function buildDeleteRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true>(params: Omit<DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>, 'method'>): DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected>;
|
|
33
|
+
export declare function buildPayloadRoute<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>): PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
|
|
34
|
+
export declare function buildGetRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: Omit<GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'>): GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
|
|
35
|
+
export declare function buildDeleteRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: Omit<DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'>): DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
|
|
37
36
|
/**
|
|
38
37
|
* This method maps given route definition to a string of the format '/static-path-part/:path-param-value'
|
|
39
38
|
*/
|
|
40
|
-
export declare function mapRouteToPath(routeDefinition: CommonRouteDefinition<any, any, any, any, any, any>): string;
|
|
41
|
-
export type InferGetDetails<Route extends AnyGetRoute> = Route extends GetRouteDefinition<infer SuccessResponseBodySchema, infer PathParamsSchema, infer RequestQuerySchema, infer RequestHeaderSchema, infer IsNonJSONResponseExpected, infer IsEmptyResponseExpected> ? {
|
|
42
|
-
responseBodySchema: SuccessResponseBodySchema;
|
|
43
|
-
pathParamsSchema: PathParamsSchema;
|
|
44
|
-
requestQuerySchema: RequestQuerySchema;
|
|
45
|
-
requestHeaderSchema: RequestHeaderSchema;
|
|
46
|
-
isNonJSONResponseExpected: IsNonJSONResponseExpected;
|
|
47
|
-
isEmptyResponseExpected: IsEmptyResponseExpected;
|
|
48
|
-
} : never;
|
|
49
|
-
export type InferDeleteDetails<Route extends AnyDeleteRoute> = Route extends DeleteRouteDefinition<infer SuccessResponseBodySchema, infer PathParamsSchema, infer RequestQuerySchema, infer RequestHeaderSchema, infer IsNonJSONResponseExpected, infer IsEmptyResponseExpected> ? {
|
|
50
|
-
responseBodySchema: SuccessResponseBodySchema;
|
|
51
|
-
pathParamsSchema: PathParamsSchema;
|
|
52
|
-
requestQuerySchema: RequestQuerySchema;
|
|
53
|
-
requestHeaderSchema: RequestHeaderSchema;
|
|
54
|
-
isNonJSONResponseExpected: IsNonJSONResponseExpected;
|
|
55
|
-
isEmptyResponseExpected: IsEmptyResponseExpected;
|
|
56
|
-
} : never;
|
|
57
|
-
export type InferPayloadDetails<Route extends AnyPayloadRoute> = Route extends PayloadRouteDefinition<infer RequestBodySchema, infer SuccessResponseBodySchema, infer PathParamsSchema, infer RequestQuerySchema, infer RequestHeaderSchema, infer IsNonJSONResponseExpected, infer IsEmptyResponseExpected> ? {
|
|
58
|
-
requestBodySchema: RequestBodySchema;
|
|
59
|
-
responseBodySchema: SuccessResponseBodySchema;
|
|
60
|
-
pathParamsSchema: PathParamsSchema;
|
|
61
|
-
requestQuerySchema: RequestQuerySchema;
|
|
62
|
-
requestHeaderSchema: RequestHeaderSchema;
|
|
63
|
-
isNonJSONResponseExpected: IsNonJSONResponseExpected;
|
|
64
|
-
isEmptyResponseExpected: IsEmptyResponseExpected;
|
|
65
|
-
} : never;
|
|
66
|
-
export type InferRouteDetails<Route extends AnyRoute> = Route extends AnyGetRoute ? InferGetDetails<Route> : Route extends AnyDeleteRoute ? InferDeleteDetails<Route> : Route extends AnyPayloadRoute ? InferPayloadDetails<Route> : never;
|
|
67
|
-
export * from './contractService.js';
|
|
68
|
-
export * from './headers/createHeaderBuilderMiddleware.js';
|
|
69
|
-
export * from './headers/headerBuilder.js';
|
|
39
|
+
export declare function mapRouteToPath(routeDefinition: CommonRouteDefinition<any, any, any, any, any, any, any>): string;
|
package/dist/apiContracts.js
CHANGED
|
@@ -67,7 +67,4 @@ routeDefinition) {
|
|
|
67
67
|
}
|
|
68
68
|
return routeDefinition.pathResolver(resolverParams);
|
|
69
69
|
}
|
|
70
|
-
export * from './contractService.js';
|
|
71
|
-
export * from './headers/createHeaderBuilderMiddleware.js';
|
|
72
|
-
export * from './headers/headerBuilder.js';
|
|
73
70
|
//# sourceMappingURL=apiContracts.js.map
|
package/dist/apiContracts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.js","sourceRoot":"","sources":["../src/apiContracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apiContracts.js","sourceRoot":"","sources":["../src/apiContracts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokalise/api-contracts",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -45,13 +45,14 @@
|
|
|
45
45
|
"zod": ">=3.25.56"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@biomejs/biome": "^2.
|
|
49
|
-
"@lokalise/biome-config": "^
|
|
48
|
+
"@biomejs/biome": "^2.1.4",
|
|
49
|
+
"@lokalise/biome-config": "^3.1.0",
|
|
50
50
|
"@lokalise/tsconfig": "^1.3.0",
|
|
51
51
|
"@vitest/coverage-v8": "^3.2.2",
|
|
52
52
|
"rimraf": "^6.0.1",
|
|
53
|
-
"typescript": "5.
|
|
54
|
-
"vitest": "^3.2.2"
|
|
53
|
+
"typescript": "5.9.2",
|
|
54
|
+
"vitest": "^3.2.2",
|
|
55
|
+
"zod": "^4.0.17"
|
|
55
56
|
},
|
|
56
57
|
"dependencies": {}
|
|
57
58
|
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { DeleteRouteDefinition, GetRouteDefinition, PayloadRouteDefinition } from './apiContracts.js';
|
|
2
|
-
export type AnyGetRoute = GetRouteDefinition<any, any, any, any, any, any>;
|
|
3
|
-
export type AnyDeleteRoute = DeleteRouteDefinition<any, any, any, any, any, any>;
|
|
4
|
-
export type AnyPayloadRoute = PayloadRouteDefinition<any, any, any, any, any, any>;
|
|
5
|
-
export type AnyRoute = AnyGetRoute | AnyDeleteRoute | AnyPayloadRoute;
|
|
6
|
-
export type AnyCacheKeyFn = (...args: any[]) => Array<any>;
|
|
7
|
-
export type AnyRoutes = {
|
|
8
|
-
[key: string]: {
|
|
9
|
-
route: AnyRoute;
|
|
10
|
-
cacheKey: AnyCacheKeyFn;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
export type ContractDefinitions<Routes extends AnyRoutes = AnyRoutes> = {
|
|
14
|
-
serviceName: string;
|
|
15
|
-
config: {
|
|
16
|
-
routes: Routes;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
export declare function definedContract<R extends AnyRoutes>(service: string, routes: R): ContractDefinitions<R>;
|
package/dist/contractService.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
export function definedContract(service, routes) {
|
|
2
|
-
return { serviceName: service, config: { routes } };
|
|
3
|
-
}
|
|
4
|
-
// export type ConfiguredContractService<
|
|
5
|
-
// Client,
|
|
6
|
-
// Definition extends ContractDefinitions,
|
|
7
|
-
// ContractHeaders extends Headers = NoHeaders,
|
|
8
|
-
// > = {
|
|
9
|
-
// definition: Definition
|
|
10
|
-
// contractHeaders: HeaderBuilder<ContractHeaders>
|
|
11
|
-
// prepared: {
|
|
12
|
-
// [K in keyof Definition['config']['routes']]: Promise<{
|
|
13
|
-
// client: Client
|
|
14
|
-
// headers: ContractHeaders
|
|
15
|
-
// route: Definition['config']['routes'][K]['route']
|
|
16
|
-
// }>
|
|
17
|
-
// }
|
|
18
|
-
// }
|
|
19
|
-
// export function configureContractService<
|
|
20
|
-
// Client,
|
|
21
|
-
// Definition extends ContractDefinitions<AnyRoutes>,
|
|
22
|
-
// ContractHeaders extends Headers = NoHeaders,
|
|
23
|
-
// >(
|
|
24
|
-
// definition: Definition,
|
|
25
|
-
// clientResolver: (service: string) => Promise<Client>,
|
|
26
|
-
// contractHeaders?: HeaderBuilder<ContractHeaders>,
|
|
27
|
-
// ): ConfiguredContractService<Client, Definition, ContractHeaders> {
|
|
28
|
-
// const clientCache = clientResolver(definition.serviceName)
|
|
29
|
-
// const contractHeadersBuilder = contractHeaders ?? HeaderBuilder.create<ContractHeaders>()
|
|
30
|
-
//
|
|
31
|
-
// const prepared = {} as {
|
|
32
|
-
// [K in keyof Definition['config']['routes']]: Promise<{
|
|
33
|
-
// client: Client
|
|
34
|
-
// headers: ContractHeaders
|
|
35
|
-
// route: Definition['config']['routes'][K]['route']
|
|
36
|
-
// }>
|
|
37
|
-
// }
|
|
38
|
-
//
|
|
39
|
-
// for (const key in definition.config.routes) {
|
|
40
|
-
// const router = definition.config.routes[key]
|
|
41
|
-
// if (router === undefined) {
|
|
42
|
-
// throw new Error(`Route ${String(key)} is not defined in the contract`)
|
|
43
|
-
// }
|
|
44
|
-
//
|
|
45
|
-
// prepared[key as keyof Definition['config']['routes']] = Promise.all([
|
|
46
|
-
// clientCache,
|
|
47
|
-
// contractHeadersBuilder.resolve(),
|
|
48
|
-
// ]).then(([client, headers]) => ({
|
|
49
|
-
// client,
|
|
50
|
-
// headers,
|
|
51
|
-
// route: router.route,
|
|
52
|
-
// }))
|
|
53
|
-
// }
|
|
54
|
-
//
|
|
55
|
-
// return { definition, contractHeaders: contractHeadersBuilder, prepared }
|
|
56
|
-
// }
|
|
57
|
-
//# sourceMappingURL=contractService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contractService.js","sourceRoot":"","sources":["../src/contractService.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,MAAS;IAET,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAA;AACrD,CAAC;AAED,yCAAyC;AACzC,YAAY;AACZ,4CAA4C;AAC5C,iDAAiD;AACjD,QAAQ;AACR,2BAA2B;AAC3B,oDAAoD;AACpD,gBAAgB;AAChB,6DAA6D;AAC7D,uBAAuB;AACvB,iCAAiC;AACjC,0DAA0D;AAC1D,SAAS;AACT,MAAM;AACN,IAAI;AAEJ,4CAA4C;AAC5C,YAAY;AACZ,uDAAuD;AACvD,iDAAiD;AACjD,KAAK;AACL,4BAA4B;AAC5B,0DAA0D;AAC1D,sDAAsD;AACtD,sEAAsE;AACtE,+DAA+D;AAC/D,8FAA8F;AAC9F,EAAE;AACF,6BAA6B;AAC7B,6DAA6D;AAC7D,uBAAuB;AACvB,iCAAiC;AACjC,0DAA0D;AAC1D,SAAS;AACT,MAAM;AACN,EAAE;AACF,kDAAkD;AAClD,mDAAmD;AACnD,kCAAkC;AAClC,+EAA+E;AAC/E,QAAQ;AACR,EAAE;AACF,4EAA4E;AAC5E,qBAAqB;AACrB,0CAA0C;AAC1C,wCAAwC;AACxC,gBAAgB;AAChB,iBAAiB;AACjB,6BAA6B;AAC7B,UAAU;AACV,MAAM;AACN,EAAE;AACF,6EAA6E;AAC7E,IAAI"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { HeaderBuilder, type Headers } from './headerBuilder.js';
|
|
2
|
-
/**
|
|
3
|
-
* A helper function that creates a HeaderBuilderMiddleware, it removed the
|
|
4
|
-
* complexity of creating a new instance of the middleware class and tracking the input types.
|
|
5
|
-
*
|
|
6
|
-
* @param middleware - A function that modifies a HeaderBuilder
|
|
7
|
-
* @returns - A new instance of HeaderBuilderMiddleware to be used with a HeaderBuilder
|
|
8
|
-
*/
|
|
9
|
-
export declare function createHeaderBuilderMiddleware<const H extends Headers>(middleware: (builder: HeaderBuilder) => HeaderBuilder<H> | Promise<HeaderBuilder<H>>): HeaderBuilderMiddleware<H>;
|
|
10
|
-
export type { HeaderBuilderMiddleware };
|
|
11
|
-
type MiddlewareFn<H extends Headers> = (builder: HeaderBuilder<Headers>) => HeaderBuilder<H> | Promise<HeaderBuilder<H>>;
|
|
12
|
-
/**
|
|
13
|
-
* A middleware class that allows you to modify a HeaderBuilder in a type-safe way.
|
|
14
|
-
* It receives a builder and returns a new builder with the modifications applied.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
19
|
-
* const token = await fetchToken()
|
|
20
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
21
|
-
* })
|
|
22
|
-
*
|
|
23
|
-
* const builder = HeaderBuilder.create()
|
|
24
|
-
* .with(authMiddleware)
|
|
25
|
-
*
|
|
26
|
-
* const headers = await builder.resolve() // Type of headers is { 'authorization': string }
|
|
27
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
28
|
-
*/
|
|
29
|
-
declare class HeaderBuilderMiddleware<const H extends Headers> {
|
|
30
|
-
private readonly middleware;
|
|
31
|
-
constructor(middleware: MiddlewareFn<H>);
|
|
32
|
-
apply<const BH extends Headers>(base: HeaderBuilder<BH>): HeaderBuilder<BH & H>;
|
|
33
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { HeaderBuilder } from './headerBuilder.js';
|
|
2
|
-
/**
|
|
3
|
-
* A helper function that creates a HeaderBuilderMiddleware, it removed the
|
|
4
|
-
* complexity of creating a new instance of the middleware class and tracking the input types.
|
|
5
|
-
*
|
|
6
|
-
* @param middleware - A function that modifies a HeaderBuilder
|
|
7
|
-
* @returns - A new instance of HeaderBuilderMiddleware to be used with a HeaderBuilder
|
|
8
|
-
*/
|
|
9
|
-
export function createHeaderBuilderMiddleware(middleware) {
|
|
10
|
-
return new HeaderBuilderMiddleware(middleware);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* A middleware class that allows you to modify a HeaderBuilder in a type-safe way.
|
|
14
|
-
* It receives a builder and returns a new builder with the modifications applied.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
19
|
-
* const token = await fetchToken()
|
|
20
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
21
|
-
* })
|
|
22
|
-
*
|
|
23
|
-
* const builder = HeaderBuilder.create()
|
|
24
|
-
* .with(authMiddleware)
|
|
25
|
-
*
|
|
26
|
-
* const headers = await builder.resolve() // Type of headers is { 'authorization': string }
|
|
27
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
28
|
-
*/
|
|
29
|
-
class HeaderBuilderMiddleware {
|
|
30
|
-
middleware;
|
|
31
|
-
constructor(middleware) {
|
|
32
|
-
this.middleware = middleware;
|
|
33
|
-
}
|
|
34
|
-
apply(base) {
|
|
35
|
-
// Using the `from` method to make the promise lazy - it should only resolve when the builder is resolved
|
|
36
|
-
return base.from(async () => {
|
|
37
|
-
const middlewareBuilder = this.middleware(HeaderBuilder.create());
|
|
38
|
-
return middlewareBuilder instanceof Promise
|
|
39
|
-
? middlewareBuilder.then((r) => r.resolve())
|
|
40
|
-
: middlewareBuilder.resolve();
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=createHeaderBuilderMiddleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createHeaderBuilderMiddleware.js","sourceRoot":"","sources":["../../src/headers/createHeaderBuilderMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,oBAAoB,CAAA;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CACzC,UAAoF;IAEpF,OAAO,IAAI,uBAAuB,CAAI,UAAU,CAAC,CAAA;AACrD,CAAC;AAWD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,uBAAuB;IACR,UAAU,CAAiB;IAE5C,YAAY,UAA2B;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAChC,CAAC;IAED,KAAK,CAA2B,IAAuB;QACnD,yGAAyG;QACzG,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;YAEjE,OAAO,iBAAiB,YAAY,OAAO;gBACvC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5C,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAA;QACrC,CAAC,CAAC,CAAA;IACN,CAAC;CACJ"}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import type { HeaderBuilderMiddleware } from './createHeaderBuilderMiddleware.js';
|
|
2
|
-
export type Headers<K extends string = string, V extends string = string> = Record<K, V>;
|
|
3
|
-
export type NoHeaders = {};
|
|
4
|
-
export type HeadersFromBuilder<H extends HeaderBuilder> = H extends HeaderBuilder<infer T> ? T : never;
|
|
5
|
-
/**
|
|
6
|
-
* A builder class that helps to build up a set of headers in a type-safe way.
|
|
7
|
-
* It allows you to add headers, merge them together, and resolve them into a single object.
|
|
8
|
-
* The builder is immutable, so every operation returns a new instance of the builder.
|
|
9
|
-
* It offers a middleware function that allows you to modify the builder, asynchronously, in a type-safe way.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
14
|
-
* const token = await fetchToken()
|
|
15
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
16
|
-
* })
|
|
17
|
-
*
|
|
18
|
-
* const builder = HeaderBuilder.create()
|
|
19
|
-
* .add('Content-Type', 'application/json')
|
|
20
|
-
* .and({ 'X-Custom-Header': 'custom', 'X-Another-Header': 'another' })
|
|
21
|
-
* .with(authMiddleware)
|
|
22
|
-
*
|
|
23
|
-
* const headers = await builder.resolve()
|
|
24
|
-
* console.log(headers)
|
|
25
|
-
* // Prints: {
|
|
26
|
-
* // 'Content-Type': 'application/json',
|
|
27
|
-
* // 'X-Custom-Header': 'custom',
|
|
28
|
-
* // 'X-Another-Header': 'another',
|
|
29
|
-
* // 'authorization': 'Bearer <token>'
|
|
30
|
-
* // }
|
|
31
|
-
*/
|
|
32
|
-
export declare class HeaderBuilder<H extends Headers = NoHeaders> {
|
|
33
|
-
/**
|
|
34
|
-
* Creates a new HeaderBuilder, optionally with an initial set of headers.
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* const builder = HeaderBuilder.create()
|
|
39
|
-
*
|
|
40
|
-
* const builderWithHeaders = HeaderBuilder.create({ 'Content-Type': 'application/json' })
|
|
41
|
-
*
|
|
42
|
-
* console.log(builder) // {}
|
|
43
|
-
* console.log(builderWithHeaders) // { 'Content-Type': 'application/json' }
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
static create<const H extends Headers = NoHeaders>(): HeaderBuilder<H>;
|
|
47
|
-
static create<const H extends Headers>(initialHeaders: H | (() => H) | (() => Promise<H>)): HeaderBuilder<H>;
|
|
48
|
-
private readonly factories;
|
|
49
|
-
/**
|
|
50
|
-
* This constructor is private to prevent the creation of a HeaderBuilder, it's an implementation detail
|
|
51
|
-
* that users of this class should not be aware of. The only way to create a HeaderBuilder is through the
|
|
52
|
-
* static create method.
|
|
53
|
-
*
|
|
54
|
-
* @private
|
|
55
|
-
*/
|
|
56
|
-
private constructor();
|
|
57
|
-
/**
|
|
58
|
-
* Adds a single header to the builder by providing a key and a value.
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* ```typescript
|
|
62
|
-
* const builder = HeaderBuilder.create()
|
|
63
|
-
* .add('Content-Type', 'application/json')
|
|
64
|
-
* .add('authorization', 'Bearer token')
|
|
65
|
-
*
|
|
66
|
-
* const headers = await builder.resolve()
|
|
67
|
-
* console.log(headers)
|
|
68
|
-
* // { 'Content-Type': 'application/json', 'authorization': 'Bearer token' }
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* @param key - The key of the header
|
|
72
|
-
* @param value - The value of the header
|
|
73
|
-
*/
|
|
74
|
-
add<const K extends string, const V>(key: K, value: V): HeaderBuilder<H & {
|
|
75
|
-
[k in K]: V;
|
|
76
|
-
}>;
|
|
77
|
-
/**
|
|
78
|
-
* Adds multiple headers to the builder by providing an object or a promise of an object with the headers.
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* const builder = HeaderBuilder.create()
|
|
83
|
-
* .and({ 'Content-Type': 'application/json', 'authorization': 'Bearer token' })
|
|
84
|
-
* .and(Promise.resolve({ 'X-Custom-Header': 'custom', 'X-Another-Header': 'another' }))
|
|
85
|
-
*
|
|
86
|
-
* const headers = await builder.resolve()
|
|
87
|
-
* console.log(headers)
|
|
88
|
-
* // Prints: {
|
|
89
|
-
* // 'Content-Type': 'application/json',
|
|
90
|
-
* // 'authorization': 'Bearer token',
|
|
91
|
-
* // 'X-Custom-Header': 'custom',
|
|
92
|
-
* // 'X-Another-Header': 'another'
|
|
93
|
-
* // }
|
|
94
|
-
* ```
|
|
95
|
-
*
|
|
96
|
-
* @param extension - An object with the headers to add
|
|
97
|
-
*/
|
|
98
|
-
and<const K extends string, const V extends string, E extends Headers<K, V>>(extension: E | Promise<E>): HeaderBuilder<H & E>;
|
|
99
|
-
/**
|
|
100
|
-
* Adds a factory function that returns a promise of headers to the builder.
|
|
101
|
-
* This is useful when you need to fetch some data asynchronously to build the headers.
|
|
102
|
-
*
|
|
103
|
-
* @example
|
|
104
|
-
* ```typescript
|
|
105
|
-
* const builder = HeaderBuilder.create()
|
|
106
|
-
* .from(async () => {
|
|
107
|
-
* const token = await fetchToken()
|
|
108
|
-
* return { 'authorization': `Bearer ${token}` }
|
|
109
|
-
* })
|
|
110
|
-
*
|
|
111
|
-
* const headers = await builder.resolve()
|
|
112
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
113
|
-
* ```
|
|
114
|
-
*
|
|
115
|
-
* @param factory - A function that returns a promise of headers
|
|
116
|
-
*/
|
|
117
|
-
from<E extends Headers>(factory: () => E | Promise<E>): HeaderBuilder<H & E>;
|
|
118
|
-
/**
|
|
119
|
-
* Takes a middleware function that receives the current builder and returns a new, modified, builder.
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
124
|
-
* const token = await fetchToken()
|
|
125
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
126
|
-
* })
|
|
127
|
-
*
|
|
128
|
-
* const builder = HeaderBuilder.create()
|
|
129
|
-
* .with(authMiddleware)
|
|
130
|
-
*
|
|
131
|
-
* const headers = await builder.resolve() // Type of headers is { 'authorization': string }
|
|
132
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
133
|
-
* ```
|
|
134
|
-
*
|
|
135
|
-
* @param middleware
|
|
136
|
-
*/
|
|
137
|
-
with<const T extends Headers>(middleware: HeaderBuilderMiddleware<T>): HeaderBuilder<H & T>;
|
|
138
|
-
/**
|
|
139
|
-
* Merges the current builder with another builder.
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```typescript
|
|
143
|
-
* const builderA = HeaderBuilder.create()
|
|
144
|
-
* .add('Content-Type', 'application/json')
|
|
145
|
-
*
|
|
146
|
-
* const builderB = HeaderBuilder.create()
|
|
147
|
-
* .add('authorization', 'Bearer token')
|
|
148
|
-
*
|
|
149
|
-
* const mergedBuilder = builderA.merge(builderB)
|
|
150
|
-
*
|
|
151
|
-
* const headers = await mergedBuilder.resolve()
|
|
152
|
-
* console.log(headers)
|
|
153
|
-
* // { 'Content-Type': 'application/json', 'authorization': 'Bearer token' }
|
|
154
|
-
* ```
|
|
155
|
-
*
|
|
156
|
-
* @param builder - The builder to merge with
|
|
157
|
-
*/
|
|
158
|
-
merge<const T extends Headers>(builder: HeaderBuilder<T>): HeaderBuilder<H & T>;
|
|
159
|
-
/**
|
|
160
|
-
* Resolves the headers by waiting for all the promises to resolve and merging them together.
|
|
161
|
-
*
|
|
162
|
-
* @example
|
|
163
|
-
* ```typescript
|
|
164
|
-
* const builder = HeaderBuilder.create()
|
|
165
|
-
* .add('Content-Type', 'application/json')
|
|
166
|
-
*
|
|
167
|
-
* const headers = await builder.resolve()
|
|
168
|
-
* console.log(headers) // { 'Content-Type': 'application/json' }
|
|
169
|
-
*/
|
|
170
|
-
resolve(): Promise<H>;
|
|
171
|
-
}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A builder class that helps to build up a set of headers in a type-safe way.
|
|
3
|
-
* It allows you to add headers, merge them together, and resolve them into a single object.
|
|
4
|
-
* The builder is immutable, so every operation returns a new instance of the builder.
|
|
5
|
-
* It offers a middleware function that allows you to modify the builder, asynchronously, in a type-safe way.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
10
|
-
* const token = await fetchToken()
|
|
11
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
12
|
-
* })
|
|
13
|
-
*
|
|
14
|
-
* const builder = HeaderBuilder.create()
|
|
15
|
-
* .add('Content-Type', 'application/json')
|
|
16
|
-
* .and({ 'X-Custom-Header': 'custom', 'X-Another-Header': 'another' })
|
|
17
|
-
* .with(authMiddleware)
|
|
18
|
-
*
|
|
19
|
-
* const headers = await builder.resolve()
|
|
20
|
-
* console.log(headers)
|
|
21
|
-
* // Prints: {
|
|
22
|
-
* // 'Content-Type': 'application/json',
|
|
23
|
-
* // 'X-Custom-Header': 'custom',
|
|
24
|
-
* // 'X-Another-Header': 'another',
|
|
25
|
-
* // 'authorization': 'Bearer <token>'
|
|
26
|
-
* // }
|
|
27
|
-
*/
|
|
28
|
-
export class HeaderBuilder {
|
|
29
|
-
static create(initialHeaders = {}) {
|
|
30
|
-
return new HeaderBuilder([() => initialHeaders]);
|
|
31
|
-
}
|
|
32
|
-
// This is a list of headers that will be put together in the resolve method.
|
|
33
|
-
// You can think of this as building up a history of added headers that will be
|
|
34
|
-
// merged together when they are needed.
|
|
35
|
-
factories;
|
|
36
|
-
/**
|
|
37
|
-
* This constructor is private to prevent the creation of a HeaderBuilder, it's an implementation detail
|
|
38
|
-
* that users of this class should not be aware of. The only way to create a HeaderBuilder is through the
|
|
39
|
-
* static create method.
|
|
40
|
-
*
|
|
41
|
-
* @private
|
|
42
|
-
*/
|
|
43
|
-
constructor(factories) {
|
|
44
|
-
this.factories = factories;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Adds a single header to the builder by providing a key and a value.
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* const builder = HeaderBuilder.create()
|
|
52
|
-
* .add('Content-Type', 'application/json')
|
|
53
|
-
* .add('authorization', 'Bearer token')
|
|
54
|
-
*
|
|
55
|
-
* const headers = await builder.resolve()
|
|
56
|
-
* console.log(headers)
|
|
57
|
-
* // { 'Content-Type': 'application/json', 'authorization': 'Bearer token' }
|
|
58
|
-
* ```
|
|
59
|
-
*
|
|
60
|
-
* @param key - The key of the header
|
|
61
|
-
* @param value - The value of the header
|
|
62
|
-
*/
|
|
63
|
-
add(key, value) {
|
|
64
|
-
return new HeaderBuilder([...this.factories, () => ({ [key]: value })]);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Adds multiple headers to the builder by providing an object or a promise of an object with the headers.
|
|
68
|
-
*
|
|
69
|
-
* @example
|
|
70
|
-
* ```typescript
|
|
71
|
-
* const builder = HeaderBuilder.create()
|
|
72
|
-
* .and({ 'Content-Type': 'application/json', 'authorization': 'Bearer token' })
|
|
73
|
-
* .and(Promise.resolve({ 'X-Custom-Header': 'custom', 'X-Another-Header': 'another' }))
|
|
74
|
-
*
|
|
75
|
-
* const headers = await builder.resolve()
|
|
76
|
-
* console.log(headers)
|
|
77
|
-
* // Prints: {
|
|
78
|
-
* // 'Content-Type': 'application/json',
|
|
79
|
-
* // 'authorization': 'Bearer token',
|
|
80
|
-
* // 'X-Custom-Header': 'custom',
|
|
81
|
-
* // 'X-Another-Header': 'another'
|
|
82
|
-
* // }
|
|
83
|
-
* ```
|
|
84
|
-
*
|
|
85
|
-
* @param extension - An object with the headers to add
|
|
86
|
-
*/
|
|
87
|
-
and(extension) {
|
|
88
|
-
return new HeaderBuilder([...this.factories, () => extension]);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Adds a factory function that returns a promise of headers to the builder.
|
|
92
|
-
* This is useful when you need to fetch some data asynchronously to build the headers.
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```typescript
|
|
96
|
-
* const builder = HeaderBuilder.create()
|
|
97
|
-
* .from(async () => {
|
|
98
|
-
* const token = await fetchToken()
|
|
99
|
-
* return { 'authorization': `Bearer ${token}` }
|
|
100
|
-
* })
|
|
101
|
-
*
|
|
102
|
-
* const headers = await builder.resolve()
|
|
103
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
104
|
-
* ```
|
|
105
|
-
*
|
|
106
|
-
* @param factory - A function that returns a promise of headers
|
|
107
|
-
*/
|
|
108
|
-
from(factory) {
|
|
109
|
-
return new HeaderBuilder([...this.factories, factory]);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Takes a middleware function that receives the current builder and returns a new, modified, builder.
|
|
113
|
-
*
|
|
114
|
-
* @example
|
|
115
|
-
* ```typescript
|
|
116
|
-
* const authMiddleware = createHeaderBuilderMiddleware(async (builder) => {
|
|
117
|
-
* const token = await fetchToken()
|
|
118
|
-
* return builder.add('authorization', `Bearer ${token}`)
|
|
119
|
-
* })
|
|
120
|
-
*
|
|
121
|
-
* const builder = HeaderBuilder.create()
|
|
122
|
-
* .with(authMiddleware)
|
|
123
|
-
*
|
|
124
|
-
* const headers = await builder.resolve() // Type of headers is { 'authorization': string }
|
|
125
|
-
* console.log(headers) // { 'authorization': 'Bearer <token>' }
|
|
126
|
-
* ```
|
|
127
|
-
*
|
|
128
|
-
* @param middleware
|
|
129
|
-
*/
|
|
130
|
-
with(middleware) {
|
|
131
|
-
return middleware.apply(this);
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Merges the current builder with another builder.
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* ```typescript
|
|
138
|
-
* const builderA = HeaderBuilder.create()
|
|
139
|
-
* .add('Content-Type', 'application/json')
|
|
140
|
-
*
|
|
141
|
-
* const builderB = HeaderBuilder.create()
|
|
142
|
-
* .add('authorization', 'Bearer token')
|
|
143
|
-
*
|
|
144
|
-
* const mergedBuilder = builderA.merge(builderB)
|
|
145
|
-
*
|
|
146
|
-
* const headers = await mergedBuilder.resolve()
|
|
147
|
-
* console.log(headers)
|
|
148
|
-
* // { 'Content-Type': 'application/json', 'authorization': 'Bearer token' }
|
|
149
|
-
* ```
|
|
150
|
-
*
|
|
151
|
-
* @param builder - The builder to merge with
|
|
152
|
-
*/
|
|
153
|
-
merge(builder) {
|
|
154
|
-
return new HeaderBuilder([...this.factories, ...builder.factories]);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Resolves the headers by waiting for all the promises to resolve and merging them together.
|
|
158
|
-
*
|
|
159
|
-
* @example
|
|
160
|
-
* ```typescript
|
|
161
|
-
* const builder = HeaderBuilder.create()
|
|
162
|
-
* .add('Content-Type', 'application/json')
|
|
163
|
-
*
|
|
164
|
-
* const headers = await builder.resolve()
|
|
165
|
-
* console.log(headers) // { 'Content-Type': 'application/json' }
|
|
166
|
-
*/
|
|
167
|
-
async resolve() {
|
|
168
|
-
const headers = this.factories.map((header) => header());
|
|
169
|
-
const resolvedHeaders = await Promise.all(headers);
|
|
170
|
-
return Object.assign({}, ...resolvedHeaders);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
//# sourceMappingURL=headerBuilder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"headerBuilder.js","sourceRoot":"","sources":["../../src/headers/headerBuilder.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,aAAa;IAgBtB,MAAM,CAAC,MAAM,CAA0B,iBAAiB,EAAO;QAC3D,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,wCAAwC;IACvB,SAAS,CAAW;IAErC;;;;;;OAMG;IACH,YAAoB,SAAoB;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,GAAG,CAAkC,GAAM,EAAE,KAAQ;QACjD,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAY,CAAC,CAAC,CAAA;IACtF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,GAAG,CACC,SAAyB;QAEzB,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAClE,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,CAAoB,OAA6B;QACjD,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,CAA0B,UAAsC;QAChE,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAA0B,OAAyB;QACpD,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACvE,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,OAAO;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAElD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAA;IAChD,CAAC;CACJ"}
|