@ahoo-wang/fetcher-decorator 0.9.5 → 0.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/README.zh-CN.md +45 -0
- package/dist/apiDecorator.d.ts +5 -3
- package/dist/apiDecorator.d.ts.map +1 -1
- package/dist/endpointDecorator.d.ts +2 -1
- package/dist/endpointDecorator.d.ts.map +1 -1
- package/dist/fetcherCapable.d.ts +21 -0
- package/dist/fetcherCapable.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +360 -346
- package/dist/index.umd.js +2 -2
- package/dist/requestExecutor.d.ts +5 -2
- package/dist/requestExecutor.d.ts.map +1 -1
- package/dist/resultExtractor.d.ts +89 -0
- package/dist/resultExtractor.d.ts.map +1 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -284,6 +284,51 @@ class UserService {
|
|
|
284
284
|
}
|
|
285
285
|
```
|
|
286
286
|
|
|
287
|
+
### Result Extractors
|
|
288
|
+
|
|
289
|
+
Result extractors are used to process and extract data from different types of responses or results in the application.
|
|
290
|
+
They allow you to customize how the response from an HTTP request is processed and returned.
|
|
291
|
+
|
|
292
|
+
#### Available Result Extractors
|
|
293
|
+
|
|
294
|
+
- **ExchangeResultExtractor**: Returns the original FetchExchange object
|
|
295
|
+
- **ResponseResultExtractor**: Returns the response object from FetchExchange (default)
|
|
296
|
+
- **JsonResultExtractor**: Parses the response content as JSON format
|
|
297
|
+
- **TextResultExtractor**: Parses the response content as text format
|
|
298
|
+
- **ServerSentEventStreamResultExtractor**: Extracts server-sent event stream from FetchExchange
|
|
299
|
+
- **CommandResultEventStreamResultExtractor**: Extracts command result event stream from FetchExchange
|
|
300
|
+
|
|
301
|
+
#### Using Result Extractors
|
|
302
|
+
|
|
303
|
+
You can specify a result extractor at the class level or method level:
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
import { ResultExtractors } from '@ahoo-wang/fetcher-decorator';
|
|
307
|
+
|
|
308
|
+
@api('/users', { resultExtractor: ResultExtractors.Json })
|
|
309
|
+
class UserService {
|
|
310
|
+
// Uses class-level JSON result extractor
|
|
311
|
+
@get('/{id}')
|
|
312
|
+
getUser(@path() id: number): Promise<User> {
|
|
313
|
+
throw new Error('Implementation will be generated automatically.');
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Overrides with ServerSentEventStream result extractor
|
|
317
|
+
@get('/events', { resultExtractor: ResultExtractors.ServerSentEventStream })
|
|
318
|
+
getUserEvents(): Promise<ServerSentEventStream> {
|
|
319
|
+
throw new Error('Implementation will be generated automatically.');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Uses CommandResultEventStream result extractor for command handling
|
|
323
|
+
@post('/commands', {
|
|
324
|
+
resultExtractor: ResultExtractors.CommandResultEventStream,
|
|
325
|
+
})
|
|
326
|
+
executeCommand(@body() command: Command): Promise<CommandResultEventStream> {
|
|
327
|
+
throw new Error('Implementation will be generated automatically.');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
287
332
|
## 🧪 Testing
|
|
288
333
|
|
|
289
334
|
```bash
|
package/README.zh-CN.md
CHANGED
|
@@ -277,6 +277,51 @@ class UserService {
|
|
|
277
277
|
}
|
|
278
278
|
```
|
|
279
279
|
|
|
280
|
+
### 结果提取器
|
|
281
|
+
|
|
282
|
+
结果提取器用于处理和提取应用程序中不同类型响应或结果的数据。
|
|
283
|
+
它们允许您自定义如何处理和返回 HTTP 请求的响应。
|
|
284
|
+
|
|
285
|
+
#### 可用的结果提取器
|
|
286
|
+
|
|
287
|
+
- **ExchangeResultExtractor**: 返回原始的 FetchExchange 对象
|
|
288
|
+
- **ResponseResultExtractor**: 返回 FetchExchange 中的响应对象(默认)
|
|
289
|
+
- **JsonResultExtractor**: 将响应内容解析为 JSON 格式
|
|
290
|
+
- **TextResultExtractor**: 将响应内容解析为文本格式
|
|
291
|
+
- **ServerSentEventStreamResultExtractor**: 从 FetchExchange 中提取服务器发送事件流
|
|
292
|
+
- **CommandResultEventStreamResultExtractor**: 从 FetchExchange 中提取命令结果事件流
|
|
293
|
+
|
|
294
|
+
#### 使用结果提取器
|
|
295
|
+
|
|
296
|
+
您可以在类级别或方法级别指定结果提取器:
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
import { ResultExtractors } from '@ahoo-wang/fetcher-decorator';
|
|
300
|
+
|
|
301
|
+
@api('/users', { resultExtractor: ResultExtractors.Json })
|
|
302
|
+
class UserService {
|
|
303
|
+
// 使用类级别的 JSON 结果提取器
|
|
304
|
+
@get('/{id}')
|
|
305
|
+
getUser(@path() id: number): Promise<User> {
|
|
306
|
+
throw new Error('实现将自动生成');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// 使用 ServerSentEventStream 结果提取器覆盖
|
|
310
|
+
@get('/events', { resultExtractor: ResultExtractors.ServerSentEventStream })
|
|
311
|
+
getUserEvents(): Promise<ServerSentEventStream> {
|
|
312
|
+
throw new Error('实现将自动生成');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// 使用 CommandResultEventStream 结果提取器处理命令
|
|
316
|
+
@post('/commands', {
|
|
317
|
+
resultExtractor: ResultExtractors.CommandResultEventStream,
|
|
318
|
+
})
|
|
319
|
+
executeCommand(@body() command: Command): Promise<CommandResultEventStream> {
|
|
320
|
+
throw new Error('实现将自动生成');
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
280
325
|
## 🧪 测试
|
|
281
326
|
|
|
282
327
|
```bash
|
package/dist/apiDecorator.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { RequestHeaders, RequestHeadersCapable, TimeoutCapable } from '@ahoo-wang/fetcher';
|
|
1
|
+
import { Fetcher, RequestHeaders, RequestHeadersCapable, TimeoutCapable } from '@ahoo-wang/fetcher';
|
|
2
|
+
import { ResultExtractorCapable } from './resultExtractor';
|
|
3
|
+
import { FetcherCapable } from './fetcherCapable';
|
|
2
4
|
/**
|
|
3
5
|
* Metadata for class-level API configuration.
|
|
4
6
|
*
|
|
@@ -6,7 +8,7 @@ import { RequestHeaders, RequestHeadersCapable, TimeoutCapable } from '@ahoo-wan
|
|
|
6
8
|
* These settings will be used as defaults for all endpoints within the class unless overridden
|
|
7
9
|
* at the method level.
|
|
8
10
|
*/
|
|
9
|
-
export interface ApiMetadata extends TimeoutCapable, RequestHeadersCapable {
|
|
11
|
+
export interface ApiMetadata extends TimeoutCapable, RequestHeadersCapable, ResultExtractorCapable, FetcherCapable {
|
|
10
12
|
/**
|
|
11
13
|
* Base path for all endpoints in the class.
|
|
12
14
|
*
|
|
@@ -35,7 +37,7 @@ export interface ApiMetadata extends TimeoutCapable, RequestHeadersCapable {
|
|
|
35
37
|
* This allows you to specify which fetcher instance should be used for requests
|
|
36
38
|
* from this API class. The fetcher must be registered with the FetcherRegistrar.
|
|
37
39
|
*/
|
|
38
|
-
fetcher?: string;
|
|
40
|
+
fetcher?: string | Fetcher;
|
|
39
41
|
}
|
|
40
42
|
export declare const API_METADATA_KEY: unique symbol;
|
|
41
43
|
export declare function api(basePath?: string, metadata?: Omit<ApiMetadata, 'basePath'>): <T extends new (...args: any[]) => any>(constructor: T) => T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiDecorator.d.ts","sourceRoot":"","sources":["../src/apiDecorator.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"apiDecorator.d.ts","sourceRoot":"","sources":["../src/apiDecorator.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,cAAc;IAChH;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,gBAAgB,eAAyB,CAAC;AAwDvD,wBAAgB,GAAG,CACjB,QAAQ,GAAE,MAAW,EACrB,QAAQ,GAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAM,IAE3B,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,aAAa,CAAC,KAAG,CAAC,CAgB3E"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { HttpMethod } from '@ahoo-wang/fetcher';
|
|
2
2
|
import { ApiMetadata } from './apiDecorator';
|
|
3
|
+
import { ResultExtractorCapable } from './resultExtractor';
|
|
3
4
|
/**
|
|
4
5
|
* Metadata for HTTP endpoints.
|
|
5
6
|
*
|
|
6
7
|
* Defines the configuration options for individual HTTP endpoints (methods).
|
|
7
8
|
* These settings will override any corresponding class-level settings from ApiMetadata.
|
|
8
9
|
*/
|
|
9
|
-
export interface EndpointMetadata extends ApiMetadata {
|
|
10
|
+
export interface EndpointMetadata extends ApiMetadata, ResultExtractorCapable {
|
|
10
11
|
/**
|
|
11
12
|
* HTTP method for the endpoint.
|
|
12
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpointDecorator.d.ts","sourceRoot":"","sources":["../src/endpointDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"endpointDecorator.d.ts","sourceRoot":"","sources":["../src/endpointDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,WAAW,EAAE,sBAAsB;IAC3E;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IAEnB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,eAA8B,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE,MAAW,EACjB,QAAQ,GAAE,sBAA2B,IAErB,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAG,MAAM,KAAG,IAAI,CAcpE;AAED,wBAAgB,GAAG,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,sBAA2B,YAhBlD,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CAkBpE;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,sBAA2B,YApBnD,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CAsBpE;AAED,wBAAgB,GAAG,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,sBAA2B,YAxBlD,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CA0BpE;AAED,wBAAgB,GAAG,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,sBAA2B,YA5BlD,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CA8BpE;AAED,wBAAgB,KAAK,CACnB,IAAI,GAAE,MAAW,EACjB,QAAQ,GAAE,sBAA2B,YAlCb,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CAqCpE;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,sBAA2B,YAvCnD,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CAyCpE;AAED,wBAAgB,OAAO,CACrB,IAAI,GAAE,MAAW,EACjB,QAAQ,GAAE,sBAA2B,YA7Cb,MAAM,eAAe,MAAM,GAAG,MAAM,KAAG,IAAI,CAgDpE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Fetcher } from '@ahoo-wang/fetcher';
|
|
2
|
+
/**
|
|
3
|
+
* Interface that defines a capability for objects that can have a fetcher.
|
|
4
|
+
* This interface is typically used to mark components or objects that can perform fetching operations
|
|
5
|
+
* and may need access to fetcher functionality.
|
|
6
|
+
*/
|
|
7
|
+
export interface FetcherCapable {
|
|
8
|
+
/**
|
|
9
|
+
* Optional fetcher property that can be either a string identifier or a Fetcher instance.
|
|
10
|
+
* When present, this property indicates the fetcher associated with the implementing object.
|
|
11
|
+
*/
|
|
12
|
+
fetcher?: string | Fetcher;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Gets a Fetcher instance based on the provided fetcher parameter.
|
|
16
|
+
*
|
|
17
|
+
* @param fetcher - A string identifier or Fetcher instance to resolve
|
|
18
|
+
* @returns A Fetcher instance if found, undefined otherwise
|
|
19
|
+
*/
|
|
20
|
+
export declare function getFetcher(fetcher?: string | Fetcher): Fetcher | undefined;
|
|
21
|
+
//# sourceMappingURL=fetcherCapable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcherCapable.d.ts","sourceRoot":"","sources":["../src/fetcherCapable.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAoB,MAAM,oBAAoB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAS1E"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|