@jintianxiayu/http-client-decorator 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +201 -0
  2. package/dist/core/http-client-config.d.ts +18 -0
  3. package/dist/core/http-client-config.d.ts.map +1 -0
  4. package/dist/core/http-client-config.js +3 -0
  5. package/dist/core/http-client-config.js.map +1 -0
  6. package/dist/core/http-client.d.ts +19 -0
  7. package/dist/core/http-client.d.ts.map +1 -0
  8. package/dist/core/http-client.js +89 -0
  9. package/dist/core/http-client.js.map +1 -0
  10. package/dist/core/http-context.d.ts +5 -0
  11. package/dist/core/http-context.d.ts.map +1 -0
  12. package/dist/core/http-context.js +3 -0
  13. package/dist/core/http-context.js.map +1 -0
  14. package/dist/core/http-error.d.ts +15 -0
  15. package/dist/core/http-error.d.ts.map +1 -0
  16. package/dist/core/http-error.js +22 -0
  17. package/dist/core/http-error.js.map +1 -0
  18. package/dist/core/method-metadata.d.ts +17 -0
  19. package/dist/core/method-metadata.d.ts.map +1 -0
  20. package/dist/core/method-metadata.js +3 -0
  21. package/dist/core/method-metadata.js.map +1 -0
  22. package/dist/core/middleware-chain.d.ts +3 -0
  23. package/dist/core/middleware-chain.d.ts.map +1 -0
  24. package/dist/core/middleware-chain.js +22 -0
  25. package/dist/core/middleware-chain.js.map +1 -0
  26. package/dist/core/middleware.d.ts +63 -0
  27. package/dist/core/middleware.d.ts.map +1 -0
  28. package/dist/core/middleware.js +32 -0
  29. package/dist/core/middleware.js.map +1 -0
  30. package/dist/core/param-metadata.d.ts +19 -0
  31. package/dist/core/param-metadata.d.ts.map +1 -0
  32. package/dist/core/param-metadata.js +3 -0
  33. package/dist/core/param-metadata.js.map +1 -0
  34. package/dist/core/proxy-factory.d.ts +12 -0
  35. package/dist/core/proxy-factory.d.ts.map +1 -0
  36. package/dist/core/proxy-factory.js +119 -0
  37. package/dist/core/proxy-factory.js.map +1 -0
  38. package/dist/decorators/http-client.d.ts +19 -0
  39. package/dist/decorators/http-client.d.ts.map +1 -0
  40. package/dist/decorators/http-client.js +37 -0
  41. package/dist/decorators/http-client.js.map +1 -0
  42. package/dist/decorators/http-methods.d.ts +31 -0
  43. package/dist/decorators/http-methods.d.ts.map +1 -0
  44. package/dist/decorators/http-methods.js +53 -0
  45. package/dist/decorators/http-methods.js.map +1 -0
  46. package/dist/decorators/params.d.ts +33 -0
  47. package/dist/decorators/params.d.ts.map +1 -0
  48. package/dist/decorators/params.js +63 -0
  49. package/dist/decorators/params.js.map +1 -0
  50. package/dist/index.d.ts +19 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +37 -0
  53. package/dist/index.js.map +1 -0
  54. package/package.json +32 -0
package/README.md ADDED
@@ -0,0 +1,201 @@
1
+ # @jintianxiayu/http-client-decorator
2
+
3
+ 基于装饰器的 HTTP 客户端框架,提供 RPC-like 调用体验。
4
+
5
+ ## 特性
6
+
7
+ - 基于装饰器的声明式 HTTP 客户端定义
8
+ - 支持 `@Get`、`@Post`、`@Put`、`@Delete`、`@Patch` 方法装饰器
9
+ - 支持 `@Path`、`@Query`、`@Body`、`@Header` 参数装饰器
10
+ - Koa 风格洋葱模型中间件机制
11
+ - HTTP 4xx/5xx 错误自动抛出 `HttpError` 异常
12
+ - 底层使用 axios,支持所有 axios 特性
13
+
14
+ ## 安装
15
+
16
+ ```bash
17
+ npm install @jintianxiayu/http-client-decorator
18
+ ```
19
+
20
+ ## 快速开始
21
+
22
+ ### 定义 HTTP 客户端
23
+
24
+ ```typescript
25
+ import {
26
+ HttpClient,
27
+ Get,
28
+ Post,
29
+ Path,
30
+ Query,
31
+ Body,
32
+ Header,
33
+ } from '@jintianxiayu/http-client-decorator';
34
+
35
+ @HttpClient({
36
+ baseURL: 'https://api.example.com',
37
+ })
38
+ class UserService {
39
+ @Get('/users/:id')
40
+ getUser(
41
+ @Path('id') id: string,
42
+ @Header('Authorization') token: string
43
+ ): Promise<User> {
44
+ // 实际不会调用,仅用于类型标注
45
+ return Promise.resolve({} as User);
46
+ }
47
+
48
+ @Post('/users')
49
+ createUser(@Body() dto: CreateUserDto): Promise<User> {
50
+ return Promise.resolve({} as User);
51
+ }
52
+
53
+ @Get('/users')
54
+ listUsers(
55
+ @Query('page') page: string,
56
+ @Query('size') size: string
57
+ ): Promise<User[]> {
58
+ return Promise.resolve([] as User[]);
59
+ }
60
+ }
61
+ ```
62
+
63
+ ### 使用客户端
64
+
65
+ ```typescript
66
+ const userService = new UserService();
67
+
68
+ // GET https://api.example.com/users/123
69
+ const user = await userService.getUser('123', 'Bearer xxx');
70
+
71
+ // POST https://api.example.com/users
72
+ const newUser = await userService.createUser({ name: 'John' });
73
+
74
+ // GET https://api.example.com/users?page=1&size=10
75
+ const users = await userService.listUsers('1', '10');
76
+ ```
77
+
78
+ ## 中间件
79
+
80
+ ### 定义中间件
81
+
82
+ ```typescript
83
+ import type { Middleware, HttpContext } from '@jintianxiayu/http-client-decorator';
84
+
85
+ const authMiddleware: Middleware = async (ctx: HttpContext, next) => {
86
+ // 请求前处理
87
+ ctx.request.headers['Authorization'] = `Bearer ${getToken()}`;
88
+
89
+ await next(); // 调用下一个中间件
90
+
91
+ // 响应后处理
92
+ console.log(`Response status: ${ctx.response?.status}`);
93
+ };
94
+ ```
95
+
96
+ ### 洋葱模型执行顺序
97
+
98
+ ```
99
+ 请求前: middlewareA.before → middlewareB.before
100
+
101
+ [HTTP 请求]
102
+
103
+ 响应后: middlewareB.after → middlewareA.after
104
+ ```
105
+
106
+ ### 使用中间件
107
+
108
+ ```typescript
109
+ @HttpClient({
110
+ baseURL: 'https://api.example.com',
111
+ middlewares: [authMiddleware, logMiddleware],
112
+ })
113
+ class UserService {}
114
+ ```
115
+
116
+ ## 错误处理
117
+
118
+ HTTP 4xx/5xx 响应会抛出 `HttpError` 异常:
119
+
120
+ ```typescript
121
+ import { HttpError } from '@jintianxiayu/http-client-decorator';
122
+
123
+ try {
124
+ await userService.getUser('not-found');
125
+ } catch (e) {
126
+ if (e instanceof HttpError) {
127
+ console.error(`HTTP ${e.status}: ${e.message}`);
128
+ console.error('Response data:', e.data);
129
+ }
130
+ }
131
+ ```
132
+
133
+ ## API 参考
134
+
135
+ ### 装饰器
136
+
137
+ #### 类装饰器
138
+
139
+ - `@HttpClient(config: HttpClientConfig)` - 标记并配置 HTTP 客户端类
140
+
141
+ #### 方法装饰器
142
+
143
+ - `@Get(path: string)` - GET 请求
144
+ - `@Post(path: string)` - POST 请求
145
+ - `@Put(path: string)` - PUT 请求
146
+ - `@Delete(path: string)` - DELETE 请求
147
+ - `@Patch(path: string)` - PATCH 请求
148
+
149
+ #### 参数装饰器
150
+
151
+ - `@Path(name: string)` - URL 路径参数
152
+ - `@Query(name: string)` - URL 查询参数
153
+ - `@Body()` - 请求体
154
+ - `@Header(name: string)` - 请求头
155
+
156
+ ### 类型
157
+
158
+ ```typescript
159
+ interface HttpClientConfig {
160
+ baseURL: string;
161
+ middlewares?: Middleware[];
162
+ timeout?: number;
163
+ headers?: Record<string, string>;
164
+ }
165
+
166
+ interface HttpContext {
167
+ request: {
168
+ method: string;
169
+ url: string;
170
+ headers: Record<string, string>;
171
+ body?: unknown;
172
+ };
173
+ response?: {
174
+ status: number;
175
+ headers: Record<string, string>;
176
+ data: unknown;
177
+ };
178
+ state: Record<string, unknown>;
179
+ error?: Error;
180
+ }
181
+
182
+ type Middleware = (
183
+ ctx: HttpContext,
184
+ next: () => Promise<void>
185
+ ) => Promise<void>;
186
+
187
+ class HttpError extends Error {
188
+ constructor(
189
+ public status: number,
190
+ public data: unknown,
191
+ message: string
192
+ ) {
193
+ super(message);
194
+ this.name = 'HttpError';
195
+ }
196
+ }
197
+ ```
198
+
199
+ ## License
200
+
201
+ MIT
@@ -0,0 +1,18 @@
1
+ import type { Middleware } from './middleware';
2
+ /**
3
+ * HTTP 客户端配置接口
4
+ *
5
+ * 定义 HTTP 客户端的基础配置信息
6
+ *
7
+ * @param baseURL - 服务端基础地址
8
+ * @param middlewares - 中间件列表(可选)
9
+ * @param timeout - 请求超时时间(毫秒)
10
+ * @param headers - 默认请求头
11
+ */
12
+ export interface HttpClientConfig {
13
+ baseURL: string;
14
+ middlewares?: Middleware[];
15
+ timeout?: number;
16
+ headers?: Record<string, string>;
17
+ }
18
+ //# sourceMappingURL=http-client-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client-config.d.ts","sourceRoot":"","sources":["../../src/core/http-client-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=http-client-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client-config.js","sourceRoot":"","sources":["../../src/core/http-client-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { HttpContext } from './middleware';
2
+ /**
3
+ * 创建 HTTP 请求函数
4
+ *
5
+ * 根据配置创建发送 HTTP 请求的函数,内部处理错误转换和日志记录
6
+ *
7
+ * @param config - HTTP 客户端配置
8
+ * @returns 发送请求的函数
9
+ */
10
+ export declare function createHttpRequest(config: Readonly<{
11
+ baseURL: string;
12
+ timeout?: number;
13
+ headers?: Record<string, string>;
14
+ }>): (request: HttpContext["request"]) => Promise<{
15
+ status: number;
16
+ headers: Record<string, string>;
17
+ data: unknown;
18
+ }>;
19
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/core/http-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,IAGvF,SAAS,WAAW,CAAC,SAAS,CAAC,KAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAmD/E"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createHttpRequest = createHttpRequest;
37
+ const axios_1 = __importStar(require("axios"));
38
+ const http_error_1 = require("./http-error");
39
+ const logger_1 = require("@jintianxiayu/logger");
40
+ const logger = logger_1.LoggerFactory.getLogger('@jintianxiayu/http-client-decorator');
41
+ /**
42
+ * 创建 HTTP 请求函数
43
+ *
44
+ * 根据配置创建发送 HTTP 请求的函数,内部处理错误转换和日志记录
45
+ *
46
+ * @param config - HTTP 客户端配置
47
+ * @returns 发送请求的函数
48
+ */
49
+ function createHttpRequest(config) {
50
+ return async function sendRequest(request) {
51
+ const axiosConfig = {
52
+ method: request.method,
53
+ url: request.url,
54
+ headers: request.headers,
55
+ data: request.body,
56
+ timeout: config.timeout,
57
+ validateStatus: () => true,
58
+ };
59
+ logger.debug(`HTTP ${request.method} ${request.url}`);
60
+ try {
61
+ const response = await (0, axios_1.default)(axiosConfig);
62
+ if (response.status >= 400) {
63
+ throw new http_error_1.HttpError(response.status, response.data, `HTTP ${response.status}: ${request.url}`);
64
+ }
65
+ const responseHeaders = {};
66
+ for (const [key, value] of Object.entries(response.headers)) {
67
+ if (typeof value === 'string') {
68
+ responseHeaders[key] = value;
69
+ }
70
+ }
71
+ logger.debug(`HTTP ${response.status} ${request.url}`);
72
+ return {
73
+ status: response.status,
74
+ headers: responseHeaders,
75
+ data: response.data,
76
+ };
77
+ }
78
+ catch (error) {
79
+ if (error instanceof http_error_1.HttpError) {
80
+ throw error;
81
+ }
82
+ if (error instanceof axios_1.AxiosError) {
83
+ throw new http_error_1.HttpError(error.response?.status ?? 0, error.response?.data ?? error.message, error.message);
84
+ }
85
+ throw error;
86
+ }
87
+ };
88
+ }
89
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/core/http-client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,8CAwDC;AAvED,+CAAmE;AACnE,6CAAyC;AAEzC,iDAAqD;AAErD,MAAM,MAAM,GAAG,sBAAa,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;AAE9E;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC/B,MAAyF;IAEzF,OAAO,KAAK,UAAU,WAAW,CAC/B,OAA+B;QAE/B,MAAM,WAAW,GAAuB;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;SAC3B,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC,WAAW,CAAC,CAAC;YAE1C,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,IAAI,sBAAS,CACjB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,IAAI,EACb,QAAQ,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAC1C,CAAC;YACJ,CAAC;YAED,MAAM,eAAe,GAA2B,EAAE,CAAC;YACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAEvD,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,sBAAS,EAAE,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,KAAK,YAAY,kBAAU,EAAE,CAAC;gBAChC,MAAM,IAAI,sBAAS,CACjB,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAC3B,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,EACrC,KAAK,CAAC,OAAO,CACd,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 导出 HttpContext 类型
3
+ */
4
+ export type { HttpContext } from './middleware';
5
+ //# sourceMappingURL=http-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-context.d.ts","sourceRoot":"","sources":["../../src/core/http-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=http-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-context.js","sourceRoot":"","sources":["../../src/core/http-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * HTTP 错误类
3
+ *
4
+ * 当 HTTP 请求返回 4xx 或 5xx 状态码时抛出此异常
5
+ *
6
+ * @param status - HTTP 状态码
7
+ * @param data - 响应数据
8
+ * @param message - 错误消息
9
+ */
10
+ export declare class HttpError extends Error {
11
+ readonly status: number;
12
+ readonly data: unknown;
13
+ constructor(status: number, data: unknown, message: string);
14
+ }
15
+ //# sourceMappingURL=http-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.d.ts","sourceRoot":"","sources":["../../src/core/http-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,KAAK;aAEhB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,OAAO;gBADb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EAC7B,OAAO,EAAE,MAAM;CAKlB"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpError = void 0;
4
+ /**
5
+ * HTTP 错误类
6
+ *
7
+ * 当 HTTP 请求返回 4xx 或 5xx 状态码时抛出此异常
8
+ *
9
+ * @param status - HTTP 状态码
10
+ * @param data - 响应数据
11
+ * @param message - 错误消息
12
+ */
13
+ class HttpError extends Error {
14
+ constructor(status, data, message) {
15
+ super(message);
16
+ this.status = status;
17
+ this.data = data;
18
+ this.name = 'HttpError';
19
+ }
20
+ }
21
+ exports.HttpError = HttpError;
22
+ //# sourceMappingURL=http-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.js","sourceRoot":"","sources":["../../src/core/http-error.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,MAAa,SAAU,SAAQ,KAAK;IAClC,YACkB,MAAc,EACd,IAAa,EAC7B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAS;QAI7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AATD,8BASC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * HTTP 方法类型定义
3
+ */
4
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
5
+ /**
6
+ * HTTP 方法元数据接口
7
+ *
8
+ * 存储方法装饰器标记的 HTTP 方法信息
9
+ *
10
+ * @param method - HTTP 方法类型
11
+ * @param path - 请求路径
12
+ */
13
+ export interface MethodMetadata {
14
+ method: HttpMethod;
15
+ path: string;
16
+ }
17
+ //# sourceMappingURL=method-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method-metadata.d.ts","sourceRoot":"","sources":["../../src/core/method-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=method-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method-metadata.js","sourceRoot":"","sources":["../../src/core/method-metadata.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Middleware, HttpContext } from './middleware';
2
+ export declare function executeMiddlewareChain(ctx: HttpContext, middlewares: Middleware[], finalHandler: () => Promise<void>): Promise<void>;
3
+ //# sourceMappingURL=middleware-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-chain.d.ts","sourceRoot":"","sources":["../../src/core/middleware-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,UAAU,EAAE,EACzB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeMiddlewareChain = executeMiddlewareChain;
4
+ async function executeMiddlewareChain(ctx, middlewares, finalHandler) {
5
+ let index = 0;
6
+ const next = async () => {
7
+ if (index >= middlewares.length) {
8
+ await finalHandler();
9
+ return;
10
+ }
11
+ const middleware = middlewares[index];
12
+ index++;
13
+ if (middleware) {
14
+ await middleware(ctx, next);
15
+ }
16
+ else {
17
+ await finalHandler();
18
+ }
19
+ };
20
+ await next();
21
+ }
22
+ //# sourceMappingURL=middleware-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-chain.js","sourceRoot":"","sources":["../../src/core/middleware-chain.ts"],"names":[],"mappings":";;AAEA,wDAsBC;AAtBM,KAAK,UAAU,sBAAsB,CAC1C,GAAgB,EAChB,WAAyB,EACzB,YAAiC;IAEjC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,EAAE,CAAC;AACf,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * HTTP 客户端配置接口
3
+ *
4
+ * 定义 HTTP 客户端的基础配置信息,包括服务端地址、中间件、超时设置等
5
+ *
6
+ * @param baseURL - 服务端基础地址
7
+ * @param middlewares - 中间件列表(可选),用于拦截请求/响应
8
+ * @param timeout - 请求超时时间(毫秒)
9
+ * @param headers - 默认请求头
10
+ */
11
+ export interface HttpClientConfig {
12
+ baseURL: string;
13
+ middlewares?: readonly Middleware[];
14
+ timeout?: number;
15
+ headers?: Readonly<Record<string, string>>;
16
+ }
17
+ /**
18
+ * 中间件类型定义
19
+ *
20
+ * 采用 Koa 风格洋葱模型,支持请求前后的拦截处理
21
+ *
22
+ * @param ctx - HTTP 上下文,包含请求、响应、状态和错误信息
23
+ * @param next - 调用下一个中间件的函数
24
+ * @throws 当中间件执行出错时
25
+ */
26
+ export type Middleware = (ctx: HttpContext, next: () => Promise<void>) => Promise<void>;
27
+ /**
28
+ * HTTP 上下文接口
29
+ *
30
+ * 在中间件链中传递的请求/响应上下文对象
31
+ *
32
+ * @param request - 请求信息
33
+ * @param response - 响应信息(可选),在请求完成后填充
34
+ * @param state - 中间件间共享的状态对象
35
+ * @param error - 错误信息(可选),当请求失败时填充
36
+ */
37
+ export interface HttpContext {
38
+ request: Readonly<{
39
+ method: string;
40
+ url: string;
41
+ headers: Readonly<Record<string, string>>;
42
+ body?: unknown;
43
+ }>;
44
+ response?: Readonly<{
45
+ status: number;
46
+ headers: Readonly<Record<string, string>>;
47
+ data: unknown;
48
+ }>;
49
+ state: Record<string, unknown>;
50
+ error?: Error;
51
+ }
52
+ /**
53
+ * 执行中间件链
54
+ *
55
+ * 按照洋葱模型顺序执行所有中间件,每个中间件在 next() 调用前后有特定的执行时机
56
+ *
57
+ * @param ctx - HTTP 上下文对象
58
+ * @param middlewares - 中间件列表
59
+ * @param finalHandler - 最终处理器(在所有中间件之后执行)
60
+ * @throws 当中间件执行出错时
61
+ */
62
+ export declare function executeMiddlewareChain(ctx: HttpContext, middlewares: readonly Middleware[], finalHandler: () => Promise<void>): Promise<void>;
63
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/core/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,QAAQ,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1C,IAAI,EAAE,OAAO,CAAC;KACf,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeMiddlewareChain = executeMiddlewareChain;
4
+ /**
5
+ * 执行中间件链
6
+ *
7
+ * 按照洋葱模型顺序执行所有中间件,每个中间件在 next() 调用前后有特定的执行时机
8
+ *
9
+ * @param ctx - HTTP 上下文对象
10
+ * @param middlewares - 中间件列表
11
+ * @param finalHandler - 最终处理器(在所有中间件之后执行)
12
+ * @throws 当中间件执行出错时
13
+ */
14
+ async function executeMiddlewareChain(ctx, middlewares, finalHandler) {
15
+ let currentIndex = 0;
16
+ const next = async () => {
17
+ if (currentIndex >= middlewares.length) {
18
+ await finalHandler();
19
+ return;
20
+ }
21
+ const currentMiddleware = middlewares[currentIndex];
22
+ currentIndex++;
23
+ if (currentMiddleware) {
24
+ await currentMiddleware(ctx, next);
25
+ }
26
+ else {
27
+ await finalHandler();
28
+ }
29
+ };
30
+ await next();
31
+ }
32
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/core/middleware.ts"],"names":[],"mappings":";;AAmEA,wDAsBC;AAhCD;;;;;;;;;GASG;AACI,KAAK,UAAU,sBAAsB,CAC1C,GAAgB,EAChB,WAAkC,EAClC,YAAiC;IAEjC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QACpD,YAAY,EAAE,CAAC;QACf,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,EAAE,CAAC;AACf,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 参数类型定义
3
+ */
4
+ export type ParamType = 'path' | 'query' | 'body' | 'header';
5
+ /**
6
+ * 参数元数据接口
7
+ *
8
+ * 存储参数装饰器标记的方法参数信息
9
+ *
10
+ * @param paramIndex - 参数在函数签名中的索引位置
11
+ * @param paramType - 参数类型(path/query/body/header)
12
+ * @param paramName - 参数名称(用于 path、query、header 类型)
13
+ */
14
+ export interface ParamMetadata {
15
+ paramIndex: number;
16
+ paramType: ParamType;
17
+ paramName?: string;
18
+ }
19
+ //# sourceMappingURL=param-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-metadata.d.ts","sourceRoot":"","sources":["../../src/core/param-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=param-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-metadata.js","sourceRoot":"","sources":["../../src/core/param-metadata.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { HttpClientConfig } from './http-client-config';
2
+ /**
3
+ * 创建代理实例
4
+ *
5
+ * 使用 ES Proxy 包装目标对象,拦截所有方法调用
6
+ *
7
+ * @param target - 目标实例
8
+ * @param config - HTTP 客户端配置
9
+ * @returns 代理包装后的实例
10
+ */
11
+ export declare function createProxyInstance<T extends object>(target: T, config: HttpClientConfig): T;
12
+ //# sourceMappingURL=proxy-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-factory.d.ts","sourceRoot":"","sources":["../../src/core/proxy-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,gBAAgB,GACvB,CAAC,CAUH"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProxyInstance = createProxyInstance;
4
+ const http_methods_1 = require("../decorators/http-methods");
5
+ const params_1 = require("../decorators/params");
6
+ const http_client_1 = require("./http-client");
7
+ const middleware_1 = require("./middleware");
8
+ /**
9
+ * 创建代理实例
10
+ *
11
+ * 使用 ES Proxy 包装目标对象,拦截所有方法调用
12
+ *
13
+ * @param target - 目标实例
14
+ * @param config - HTTP 客户端配置
15
+ * @returns 代理包装后的实例
16
+ */
17
+ function createProxyInstance(target, config) {
18
+ return new Proxy(target, {
19
+ get(_targetProxy, prop, receiver) {
20
+ const methodMeta = (0, http_methods_1.getMethodMetadata)(target, prop);
21
+ if (methodMeta) {
22
+ return createHttpMethod(target, prop, methodMeta, config);
23
+ }
24
+ return Reflect.get(target, prop, receiver);
25
+ },
26
+ });
27
+ }
28
+ /**
29
+ * 创建 HTTP 方法处理函数
30
+ *
31
+ * 包装方法调用,执行参数映射、中间件链和 HTTP 请求
32
+ *
33
+ * @param instanceTarget - 实例目标对象
34
+ * @param propertyKey - 方法属性名
35
+ * @param methodMeta - 方法元数据
36
+ * @param config - HTTP 客户端配置
37
+ * @returns 异步方法函数
38
+ */
39
+ function createHttpMethod(instanceTarget, propertyKey, methodMeta, config) {
40
+ return async function (...args) {
41
+ const paramMeta = (0, params_1.getParamMetadata)(instanceTarget, propertyKey);
42
+ const { url, body, headers } = buildRequestParts(paramMeta, args, methodMeta, config);
43
+ const middlewares = config.middlewares ?? [];
44
+ const httpClient = (0, http_client_1.createHttpRequest)(config);
45
+ const ctx = {
46
+ request: {
47
+ method: methodMeta.method,
48
+ url,
49
+ headers,
50
+ body,
51
+ },
52
+ state: {},
53
+ };
54
+ const handler = async () => {
55
+ const result = await httpClient(ctx.request);
56
+ ctx.response = result;
57
+ };
58
+ await (0, middleware_1.executeMiddlewareChain)(ctx, middlewares, handler);
59
+ return ctx.response?.data;
60
+ };
61
+ }
62
+ /**
63
+ * 构建请求组成部分
64
+ *
65
+ * 从参数元数据和方法参数中提取 URL、Body 和 Headers
66
+ *
67
+ * @param paramMeta - 参数元数据数组
68
+ * @param args - 方法实际参数
69
+ * @param methodMeta - 方法元数据
70
+ * @param config - HTTP 客户端配置
71
+ * @returns 请求的各部分数据
72
+ */
73
+ function buildRequestParts(paramMeta, args, methodMeta, config) {
74
+ let path = methodMeta.path;
75
+ const query = {};
76
+ let body;
77
+ const headers = { ...config.headers };
78
+ for (const param of paramMeta) {
79
+ const value = args[param.paramIndex];
80
+ switch (param.paramType) {
81
+ case 'path':
82
+ path = path.replace(`:${param.paramName}`, String(value));
83
+ break;
84
+ case 'query':
85
+ if (param.paramName && value !== undefined) {
86
+ query[param.paramName] = String(value);
87
+ }
88
+ break;
89
+ case 'body':
90
+ body = value;
91
+ break;
92
+ case 'header':
93
+ if (param.paramName && value !== undefined) {
94
+ headers[param.paramName] = String(value);
95
+ }
96
+ break;
97
+ }
98
+ }
99
+ const url = buildUrl(config.baseURL, path, query);
100
+ return { url, body, headers };
101
+ }
102
+ /**
103
+ * 构建完整 URL
104
+ *
105
+ * 拼接 baseURL、path 和 query 参数
106
+ *
107
+ * @param baseURL - 基础地址
108
+ * @param path - 请求路径
109
+ * @param query - 查询参数对象
110
+ * @returns 完整的 URL 字符串
111
+ */
112
+ function buildUrl(baseURL, path, query) {
113
+ const url = new URL(path, baseURL);
114
+ for (const [key, value] of Object.entries(query)) {
115
+ url.searchParams.set(key, value);
116
+ }
117
+ return url.toString();
118
+ }
119
+ //# sourceMappingURL=proxy-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-factory.js","sourceRoot":"","sources":["../../src/core/proxy-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import 'reflect-metadata';
2
+ import type { HttpClientConfig } from '../core/http-client-config';
3
+ /**
4
+ * HTTP 客户端类装饰器
5
+ *
6
+ * 标记一个类为 HTTP 客户端服务类,返回代理实例而非原实例
7
+ *
8
+ * @param config - HTTP 客户端配置
9
+ * @returns 类装饰器
10
+ */
11
+ export declare function HttpClient(config: HttpClientConfig): <T extends new (...args: unknown[]) => object>(Target: T) => T;
12
+ /**
13
+ * 获取类的 HTTP 客户端配置
14
+ *
15
+ * @param target - 目标类
16
+ * @returns HTTP 客户端配置(如果存在)
17
+ */
18
+ export declare function getHttpClientConfig(target: object): HttpClientConfig | undefined;
19
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/decorators/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,IAChC,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,EAC3D,QAAQ,CAAC,KACR,CAAC,CAeL;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GACb,gBAAgB,GAAG,SAAS,CAI9B"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpClient = HttpClient;
4
+ exports.getHttpClientConfig = getHttpClientConfig;
5
+ require("reflect-metadata");
6
+ const proxy_factory_1 = require("../core/proxy-factory");
7
+ const HTTP_CLIENT_CONFIG_KEY = Symbol.for('bics:http-client:config');
8
+ /**
9
+ * HTTP 客户端类装饰器
10
+ *
11
+ * 标记一个类为 HTTP 客户端服务类,返回代理实例而非原实例
12
+ *
13
+ * @param config - HTTP 客户端配置
14
+ * @returns 类装饰器
15
+ */
16
+ function HttpClient(config) {
17
+ return function (Target) {
18
+ Reflect.defineMetadata(HTTP_CLIENT_CONFIG_KEY, config, Target);
19
+ const DecoratedConstructor = function (...args) {
20
+ const instance = new Target(...args);
21
+ return (0, proxy_factory_1.createProxyInstance)(instance, config);
22
+ };
23
+ DecoratedConstructor.prototype = Target.prototype;
24
+ Object.setPrototypeOf(DecoratedConstructor, Target);
25
+ return DecoratedConstructor;
26
+ };
27
+ }
28
+ /**
29
+ * 获取类的 HTTP 客户端配置
30
+ *
31
+ * @param target - 目标类
32
+ * @returns HTTP 客户端配置(如果存在)
33
+ */
34
+ function getHttpClientConfig(target) {
35
+ return Reflect.getMetadata(HTTP_CLIENT_CONFIG_KEY, target);
36
+ }
37
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/decorators/http-client.ts"],"names":[],"mappings":";;AAcA,gCAkBC;AAQD,kDAMC;AA9CD,4BAA0B;AAE1B,yDAA4D;AAE5D,MAAM,sBAAsB,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,SAAgB,UAAU,CAAC,MAAwB;IACjD,OAAO,UACL,MAAS;QAET,OAAO,CAAC,cAAc,CAAC,sBAAsB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/D,MAAM,oBAAoB,GAAG,UAC3B,GAAG,IAAe;YAElB,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACrC,OAAO,IAAA,mCAAmB,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAiB,CAAC;QAElB,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAEpD,OAAO,oBAAoB,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CACjC,MAAc;IAEd,OAAO,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE,MAAM,CAE5C,CAAC;AAChB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import 'reflect-metadata';
2
+ import type { MethodMetadata } from '../core/method-metadata';
3
+ /**
4
+ * GET 请求装饰器
5
+ */
6
+ export declare const Get: (path: string) => (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => void;
7
+ /**
8
+ * POST 请求装饰器
9
+ */
10
+ export declare const Post: (path: string) => (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => void;
11
+ /**
12
+ * PUT 请求装饰器
13
+ */
14
+ export declare const Put: (path: string) => (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => void;
15
+ /**
16
+ * DELETE 请求装饰器
17
+ */
18
+ export declare const Delete: (path: string) => (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => void;
19
+ /**
20
+ * PATCH 请求装饰器
21
+ */
22
+ export declare const Patch: (path: string) => (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => void;
23
+ /**
24
+ * 获取方法的 HTTP 元数据
25
+ *
26
+ * @param target - 目标对象
27
+ * @param propertyKey - 方法属性名
28
+ * @returns 方法元数据(如果存在)
29
+ */
30
+ export declare function getMethodMetadata(target: object, propertyKey: string | symbol): MethodMetadata | undefined;
31
+ //# sourceMappingURL=http-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-methods.d.ts","sourceRoot":"","sources":["../../src/decorators/http-methods.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAwB1E;;GAEG;AACH,eAAO,MAAM,GAAG,SAhBS,MAAM,MAEzB,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAE5B,aAAa,kBAAkB,KAC9B,IAUwC,CAAC;AAChD;;GAEG;AACH,eAAO,MAAM,IAAI,SApBQ,MAAM,MAEzB,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAE5B,aAAa,kBAAkB,KAC9B,IAc0C,CAAC;AAClD;;GAEG;AACH,eAAO,MAAM,GAAG,SAxBS,MAAM,MAEzB,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAE5B,aAAa,kBAAkB,KAC9B,IAkBwC,CAAC;AAChD;;GAEG;AACH,eAAO,MAAM,MAAM,SA5BM,MAAM,MAEzB,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAE5B,aAAa,kBAAkB,KAC9B,IAsB8C,CAAC;AACtD;;GAEG;AACH,eAAO,MAAM,KAAK,SAhCO,MAAM,MAEzB,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAE5B,aAAa,kBAAkB,KAC9B,IA0B4C,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,GAC3B,cAAc,GAAG,SAAS,CAI5B"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = void 0;
4
+ exports.getMethodMetadata = getMethodMetadata;
5
+ require("reflect-metadata");
6
+ const METHOD_METADATA_KEY = Symbol.for('bics:http-client:method');
7
+ /**
8
+ * 创建 HTTP 方法装饰器
9
+ *
10
+ * @param method - HTTP 方法类型
11
+ * @returns 方法装饰器工厂函数
12
+ */
13
+ function createMethodDecorator(method) {
14
+ return function (path) {
15
+ return function (target, propertyKey,
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ _descriptor) {
18
+ const metadata = { method, path };
19
+ Reflect.defineMetadata(METHOD_METADATA_KEY, metadata, target, propertyKey);
20
+ };
21
+ };
22
+ }
23
+ /**
24
+ * GET 请求装饰器
25
+ */
26
+ exports.Get = createMethodDecorator('GET');
27
+ /**
28
+ * POST 请求装饰器
29
+ */
30
+ exports.Post = createMethodDecorator('POST');
31
+ /**
32
+ * PUT 请求装饰器
33
+ */
34
+ exports.Put = createMethodDecorator('PUT');
35
+ /**
36
+ * DELETE 请求装饰器
37
+ */
38
+ exports.Delete = createMethodDecorator('DELETE');
39
+ /**
40
+ * PATCH 请求装饰器
41
+ */
42
+ exports.Patch = createMethodDecorator('PATCH');
43
+ /**
44
+ * 获取方法的 HTTP 元数据
45
+ *
46
+ * @param target - 目标对象
47
+ * @param propertyKey - 方法属性名
48
+ * @returns 方法元数据(如果存在)
49
+ */
50
+ function getMethodMetadata(target, propertyKey) {
51
+ return Reflect.getMetadata(METHOD_METADATA_KEY, target, propertyKey);
52
+ }
53
+ //# sourceMappingURL=http-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-methods.js","sourceRoot":"","sources":["../../src/decorators/http-methods.ts"],"names":[],"mappings":";;;AAqDA,8CAOC;AA5DD,4BAA0B;AAG1B,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAElE;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,MAAkB;IAC/C,OAAO,UAAU,IAAY;QAC3B,OAAO,UACL,MAAc,EACd,WAA4B;QAC5B,6DAA6D;QAC7D,WAA+B;YAE/B,MAAM,QAAQ,GAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAClD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7E,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACU,QAAA,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAChD;;GAEG;AACU,QAAA,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAClD;;GAEG;AACU,QAAA,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAChD;;GAEG;AACU,QAAA,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACtD;;GAEG;AACU,QAAA,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,MAAc,EACd,WAA4B;IAE5B,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,EAAE,WAAW,CAEtD,CAAC;AAChB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import 'reflect-metadata';
2
+ import type { ParamMetadata } from '../core/param-metadata';
3
+ /**
4
+ * URL 路径参数装饰器
5
+ *
6
+ * @param paramName - 参数名称
7
+ */
8
+ export declare const Path: (paramName: string) => (target: object, propertyKey: string | symbol, parameterIndex: number) => void;
9
+ /**
10
+ * URL 查询参数装饰器
11
+ *
12
+ * @param paramName - 参数名称
13
+ */
14
+ export declare const Query: (paramName: string) => (target: object, propertyKey: string | symbol, parameterIndex: number) => void;
15
+ /**
16
+ * 请求体参数装饰器
17
+ */
18
+ export declare const Body: () => (target: object, propertyKey: string | symbol, parameterIndex: number) => void;
19
+ /**
20
+ * 请求头参数装饰器
21
+ *
22
+ * @param paramName - 参数名称
23
+ */
24
+ export declare const Header: (paramName: string) => (target: object, propertyKey: string | symbol, parameterIndex: number) => void;
25
+ /**
26
+ * 获取方法的参数元数据列表
27
+ *
28
+ * @param target - 目标对象
29
+ * @param propertyKey - 方法属性名
30
+ * @returns 参数元数据数组
31
+ */
32
+ export declare function getParamMetadata(target: object, propertyKey: string | symbol): ParamMetadata[];
33
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/decorators/params.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,wBAAwB,CAAC;AA+BvE;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,WAAW,MAAM,cAvB1B,MAAM,eACD,MAAM,GAAG,MAAM,kBACZ,MAAM,KACrB,IAoB6E,CAAC;AACnF;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,WAAW,MAAM,cA7B3B,MAAM,eACD,MAAM,GAAG,MAAM,kBACZ,MAAM,KACrB,IA2BqC,CAAC;AAC3C;;GAEG;AACH,eAAO,MAAM,IAAI,iBAlCL,MAAM,eACD,MAAM,GAAG,MAAM,kBACZ,MAAM,KACrB,IA+BiD,CAAC;AACvD;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,WAAW,MAAM,cAxC5B,MAAM,eACD,MAAM,GAAG,MAAM,kBACZ,MAAM,KACrB,IAsCsC,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,GAC3B,aAAa,EAAE,CAKjB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Header = exports.Body = exports.Query = exports.Path = void 0;
4
+ exports.getParamMetadata = getParamMetadata;
5
+ require("reflect-metadata");
6
+ const PARAM_METADATA_KEY = Symbol.for('bics:http-client:param');
7
+ /**
8
+ * 创建参数装饰器
9
+ *
10
+ * @param paramType - 参数类型
11
+ * @param paramName - 参数名称(可选)
12
+ * @returns 参数装饰器工厂函数
13
+ */
14
+ function createParamDecorator(paramType, paramName) {
15
+ return function (target, propertyKey, parameterIndex) {
16
+ const existing = Reflect.getMetadata(PARAM_METADATA_KEY, target, propertyKey) || [];
17
+ const metadata = {
18
+ paramIndex: parameterIndex,
19
+ paramType,
20
+ paramName,
21
+ };
22
+ existing.push(metadata);
23
+ Reflect.defineMetadata(PARAM_METADATA_KEY, existing, target, propertyKey);
24
+ };
25
+ }
26
+ /**
27
+ * URL 路径参数装饰器
28
+ *
29
+ * @param paramName - 参数名称
30
+ */
31
+ const Path = (paramName) => createParamDecorator('path', paramName);
32
+ exports.Path = Path;
33
+ /**
34
+ * URL 查询参数装饰器
35
+ *
36
+ * @param paramName - 参数名称
37
+ */
38
+ const Query = (paramName) => createParamDecorator('query', paramName);
39
+ exports.Query = Query;
40
+ /**
41
+ * 请求体参数装饰器
42
+ */
43
+ const Body = () => createParamDecorator('body');
44
+ exports.Body = Body;
45
+ /**
46
+ * 请求头参数装饰器
47
+ *
48
+ * @param paramName - 参数名称
49
+ */
50
+ const Header = (paramName) => createParamDecorator('header', paramName);
51
+ exports.Header = Header;
52
+ /**
53
+ * 获取方法的参数元数据列表
54
+ *
55
+ * @param target - 目标对象
56
+ * @param propertyKey - 方法属性名
57
+ * @returns 参数元数据数组
58
+ */
59
+ function getParamMetadata(target, propertyKey) {
60
+ return (Reflect.getMetadata(PARAM_METADATA_KEY, target, propertyKey) ||
61
+ []);
62
+ }
63
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/decorators/params.ts"],"names":[],"mappings":";;;AAgEA,4CAQC;AAxED,4BAA0B;AAG1B,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,SAAoB,EAAE,SAAkB;IACpE,OAAO,UACL,MAAc,EACd,WAA4B,EAC5B,cAAsB;QAEtB,MAAM,QAAQ,GACZ,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAErE,MAAM,QAAQ,GAAkB;YAC9B,UAAU,EAAE,cAAc;YAC1B,SAAS;YACT,SAAS;SACV,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACI,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAtE,QAAA,IAAI,QAAkE;AACnF;;;;GAIG;AACI,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE,CACzC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAD9B,QAAA,KAAK,SACyB;AAC3C;;GAEG;AACI,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAA1C,QAAA,IAAI,QAAsC;AACvD;;;;GAIG;AACI,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAE,EAAE,CAC1C,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAD/B,QAAA,MAAM,UACyB;AAE5C;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,MAAc,EACd,WAA4B;IAE5B,OAAO,CACJ,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,EAAE,WAAW,CAAqB;QACjF,EAAE,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @jintianxiayu/http-client-decorator - 基于装饰器的 HTTP 客户端框架
3
+ *
4
+ * 提供 RPC-like 调用体验的 HTTP 客户端框架,支持:
5
+ * - 装饰器声明式 HTTP 方法定义
6
+ * - Koa 风格洋葱模型中间件
7
+ * - 自动错误处理
8
+ */
9
+ export { HttpClient, getHttpClientConfig } from './decorators/http-client';
10
+ export { Get, Post, Put, Delete, Patch, getMethodMetadata, } from './decorators/http-methods';
11
+ export { Path, Query, Body, Header, getParamMetadata, } from './decorators/params';
12
+ export type { HttpClientConfig } from './core/http-client-config';
13
+ export type { HttpContext } from './core/middleware';
14
+ export type { Middleware } from './core/middleware';
15
+ export type { MethodMetadata, HttpMethod } from './core/method-metadata';
16
+ export type { ParamMetadata, ParamType } from './core/param-metadata';
17
+ export { HttpError } from './core/http-error';
18
+ export { executeMiddlewareChain } from './core/middleware';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EACL,GAAG,EACH,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,MAAM,EACN,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * @jintianxiayu/http-client-decorator - 基于装饰器的 HTTP 客户端框架
4
+ *
5
+ * 提供 RPC-like 调用体验的 HTTP 客户端框架,支持:
6
+ * - 装饰器声明式 HTTP 方法定义
7
+ * - Koa 风格洋葱模型中间件
8
+ * - 自动错误处理
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.executeMiddlewareChain = exports.HttpError = exports.getParamMetadata = exports.Header = exports.Body = exports.Query = exports.Path = exports.getMethodMetadata = exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = exports.getHttpClientConfig = exports.HttpClient = void 0;
12
+ // 类装饰器
13
+ var http_client_1 = require("./decorators/http-client");
14
+ Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_1.HttpClient; } });
15
+ Object.defineProperty(exports, "getHttpClientConfig", { enumerable: true, get: function () { return http_client_1.getHttpClientConfig; } });
16
+ // 方法装饰器
17
+ var http_methods_1 = require("./decorators/http-methods");
18
+ Object.defineProperty(exports, "Get", { enumerable: true, get: function () { return http_methods_1.Get; } });
19
+ Object.defineProperty(exports, "Post", { enumerable: true, get: function () { return http_methods_1.Post; } });
20
+ Object.defineProperty(exports, "Put", { enumerable: true, get: function () { return http_methods_1.Put; } });
21
+ Object.defineProperty(exports, "Delete", { enumerable: true, get: function () { return http_methods_1.Delete; } });
22
+ Object.defineProperty(exports, "Patch", { enumerable: true, get: function () { return http_methods_1.Patch; } });
23
+ Object.defineProperty(exports, "getMethodMetadata", { enumerable: true, get: function () { return http_methods_1.getMethodMetadata; } });
24
+ // 参数装饰器
25
+ var params_1 = require("./decorators/params");
26
+ Object.defineProperty(exports, "Path", { enumerable: true, get: function () { return params_1.Path; } });
27
+ Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return params_1.Query; } });
28
+ Object.defineProperty(exports, "Body", { enumerable: true, get: function () { return params_1.Body; } });
29
+ Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return params_1.Header; } });
30
+ Object.defineProperty(exports, "getParamMetadata", { enumerable: true, get: function () { return params_1.getParamMetadata; } });
31
+ // 错误类
32
+ var http_error_1 = require("./core/http-error");
33
+ Object.defineProperty(exports, "HttpError", { enumerable: true, get: function () { return http_error_1.HttpError; } });
34
+ // 中间件链
35
+ var middleware_1 = require("./core/middleware");
36
+ Object.defineProperty(exports, "executeMiddlewareChain", { enumerable: true, get: function () { return middleware_1.executeMiddlewareChain; } });
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,OAAO;AACP,wDAA2E;AAAlE,yGAAA,UAAU,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAExC,QAAQ;AACR,0DAOmC;AANjC,mGAAA,GAAG,OAAA;AACH,oGAAA,IAAI,OAAA;AACJ,mGAAA,GAAG,OAAA;AACH,sGAAA,MAAM,OAAA;AACN,qGAAA,KAAK,OAAA;AACL,iHAAA,iBAAiB,OAAA;AAGnB,QAAQ;AACR,8CAM6B;AAL3B,8FAAA,IAAI,OAAA;AACJ,+FAAA,KAAK,OAAA;AACL,8FAAA,IAAI,OAAA;AACJ,gGAAA,MAAM,OAAA;AACN,0GAAA,gBAAgB,OAAA;AAUlB,MAAM;AACN,gDAA8C;AAArC,uGAAA,SAAS,OAAA;AAElB,OAAO;AACP,gDAA2D;AAAlD,oHAAA,sBAAsB,OAAA"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@jintianxiayu/http-client-decorator",
3
+ "version": "0.1.2",
4
+ "description": "Decorator-based HTTP client framework providing RPC-like calling experience",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "jest",
10
+ "lint": "eslint src --ext .ts",
11
+ "clean": "rm -rf dist"
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "dependencies": {
17
+ "axios": "^1.7.9",
18
+ "reflect-metadata": "^0.2.2"
19
+ },
20
+ "peerDependencies": {
21
+ "@jintianxiayu/logger": "*"
22
+ },
23
+ "devDependencies": {
24
+ "@jintianxiayu/logger": "^0.1.2",
25
+ "axios-mock-adapter": "^2.1.0",
26
+ "ts-jest": "^29.2.5"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "gitHead": "357e736abbe6b25a707663c1b9e027b2e8b532a6"
32
+ }