@backendkit-labs/http-client 0.1.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/README.md +328 -0
- package/dist/chunk-5RHNUUOY.js +245 -0
- package/dist/chunk-5RHNUUOY.js.map +1 -0
- package/dist/chunk-GZWQJKYR.cjs +253 -0
- package/dist/chunk-GZWQJKYR.cjs.map +1 -0
- package/dist/index.cjs +29 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +44 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/nestjs/index.cjs +78 -0
- package/dist/nestjs/index.cjs.map +1 -0
- package/dist/nestjs/index.d.cts +32 -0
- package/dist/nestjs/index.d.ts +32 -0
- package/dist/nestjs/index.js +76 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/types-x0zPV-KD.d.cts +71 -0
- package/dist/types-x0zPV-KD.d.ts +71 -0
- package/package.json +79 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { __decorateClass, HttpClient } from '../chunk-5RHNUUOY.js';
|
|
2
|
+
import { Module, Inject } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
var HTTP_CLIENT_MODULE_OPTIONS = "HTTP_CLIENT_MODULE_OPTIONS";
|
|
5
|
+
var HttpClientModule = class {
|
|
6
|
+
static forRoot(options) {
|
|
7
|
+
const providers = options.clients.map(
|
|
8
|
+
({ token, config }) => HttpClientModule._clientProvider(token, config)
|
|
9
|
+
);
|
|
10
|
+
return {
|
|
11
|
+
module: HttpClientModule,
|
|
12
|
+
providers,
|
|
13
|
+
exports: providers,
|
|
14
|
+
global: true
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
static forRootAsync(options) {
|
|
18
|
+
const asyncProvider = HttpClientModule._asyncOptionsProvider(options);
|
|
19
|
+
const clientsProvider = {
|
|
20
|
+
provide: "HTTP_CLIENT_INSTANCES",
|
|
21
|
+
useFactory: (opts) => {
|
|
22
|
+
return opts.clients.map(({ token, config }) => ({
|
|
23
|
+
token,
|
|
24
|
+
instance: new HttpClient(config)
|
|
25
|
+
}));
|
|
26
|
+
},
|
|
27
|
+
inject: [HTTP_CLIENT_MODULE_OPTIONS]
|
|
28
|
+
};
|
|
29
|
+
const allProviders = [
|
|
30
|
+
asyncProvider,
|
|
31
|
+
clientsProvider
|
|
32
|
+
];
|
|
33
|
+
return {
|
|
34
|
+
module: HttpClientModule,
|
|
35
|
+
imports: options.imports ?? [],
|
|
36
|
+
providers: allProviders,
|
|
37
|
+
exports: allProviders,
|
|
38
|
+
global: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
static _clientProvider(token, config) {
|
|
42
|
+
return {
|
|
43
|
+
provide: token.symbol,
|
|
44
|
+
useFactory: () => new HttpClient(config)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
static _asyncOptionsProvider(options) {
|
|
48
|
+
if (options.useFactory) {
|
|
49
|
+
return {
|
|
50
|
+
provide: HTTP_CLIENT_MODULE_OPTIONS,
|
|
51
|
+
useFactory: options.useFactory,
|
|
52
|
+
inject: options.inject ?? []
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const cls = options.useExisting ?? options.useClass;
|
|
56
|
+
if (cls) {
|
|
57
|
+
return {
|
|
58
|
+
provide: HTTP_CLIENT_MODULE_OPTIONS,
|
|
59
|
+
useFactory: (factory) => factory.createHttpClientOptions(),
|
|
60
|
+
inject: [cls]
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
provide: HTTP_CLIENT_MODULE_OPTIONS,
|
|
65
|
+
useValue: { clients: [] }
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
HttpClientModule = __decorateClass([
|
|
70
|
+
Module({})
|
|
71
|
+
], HttpClientModule);
|
|
72
|
+
var InjectHttpClient = (token) => Inject(token.symbol);
|
|
73
|
+
|
|
74
|
+
export { HttpClientModule, InjectHttpClient };
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/nestjs/http-client.module.ts","../../src/nestjs/http-client.decorator.ts"],"names":[],"mappings":";;;AAUA,IAAM,0BAAA,GAA6B,4BAAA;AAG5B,IAAM,mBAAN,MAAuB;AAAA,EAC5B,OAAO,QAAQ,OAAA,EAAiD;AAC9D,IAAA,MAAM,SAAA,GAAwB,QAAQ,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,EAAE,KAAA,EAAO,MAAA,OAC1D,gBAAA,CAAiB,eAAA,CAAgB,OAAO,MAAM;AAAA,KAChD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAU,gBAAA;AAAA,MACV,SAAA;AAAA,MACA,OAAA,EAAU,SAAA;AAAA,MACV,MAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,OAAO,aAAa,OAAA,EAAsD;AACxE,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,qBAAA,CAAsB,OAAO,CAAA;AAEpE,IAAA,MAAM,eAAA,GAA4B;AAAA,MAChC,OAAA,EAAY,uBAAA;AAAA,MACZ,UAAA,EAAY,CAAC,IAAA,KAAkC;AAC7C,QAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,QAAO,MAAO;AAAA,UAC9C,KAAA;AAAA,UACA,QAAA,EAAU,IAAI,UAAA,CAAW,MAAM;AAAA,SACjC,CAAE,CAAA;AAAA,MACJ,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,0BAA0B;AAAA,KACrC;AAEA,IAAA,MAAM,YAAA,GAA2B;AAAA,MAC/B,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAU,gBAAA;AAAA,MACV,OAAA,EAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,MAC9B,SAAA,EAAW,YAAA;AAAA,MACX,OAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,OAAe,eAAA,CAAgB,KAAA,EAAwB,MAAA,EAAoC;AACzF,IAAA,OAAO;AAAA,MACL,SAAY,KAAA,CAAM,MAAA;AAAA,MAClB,UAAA,EAAY,MAAM,IAAI,UAAA,CAAW,MAAM;AAAA,KACzC;AAAA,EACF;AAAA,EAEA,OAAe,sBAAsB,OAAA,EAAiD;AACpF,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAO;AAAA,QACL,OAAA,EAAY,0BAAA;AAAA,QACZ,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,MAAA,EAAa,OAAA,CAAQ,MAAA,IAAU;AAAC,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,QAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAY,0BAAA;AAAA,QACZ,UAAA,EAAY,CAAC,OAAA,KAAsC,OAAA,CAAQ,uBAAA,EAAwB;AAAA,QACnF,MAAA,EAAY,CAAC,GAAqC;AAAA,OACpD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAU,0BAAA;AAAA,MACV,QAAA,EAAU,EAAE,OAAA,EAAS,EAAC;AAAE,KAC1B;AAAA,EACF;AACF;AAxEa,gBAAA,GAAN,eAAA,CAAA;AAAA,EADN,MAAA,CAAO,EAAE;AAAA,CAAA,EACG,gBAAA,CAAA;ACVN,IAAM,gBAAA,GAAmB,CAC9B,KAAA,KAC8B,MAAA,CAAO,MAAM,MAAM","file":"index.js","sourcesContent":["import { Module, DynamicModule, Provider } from '@nestjs/common';\nimport type { Type, InjectionToken, OptionalFactoryDependency } from '@nestjs/common';\nimport { HttpClient } from '../core/http-client.js';\nimport type { HttpClientConfig, HttpClientToken } from '../core/types.js';\nimport type {\n HttpClientModuleOptions,\n HttpClientModuleAsyncOptions,\n HttpClientOptionsFactory,\n} from './http-client.options.js';\n\nconst HTTP_CLIENT_MODULE_OPTIONS = 'HTTP_CLIENT_MODULE_OPTIONS';\n\n@Module({})\nexport class HttpClientModule {\n static forRoot(options: HttpClientModuleOptions): DynamicModule {\n const providers: Provider[] = options.clients.map(({ token, config }) =>\n HttpClientModule._clientProvider(token, config),\n );\n\n return {\n module: HttpClientModule,\n providers,\n exports: providers,\n global: true,\n };\n }\n\n static forRootAsync(options: HttpClientModuleAsyncOptions): DynamicModule {\n const asyncProvider = HttpClientModule._asyncOptionsProvider(options);\n\n const clientsProvider: Provider = {\n provide: 'HTTP_CLIENT_INSTANCES',\n useFactory: (opts: HttpClientModuleOptions) => {\n return opts.clients.map(({ token, config }) => ({\n token,\n instance: new HttpClient(config),\n }));\n },\n inject: [HTTP_CLIENT_MODULE_OPTIONS],\n };\n\n const allProviders: Provider[] = [\n asyncProvider,\n clientsProvider,\n ];\n\n return {\n module: HttpClientModule,\n imports: options.imports ?? [],\n providers: allProviders,\n exports: allProviders,\n global: true,\n };\n }\n\n private static _clientProvider(token: HttpClientToken, config: HttpClientConfig): Provider {\n return {\n provide: token.symbol,\n useFactory: () => new HttpClient(config),\n };\n }\n\n private static _asyncOptionsProvider(options: HttpClientModuleAsyncOptions): Provider {\n if (options.useFactory) {\n return {\n provide: HTTP_CLIENT_MODULE_OPTIONS,\n useFactory: options.useFactory as (...args: unknown[]) => HttpClientModuleOptions | Promise<HttpClientModuleOptions>,\n inject: (options.inject ?? []) as (InjectionToken | OptionalFactoryDependency)[],\n };\n }\n\n const cls = options.useExisting ?? options.useClass;\n if (cls) {\n return {\n provide: HTTP_CLIENT_MODULE_OPTIONS,\n useFactory: (factory: HttpClientOptionsFactory) => factory.createHttpClientOptions(),\n inject: [cls as Type<HttpClientOptionsFactory>],\n };\n }\n\n return {\n provide: HTTP_CLIENT_MODULE_OPTIONS,\n useValue: { clients: [] } satisfies HttpClientModuleOptions,\n };\n }\n}\n","import { Inject } from '@nestjs/common';\nimport type { HttpClientToken } from '../core/types.js';\n\nexport const InjectHttpClient = (\n token: HttpClientToken,\n): ReturnType<typeof Inject> => Inject(token.symbol);\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { PipelineStep } from '@backendkit-labs/pipeline';
|
|
2
|
+
import { CircuitBreakerOptions } from '@backendkit-labs/circuit-breaker';
|
|
3
|
+
|
|
4
|
+
type HttpErrorType = 'http' | 'network' | 'cancelled' | 'circuit-open' | 'timeout';
|
|
5
|
+
interface HttpClientError {
|
|
6
|
+
type: HttpErrorType;
|
|
7
|
+
message: string;
|
|
8
|
+
status?: number;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface HttpResponse<T = unknown> {
|
|
13
|
+
data: T;
|
|
14
|
+
status: number;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/** Mutable context passed through the pre-request pipeline steps. */
|
|
18
|
+
interface HttpCtx {
|
|
19
|
+
url: string;
|
|
20
|
+
method: string;
|
|
21
|
+
data?: unknown;
|
|
22
|
+
headers: Record<string, string>;
|
|
23
|
+
params?: Record<string, unknown>;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
cancelKey?: string;
|
|
26
|
+
correlationId?: string;
|
|
27
|
+
}
|
|
28
|
+
interface RequestConfig {
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
params?: Record<string, unknown>;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
/** Key used to identify and cancel this request programmatically. */
|
|
33
|
+
cancelKey?: string;
|
|
34
|
+
correlationId?: string;
|
|
35
|
+
}
|
|
36
|
+
interface RetryConfig {
|
|
37
|
+
/** Number of retry attempts after the first failure. */
|
|
38
|
+
attempts: number;
|
|
39
|
+
delayMs?: number;
|
|
40
|
+
maxDelayMs?: number;
|
|
41
|
+
jitter?: boolean;
|
|
42
|
+
/** Return false to stop retrying on a specific error. */
|
|
43
|
+
shouldRetry?: (error: HttpClientError, attempt: number) => boolean;
|
|
44
|
+
}
|
|
45
|
+
interface HttpClientConfig {
|
|
46
|
+
baseURL?: string;
|
|
47
|
+
timeout?: number;
|
|
48
|
+
headers?: Record<string, string>;
|
|
49
|
+
circuitBreaker?: CircuitBreakerOptions;
|
|
50
|
+
retry?: RetryConfig;
|
|
51
|
+
/** Pre-request pipeline steps. Receive and transform the HttpCtx before the call is made. */
|
|
52
|
+
steps?: PipelineStep<HttpCtx, HttpClientError>[];
|
|
53
|
+
}
|
|
54
|
+
interface HttpMetrics {
|
|
55
|
+
requests: number;
|
|
56
|
+
success: number;
|
|
57
|
+
failed: number;
|
|
58
|
+
cancelled: number;
|
|
59
|
+
circuitOpen: number;
|
|
60
|
+
retried: number;
|
|
61
|
+
}
|
|
62
|
+
/** Typed injection token for named HTTP clients. */
|
|
63
|
+
declare class HttpClientToken {
|
|
64
|
+
readonly description: string;
|
|
65
|
+
readonly symbol: symbol;
|
|
66
|
+
readonly _phantom: never;
|
|
67
|
+
constructor(name: string);
|
|
68
|
+
}
|
|
69
|
+
declare function defineHttpClient(name: string): HttpClientToken;
|
|
70
|
+
|
|
71
|
+
export { type HttpClientConfig as H, type RequestConfig as R, type HttpResponse as a, type HttpClientError as b, type HttpMetrics as c, HttpClientToken as d, type HttpCtx as e, type HttpErrorType as f, type RetryConfig as g, defineHttpClient as h };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { PipelineStep } from '@backendkit-labs/pipeline';
|
|
2
|
+
import { CircuitBreakerOptions } from '@backendkit-labs/circuit-breaker';
|
|
3
|
+
|
|
4
|
+
type HttpErrorType = 'http' | 'network' | 'cancelled' | 'circuit-open' | 'timeout';
|
|
5
|
+
interface HttpClientError {
|
|
6
|
+
type: HttpErrorType;
|
|
7
|
+
message: string;
|
|
8
|
+
status?: number;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface HttpResponse<T = unknown> {
|
|
13
|
+
data: T;
|
|
14
|
+
status: number;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/** Mutable context passed through the pre-request pipeline steps. */
|
|
18
|
+
interface HttpCtx {
|
|
19
|
+
url: string;
|
|
20
|
+
method: string;
|
|
21
|
+
data?: unknown;
|
|
22
|
+
headers: Record<string, string>;
|
|
23
|
+
params?: Record<string, unknown>;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
cancelKey?: string;
|
|
26
|
+
correlationId?: string;
|
|
27
|
+
}
|
|
28
|
+
interface RequestConfig {
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
params?: Record<string, unknown>;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
/** Key used to identify and cancel this request programmatically. */
|
|
33
|
+
cancelKey?: string;
|
|
34
|
+
correlationId?: string;
|
|
35
|
+
}
|
|
36
|
+
interface RetryConfig {
|
|
37
|
+
/** Number of retry attempts after the first failure. */
|
|
38
|
+
attempts: number;
|
|
39
|
+
delayMs?: number;
|
|
40
|
+
maxDelayMs?: number;
|
|
41
|
+
jitter?: boolean;
|
|
42
|
+
/** Return false to stop retrying on a specific error. */
|
|
43
|
+
shouldRetry?: (error: HttpClientError, attempt: number) => boolean;
|
|
44
|
+
}
|
|
45
|
+
interface HttpClientConfig {
|
|
46
|
+
baseURL?: string;
|
|
47
|
+
timeout?: number;
|
|
48
|
+
headers?: Record<string, string>;
|
|
49
|
+
circuitBreaker?: CircuitBreakerOptions;
|
|
50
|
+
retry?: RetryConfig;
|
|
51
|
+
/** Pre-request pipeline steps. Receive and transform the HttpCtx before the call is made. */
|
|
52
|
+
steps?: PipelineStep<HttpCtx, HttpClientError>[];
|
|
53
|
+
}
|
|
54
|
+
interface HttpMetrics {
|
|
55
|
+
requests: number;
|
|
56
|
+
success: number;
|
|
57
|
+
failed: number;
|
|
58
|
+
cancelled: number;
|
|
59
|
+
circuitOpen: number;
|
|
60
|
+
retried: number;
|
|
61
|
+
}
|
|
62
|
+
/** Typed injection token for named HTTP clients. */
|
|
63
|
+
declare class HttpClientToken {
|
|
64
|
+
readonly description: string;
|
|
65
|
+
readonly symbol: symbol;
|
|
66
|
+
readonly _phantom: never;
|
|
67
|
+
constructor(name: string);
|
|
68
|
+
}
|
|
69
|
+
declare function defineHttpClient(name: string): HttpClientToken;
|
|
70
|
+
|
|
71
|
+
export { type HttpClientConfig as H, type RequestConfig as R, type HttpResponse as a, type HttpClientError as b, type HttpMetrics as c, HttpClientToken as d, type HttpCtx as e, type HttpErrorType as f, type RetryConfig as g, defineHttpClient as h };
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@backendkit-labs/http-client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Production-grade HTTP client for Node.js — built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./nestjs": {
|
|
16
|
+
"types": "./dist/nestjs/index.d.ts",
|
|
17
|
+
"import": "./dist/nestjs/index.js",
|
|
18
|
+
"require": "./dist/nestjs/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"dev": "tsup --watch",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"test:coverage": "vitest run --coverage",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"lint": "eslint src/",
|
|
30
|
+
"prepublishOnly": "npm run build && npm run test && npm run lint"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"http", "axios", "circuit-breaker", "retry", "result",
|
|
34
|
+
"pipeline", "cancel", "nestjs", "node", "typescript"
|
|
35
|
+
],
|
|
36
|
+
"author": "Mairon José Cuello Martínez",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"homepage": "https://github.com/backendkit-dev/backendkit-monorepo/tree/master/packages/http-client#readme",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/backendkit-dev/backendkit-monorepo.git",
|
|
42
|
+
"directory": "packages/http-client"
|
|
43
|
+
},
|
|
44
|
+
"bugs": { "url": "https://github.com/backendkit-dev/backendkit-monorepo/issues" },
|
|
45
|
+
"publishConfig": { "access": "public" },
|
|
46
|
+
"sideEffects": false,
|
|
47
|
+
"engines": { "node": ">=18" },
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@backendkit-labs/circuit-breaker": "*",
|
|
50
|
+
"@backendkit-labs/pipeline": "*",
|
|
51
|
+
"@backendkit-labs/result": "*"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@nestjs/common": ">=10.0.0",
|
|
55
|
+
"@nestjs/core": ">=10.0.0",
|
|
56
|
+
"axios": ">=1.0.0",
|
|
57
|
+
"rxjs": ">=7.0.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"@nestjs/common": { "optional": true },
|
|
61
|
+
"@nestjs/core": { "optional": true },
|
|
62
|
+
"rxjs": { "optional": true }
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@eslint/js": "^9.39.4",
|
|
66
|
+
"@nestjs/common": "^10.0.0",
|
|
67
|
+
"@nestjs/core": "^10.0.0",
|
|
68
|
+
"@types/node": "^22.0.0",
|
|
69
|
+
"axios": "^1.7.0",
|
|
70
|
+
"axios-mock-adapter": "^2.1.0",
|
|
71
|
+
"eslint": "^9.0.0",
|
|
72
|
+
"reflect-metadata": "^0.2.0",
|
|
73
|
+
"rxjs": "^7.8.0",
|
|
74
|
+
"tsup": "^8.0.0",
|
|
75
|
+
"typescript": "^5.5.0",
|
|
76
|
+
"typescript-eslint": "^8.59.3",
|
|
77
|
+
"vitest": "^2.0.0"
|
|
78
|
+
}
|
|
79
|
+
}
|