@vibesdotdev/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/SPEC.md +107 -0
- package/dist/factory.d.ts +34 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +80 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client/core.d.ts +8 -0
- package/dist/lib/client/core.d.ts.map +1 -0
- package/dist/lib/client/core.js +5 -0
- package/dist/lib/client/core.js.map +1 -0
- package/dist/lib/client/internal/base-client.d.ts +19 -0
- package/dist/lib/client/internal/base-client.d.ts.map +1 -0
- package/dist/lib/client/internal/base-client.js +92 -0
- package/dist/lib/client/internal/base-client.js.map +1 -0
- package/dist/lib/client/internal/base-helpers.d.ts +9 -0
- package/dist/lib/client/internal/base-helpers.d.ts.map +1 -0
- package/dist/lib/client/internal/base-helpers.js +79 -0
- package/dist/lib/client/internal/base-helpers.js.map +1 -0
- package/dist/lib/client/internal/base-types.d.ts +35 -0
- package/dist/lib/client/internal/base-types.d.ts.map +1 -0
- package/dist/lib/client/internal/base-types.js +15 -0
- package/dist/lib/client/internal/base-types.js.map +1 -0
- package/dist/lib/client/internal/endpoint.d.ts +22 -0
- package/dist/lib/client/internal/endpoint.d.ts.map +1 -0
- package/dist/lib/client/internal/endpoint.js +35 -0
- package/dist/lib/client/internal/endpoint.js.map +1 -0
- package/dist/lib/client/internal/generator.d.ts +20 -0
- package/dist/lib/client/internal/generator.d.ts.map +1 -0
- package/dist/lib/client/internal/generator.js +173 -0
- package/dist/lib/client/internal/generator.js.map +1 -0
- package/dist/lib/client/internal/index.d.ts +5 -0
- package/dist/lib/client/internal/index.d.ts.map +1 -0
- package/dist/lib/client/internal/index.js +4 -0
- package/dist/lib/client/internal/index.js.map +1 -0
- package/dist/lib/client/internal/node/http2-fetch.node.d.ts +2 -0
- package/dist/lib/client/internal/node/http2-fetch.node.d.ts.map +1 -0
- package/dist/lib/client/internal/node/http2-fetch.node.js +131 -0
- package/dist/lib/client/internal/node/http2-fetch.node.js.map +1 -0
- package/dist/lib/client/internal/request-builder.d.ts +15 -0
- package/dist/lib/client/internal/request-builder.d.ts.map +1 -0
- package/dist/lib/client/internal/request-builder.js +158 -0
- package/dist/lib/client/internal/request-builder.js.map +1 -0
- package/dist/lib/client/internal/sse-stream.d.ts +23 -0
- package/dist/lib/client/internal/sse-stream.d.ts.map +1 -0
- package/dist/lib/client/internal/sse-stream.js +110 -0
- package/dist/lib/client/internal/sse-stream.js.map +1 -0
- package/dist/lib/client/internal/vibes-client.d.ts +32 -0
- package/dist/lib/client/internal/vibes-client.d.ts.map +1 -0
- package/dist/lib/client/internal/vibes-client.js +120 -0
- package/dist/lib/client/internal/vibes-client.js.map +1 -0
- package/dist/lib/client/internal/wrap-fetch.d.ts +6 -0
- package/dist/lib/client/internal/wrap-fetch.d.ts.map +1 -0
- package/dist/lib/client/internal/wrap-fetch.js +46 -0
- package/dist/lib/client/internal/wrap-fetch.js.map +1 -0
- package/dist/lib/client/node.d.ts +5 -0
- package/dist/lib/client/node.d.ts.map +1 -0
- package/dist/lib/client/node.js +33 -0
- package/dist/lib/client/node.js.map +1 -0
- package/dist/lib/client/types.d.ts +145 -0
- package/dist/lib/client/types.d.ts.map +1 -0
- package/dist/lib/client/types.js +21 -0
- package/dist/lib/client/types.js.map +1 -0
- package/dist/plugin.d.ts +19 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +80 -0
- package/dist/plugin.js.map +1 -0
- package/dist/schemas.d.ts +90 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +9 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sse-client.d.ts +39 -0
- package/dist/sse-client.d.ts.map +1 -0
- package/dist/sse-client.js +124 -0
- package/dist/sse-client.js.map +1 -0
- package/dist/tools/api-request/api-request.descriptor.d.ts +48 -0
- package/dist/tools/api-request/api-request.descriptor.d.ts.map +1 -0
- package/dist/tools/api-request/api-request.descriptor.js +27 -0
- package/dist/tools/api-request/api-request.descriptor.js.map +1 -0
- package/dist/tools/api-request/api-request.impl.consumer.d.ts +13 -0
- package/dist/tools/api-request/api-request.impl.consumer.d.ts.map +1 -0
- package/dist/tools/api-request/api-request.impl.consumer.js +51 -0
- package/dist/tools/api-request/api-request.impl.consumer.js.map +1 -0
- package/dist/tools/api-request/index.d.ts +5 -0
- package/dist/tools/api-request/index.d.ts.map +1 -0
- package/dist/tools/api-request/index.js +4 -0
- package/dist/tools/api-request/index.js.map +1 -0
- package/dist/tools/api-request/schemas/index.d.ts +33 -0
- package/dist/tools/api-request/schemas/index.d.ts.map +1 -0
- package/dist/tools/api-request/schemas/index.js +24 -0
- package/dist/tools/api-request/schemas/index.js.map +1 -0
- package/package.json +99 -0
- package/src/factory.ts +114 -0
- package/src/index.ts +15 -0
- package/src/lib/client/core.ts +13 -0
- package/src/lib/client/internal/base-client.ts +107 -0
- package/src/lib/client/internal/base-helpers.ts +74 -0
- package/src/lib/client/internal/base-types.ts +42 -0
- package/src/lib/client/internal/endpoint.ts +51 -0
- package/src/lib/client/internal/generator.ts +181 -0
- package/src/lib/client/internal/index.ts +4 -0
- package/src/lib/client/internal/node/http2-fetch.node.ts +138 -0
- package/src/lib/client/internal/request-builder.ts +147 -0
- package/src/lib/client/internal/sse-stream.ts +130 -0
- package/src/lib/client/internal/vibes-client.ts +167 -0
- package/src/lib/client/internal/wrap-fetch.ts +59 -0
- package/src/lib/client/node.ts +36 -0
- package/src/lib/client/types.ts +156 -0
- package/src/plugin.ts +104 -0
- package/src/schemas.ts +91 -0
- package/src/sse-client.ts +155 -0
- package/src/tools/api-request/api-request.descriptor.ts +28 -0
- package/src/tools/api-request/api-request.impl.consumer.ts +66 -0
- package/src/tools/api-request/index.ts +4 -0
- package/src/tools/api-request/schemas/index.ts +29 -0
package/SPEC.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Client Package SPEC
|
|
2
|
+
|
|
3
|
+
**Status:** Production
|
|
4
|
+
**Package:** `@vibesdotdev/client`
|
|
5
|
+
**Location:** `packages/client`
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Base API client with runtime kind integration and per-app client factories. Wraps `@vibesdotdev/kit`'s VibesClient with a standardized `ApiClientImplementation` interface and registers `api/client` as a runtime kind for descriptor-based client resolution.
|
|
10
|
+
|
|
11
|
+
## Architecture
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
+-----------------------------------------------------------------------+
|
|
15
|
+
| Client Package |
|
|
16
|
+
+-----------------------------------------------------------------------+
|
|
17
|
+
| FACTORY |
|
|
18
|
+
| ------- |
|
|
19
|
+
| vibesApiClient(config) -> Create API client from config |
|
|
20
|
+
| fromVibesClient(client) -> Wrap existing VibesClient |
|
|
21
|
+
| ApiClientConfig -> baseUrl, auth, fetch, timeout, headers |
|
|
22
|
+
+-----------------------------------------------------------------------+
|
|
23
|
+
| SCHEMAS |
|
|
24
|
+
| ------- |
|
|
25
|
+
| ApiClientDescriptor -> Runtime descriptor for api/client kind |
|
|
26
|
+
| kind: 'api/client' -> Runtime kind identifier |
|
|
27
|
+
| baseUrl, timeout, debug -> Per-client configuration |
|
|
28
|
+
| ApiClientImplementation -> Standard interface: get/post/put/delete |
|
|
29
|
+
| ApiRequestOptions -> query, headers, timeout, params |
|
|
30
|
+
+-----------------------------------------------------------------------+
|
|
31
|
+
| RUNTIME PLUGIN |
|
|
32
|
+
| -------------- |
|
|
33
|
+
| clientPlugin -> Registers 'api/client' kind |
|
|
34
|
+
| DefaultApiClient -> Default implementation from descriptor |
|
|
35
|
+
| Runtime query: |
|
|
36
|
+
| runtime.query('api/client').withId('auth').resolve() |
|
|
37
|
+
+-----------------------------------------------------------------------+
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Key Exports
|
|
41
|
+
|
|
42
|
+
### Factory (`@vibesdotdev/client` or `@vibesdotdev/client/factory`)
|
|
43
|
+
- `vibesApiClient(config?)` -- Create new API client instance
|
|
44
|
+
- `fromVibesClient(client)` -- Wrap existing VibesClient
|
|
45
|
+
- `ApiClientConfig` -- Configuration type
|
|
46
|
+
|
|
47
|
+
### Schemas (`@vibesdotdev/client/schemas`)
|
|
48
|
+
- `ApiClientDescriptor` -- Runtime descriptor interface
|
|
49
|
+
- `ApiClientDescriptorSchema` -- Zod validation schema
|
|
50
|
+
- `ApiClientImplementation` -- Standard client interface (get/post/put/delete/request)
|
|
51
|
+
- `ApiRequestOptions` -- Per-request options (query, headers, timeout, params)
|
|
52
|
+
|
|
53
|
+
### Plugin (`@vibesdotdev/client/plugin`)
|
|
54
|
+
- `clientPlugin` -- Runtime plugin registering `api/client` kind
|
|
55
|
+
- Enables `runtime.query('api/client').withId('auth').resolve()`
|
|
56
|
+
|
|
57
|
+
## ApiClientImplementation Interface
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
interface ApiClientImplementation {
|
|
61
|
+
get<T>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
|
|
62
|
+
post<T>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T>;
|
|
63
|
+
put<T>(endpoint: string, body?: unknown, options?: ApiRequestOptions): Promise<T>;
|
|
64
|
+
delete<T>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
|
|
65
|
+
request<T>(endpoint: string, options?: ApiRequestOptions & { method?: string; body?: unknown }): Promise<T>;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Runtime Integration
|
|
70
|
+
|
|
71
|
+
The plugin registers `api/client` as a runtime kind. Apps register descriptors:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// auth-client.client-api.descriptor.ts
|
|
75
|
+
export default {
|
|
76
|
+
id: 'auth',
|
|
77
|
+
kind: 'api/client',
|
|
78
|
+
baseUrl: 'https://auth.vibes.dev',
|
|
79
|
+
timeout: 10000
|
|
80
|
+
};
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Other packages resolve clients via the runtime:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const authClient = await runtime.query('api/client').withId('auth').resolve();
|
|
87
|
+
const session = await authClient.get('/api/session');
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Done Means
|
|
91
|
+
|
|
92
|
+
- [ ] `vibesApiClient` creates working clients with proper auth, headers, and timeout
|
|
93
|
+
- [ ] `fromVibesClient` correctly wraps VibesClient to ApiClientImplementation
|
|
94
|
+
- [ ] Custom headers hook applies headers to all requests
|
|
95
|
+
- [ ] Runtime plugin registers `api/client` kind and resolves descriptors
|
|
96
|
+
- [ ] DefaultApiClient constructs from descriptor config (baseUrl, timeout, debug)
|
|
97
|
+
- [ ] All HTTP methods (GET, POST, PUT, DELETE, generic request) work correctly
|
|
98
|
+
- [ ] ApiRequestOptions supports query params, custom headers, and timeout override
|
|
99
|
+
- [ ] Error handling propagates HTTP errors with useful context
|
|
100
|
+
- [ ] Tests cover factory creation, plugin registration, and request lifecycle
|
|
101
|
+
|
|
102
|
+
## Dependencies
|
|
103
|
+
|
|
104
|
+
- `@vibesdotdev/kit` -- VibesClient base class and client types
|
|
105
|
+
- `@vibesdotdev/runtime` -- Runtime plugin registration and kind system
|
|
106
|
+
- `@vibesdotdev/logging` -- Structured logging
|
|
107
|
+
- `zod` -- Schema validation for descriptors
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { VibesClient } from './lib/client/core.ts';
|
|
2
|
+
import type { AuthConfig } from './lib/client/types.ts';
|
|
3
|
+
import type { ApiClientImplementation } from './schemas.ts';
|
|
4
|
+
export interface ApiClientConfig {
|
|
5
|
+
/** Unique identifier for this client instance */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Base URL for API requests */
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
/** Authentication configuration */
|
|
10
|
+
auth?: AuthConfig;
|
|
11
|
+
/** Custom fetch implementation */
|
|
12
|
+
fetch?: typeof fetch;
|
|
13
|
+
/** Request timeout in milliseconds */
|
|
14
|
+
timeout?: number;
|
|
15
|
+
/** Enable debug logging */
|
|
16
|
+
debug?: boolean;
|
|
17
|
+
/** Custom headers applied to all requests */
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create an API client instance.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const client = vibesApiClient({ baseUrl: 'https://api.vibes.dev' });
|
|
26
|
+
* const data = await client.get('/users');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function vibesApiClient(config?: ApiClientConfig): ApiClientImplementation;
|
|
30
|
+
/**
|
|
31
|
+
* Create an API client from an existing VibesClient instance.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fromVibesClient(client: VibesClient): ApiClientImplementation;
|
|
34
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EACX,uBAAuB,EAIvB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,eAAe;IAC/B,iDAAiD;IACjD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,eAAoB,GAAG,uBAAuB,CA0BpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,uBAAuB,CAE5E"}
|
package/dist/factory.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { VibesClient } from "./lib/client/core.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a VibesClient to satisfy the ApiClientImplementation interface.
|
|
4
|
+
*/
|
|
5
|
+
function wrapVibesClient(client) {
|
|
6
|
+
return {
|
|
7
|
+
get(endpoint, options) {
|
|
8
|
+
return client.get(endpoint, { method: 'GET', path: endpoint, ...options });
|
|
9
|
+
},
|
|
10
|
+
post(endpoint, body, options) {
|
|
11
|
+
return client.post(endpoint, body, { method: 'POST', path: endpoint, ...options });
|
|
12
|
+
},
|
|
13
|
+
put(endpoint, body, options) {
|
|
14
|
+
return client.put(endpoint, body, { method: 'PUT', path: endpoint, ...options });
|
|
15
|
+
},
|
|
16
|
+
patch(endpoint, body, options) {
|
|
17
|
+
return client.request(endpoint, { method: 'PATCH', body, ...options });
|
|
18
|
+
},
|
|
19
|
+
delete(endpoint, options) {
|
|
20
|
+
return client.delete(endpoint, { method: 'DELETE', path: endpoint, ...options });
|
|
21
|
+
},
|
|
22
|
+
request(endpoint, options) {
|
|
23
|
+
return client.request(endpoint, {
|
|
24
|
+
method: options?.method ?? 'GET',
|
|
25
|
+
...options
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
stream(endpoint, options) {
|
|
29
|
+
return client.stream(endpoint, {
|
|
30
|
+
method: options?.method ?? 'POST',
|
|
31
|
+
body: options?.body,
|
|
32
|
+
headers: options?.headers,
|
|
33
|
+
params: options?.params,
|
|
34
|
+
query: options?.query,
|
|
35
|
+
timeout: options?.timeout
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create an API client instance.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const client = vibesApiClient({ baseUrl: 'https://api.vibes.dev' });
|
|
46
|
+
* const data = await client.get('/users');
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function vibesApiClient(config = {}) {
|
|
50
|
+
const clientConfig = {
|
|
51
|
+
baseUrl: config.baseUrl,
|
|
52
|
+
auth: config.auth,
|
|
53
|
+
fetch: config.fetch,
|
|
54
|
+
timeout: config.timeout,
|
|
55
|
+
debug: config.debug
|
|
56
|
+
};
|
|
57
|
+
if (config.headers && Object.keys(config.headers).length > 0) {
|
|
58
|
+
const headers = config.headers;
|
|
59
|
+
clientConfig.hooks = {
|
|
60
|
+
beforeRequest: async (request) => {
|
|
61
|
+
const updated = new Headers(request.headers);
|
|
62
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
63
|
+
if (value !== undefined) {
|
|
64
|
+
updated.set(key, value);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return new Request(request, { headers: updated });
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const vibes = new VibesClient(clientConfig);
|
|
72
|
+
return wrapVibesClient(vibes);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create an API client from an existing VibesClient instance.
|
|
76
|
+
*/
|
|
77
|
+
export function fromVibesClient(client) {
|
|
78
|
+
return wrapVibesClient(client);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { vibesApiClient, fromVibesClient } from './factory.ts';
|
|
2
|
+
export type { ApiClientConfig } from './factory.ts';
|
|
3
|
+
export type { ApiClientDescriptor, ApiClientImplementation, ApiRequestOptions, ApiStreamOptions, ApiStreamEvent } from './schemas.ts';
|
|
4
|
+
export { ApiClientDescriptorSchema } from './schemas.ts';
|
|
5
|
+
export { default as clientPlugin } from './plugin.ts';
|
|
6
|
+
export { SSEClient, createSSEClient } from './sse-client.ts';
|
|
7
|
+
export type { SSEClientOptions, SSEConnectionStatus } from './sse-client.ts';
|
|
8
|
+
export { VibesClient } from './lib/client/core.ts';
|
|
9
|
+
export type { ClientConfig, AuthConfig, ClientHooks, ClientError } from './lib/client/types.ts';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EACX,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { vibesApiClient, fromVibesClient } from "./factory.js";
|
|
2
|
+
export { ApiClientDescriptorSchema } from "./schemas.js";
|
|
3
|
+
export { default as clientPlugin } from "./plugin.js";
|
|
4
|
+
export { SSEClient, createSSEClient } from "./sse-client.js";
|
|
5
|
+
export { VibesClient } from "./lib/client/core.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAS/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { VibesClient } from './internal/vibes-client.ts';
|
|
2
|
+
export type { SSEEvent } from './internal/sse-stream.ts';
|
|
3
|
+
export type { ClientConfig, AuthConfig, ClientHooks, ClientUser, RequestOptions } from './types.ts';
|
|
4
|
+
export { ClientError } from './types.ts';
|
|
5
|
+
export { BaseAPIClient } from './internal/base-client.ts';
|
|
6
|
+
export type { BaseAPIConfig, EndpointOptions } from './internal/base-types.ts';
|
|
7
|
+
export { Endpoint } from './internal/endpoint.ts';
|
|
8
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/lib/client/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/lib/client/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AASzD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type BaseAPIConfig, type EndpointOptions } from './base-types.ts';
|
|
2
|
+
import { Endpoint } from './endpoint.ts';
|
|
3
|
+
export declare abstract class BaseAPIClient {
|
|
4
|
+
protected config: Required<Omit<BaseAPIConfig, 'auth'>> & {
|
|
5
|
+
auth: BaseAPIConfig['auth'];
|
|
6
|
+
};
|
|
7
|
+
private abortControllers;
|
|
8
|
+
constructor(config: BaseAPIConfig);
|
|
9
|
+
protected endpoint(path: string): Endpoint;
|
|
10
|
+
request<T = unknown>(request: {
|
|
11
|
+
method: string;
|
|
12
|
+
path: string;
|
|
13
|
+
body?: unknown;
|
|
14
|
+
} & EndpointOptions<T>): Promise<T>;
|
|
15
|
+
cancelAll(): void;
|
|
16
|
+
setAuth(auth: BaseAPIConfig['auth']): void;
|
|
17
|
+
updateConfig(config: Partial<BaseAPIConfig>): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=base-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-client.d.ts","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAY,MAAM,iBAAiB,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,8BAAsB,aAAa;IAClC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG;QACzD,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,gBAAgB,CAA8B;gBAE1C,MAAM,EAAE,aAAa;IAiBjC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAKpC,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;KACf,GAAG,eAAe,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC;IAwDb,SAAS,IAAI,IAAI;IAKjB,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAI1C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;CAGlD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { APIError } from "./base-types.js";
|
|
2
|
+
import { buildHeaders, buildUrl, createApiError } from "./base-helpers.js";
|
|
3
|
+
import { Endpoint } from "./endpoint.js";
|
|
4
|
+
export class BaseAPIClient {
|
|
5
|
+
config;
|
|
6
|
+
abortControllers = new Set();
|
|
7
|
+
constructor(config) {
|
|
8
|
+
const merged = {
|
|
9
|
+
baseUrl: config.baseUrl,
|
|
10
|
+
fetch: (config.fetch || globalThis.fetch?.bind(globalThis)),
|
|
11
|
+
headers: config.headers || {},
|
|
12
|
+
timeout: config.timeout || 30000,
|
|
13
|
+
debug: config.debug || false,
|
|
14
|
+
hooks: config.hooks || {},
|
|
15
|
+
auth: config.auth ?? null
|
|
16
|
+
};
|
|
17
|
+
if (!merged.fetch)
|
|
18
|
+
throw new Error('Fetch is not available. Please provide a fetch implementation.');
|
|
19
|
+
this.config = merged;
|
|
20
|
+
}
|
|
21
|
+
endpoint(path) {
|
|
22
|
+
const cleanPath = path.startsWith('/') ? path : `/${path}`;
|
|
23
|
+
return new Endpoint(this, cleanPath);
|
|
24
|
+
}
|
|
25
|
+
async request(request) {
|
|
26
|
+
const url = buildUrl(this.config.baseUrl, request.path, request.query);
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
this.abortControllers.add(controller);
|
|
29
|
+
try {
|
|
30
|
+
const authForHeaders = this.config.auth ?? { type: 'none' };
|
|
31
|
+
const headers = await buildHeaders({
|
|
32
|
+
auth: authForHeaders,
|
|
33
|
+
headers: { ...this.config.headers, ...request.headers },
|
|
34
|
+
includeJsonDefaults: request.body !== undefined
|
|
35
|
+
});
|
|
36
|
+
const init = {
|
|
37
|
+
method: request.method,
|
|
38
|
+
headers,
|
|
39
|
+
signal: controller.signal
|
|
40
|
+
};
|
|
41
|
+
const timeout = setTimeout(() => controller.abort(), request.timeout ?? this.config.timeout);
|
|
42
|
+
if (request.body !== undefined)
|
|
43
|
+
init.body = JSON.stringify(request.body);
|
|
44
|
+
let req = new Request(url.toString(), init);
|
|
45
|
+
if (this.config.hooks?.beforeRequest)
|
|
46
|
+
req = await this.config.hooks.beforeRequest(req);
|
|
47
|
+
const response = await this.config.fetch(req, init);
|
|
48
|
+
clearTimeout(timeout);
|
|
49
|
+
const finalResponse = this.config.hooks?.afterResponse
|
|
50
|
+
? await this.config.hooks.afterResponse(response)
|
|
51
|
+
: response;
|
|
52
|
+
if (!finalResponse.ok) {
|
|
53
|
+
const error = await createApiError(finalResponse, req);
|
|
54
|
+
if (this.config.hooks?.onError)
|
|
55
|
+
await this.config.hooks.onError(error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
let data;
|
|
59
|
+
if (finalResponse.status === 204 || finalResponse.headers.get('Content-Length') === '0')
|
|
60
|
+
data = undefined;
|
|
61
|
+
else if (finalResponse.headers.get('Content-Type')?.includes('application/json'))
|
|
62
|
+
data = await finalResponse.json();
|
|
63
|
+
else
|
|
64
|
+
data = await finalResponse.text();
|
|
65
|
+
if (request.transform)
|
|
66
|
+
data = request.transform(data);
|
|
67
|
+
if (request.schema) {
|
|
68
|
+
const result = request.schema.safeParse(data);
|
|
69
|
+
if (!result.success) {
|
|
70
|
+
throw new APIError(`Response validation failed: ${result.error.message}`, 422, finalResponse, req, data);
|
|
71
|
+
}
|
|
72
|
+
return result.data;
|
|
73
|
+
}
|
|
74
|
+
return data;
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
this.abortControllers.delete(controller);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
cancelAll() {
|
|
81
|
+
for (const controller of this.abortControllers)
|
|
82
|
+
controller.abort();
|
|
83
|
+
this.abortControllers.clear();
|
|
84
|
+
}
|
|
85
|
+
setAuth(auth) {
|
|
86
|
+
this.config.auth = auth ?? null;
|
|
87
|
+
}
|
|
88
|
+
updateConfig(config) {
|
|
89
|
+
Object.assign(this.config, config);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=base-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-client.js","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type BaseAPIConfig, type EndpointOptions, APIError } from './base-types.ts';
|
|
2
|
+
export declare function buildUrl(baseUrl: string, path: string, query?: EndpointOptions['query']): URL;
|
|
3
|
+
export declare function buildHeaders(args: {
|
|
4
|
+
auth: NonNullable<BaseAPIConfig['auth']>;
|
|
5
|
+
headers: Record<string, string>;
|
|
6
|
+
includeJsonDefaults: boolean;
|
|
7
|
+
}): Promise<Headers>;
|
|
8
|
+
export declare function createApiError(response: Response, request: Request): Promise<APIError>;
|
|
9
|
+
//# sourceMappingURL=base-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-helpers.d.ts","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAErF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,CAU7F;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACxC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mBAAmB,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCnB;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqB5F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { APIError } from "./base-types.js";
|
|
2
|
+
export function buildUrl(baseUrl, path, query) {
|
|
3
|
+
const url = new URL(path, baseUrl);
|
|
4
|
+
if (query) {
|
|
5
|
+
for (const [key, value] of Object.entries(query)) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
continue;
|
|
8
|
+
if (Array.isArray(value))
|
|
9
|
+
value.forEach((v) => url.searchParams.append(key, String(v)));
|
|
10
|
+
else
|
|
11
|
+
url.searchParams.set(key, String(value));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return url;
|
|
15
|
+
}
|
|
16
|
+
export async function buildHeaders(args) {
|
|
17
|
+
const requestHeaders = new Headers(args.headers);
|
|
18
|
+
if (args.includeJsonDefaults && !requestHeaders.has('Content-Type')) {
|
|
19
|
+
requestHeaders.set('Content-Type', 'application/json');
|
|
20
|
+
}
|
|
21
|
+
if (!requestHeaders.has('Accept'))
|
|
22
|
+
requestHeaders.set('Accept', 'application/json');
|
|
23
|
+
const auth = args.auth;
|
|
24
|
+
if (auth) {
|
|
25
|
+
const token = auth.credentials || (await auth.provider?.());
|
|
26
|
+
if (token) {
|
|
27
|
+
switch (auth.type) {
|
|
28
|
+
case 'bearer':
|
|
29
|
+
requestHeaders.set('Authorization', `Bearer ${token}`);
|
|
30
|
+
break;
|
|
31
|
+
case 'apiKey': {
|
|
32
|
+
const headerName = auth.headerName || 'X-API-Key';
|
|
33
|
+
requestHeaders.set(headerName, token);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case 'basic':
|
|
37
|
+
requestHeaders.set('Authorization', `Basic ${token}`);
|
|
38
|
+
break;
|
|
39
|
+
case 'custom':
|
|
40
|
+
if (auth.headerName && auth.prefix) {
|
|
41
|
+
requestHeaders.set(auth.headerName, `${auth.prefix} ${token}`);
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return requestHeaders;
|
|
48
|
+
}
|
|
49
|
+
export async function createApiError(response, request) {
|
|
50
|
+
let message = `${response.status} ${response.statusText}`;
|
|
51
|
+
let body;
|
|
52
|
+
try {
|
|
53
|
+
const contentType = response.headers.get('Content-Type');
|
|
54
|
+
if (contentType?.includes('application/json')) {
|
|
55
|
+
body = await response.json();
|
|
56
|
+
if (typeof body === 'object' && body !== null) {
|
|
57
|
+
const errorBody = body;
|
|
58
|
+
if (typeof errorBody.message === 'string')
|
|
59
|
+
message = errorBody.message;
|
|
60
|
+
else if (typeof errorBody.error === 'string')
|
|
61
|
+
message = errorBody.error;
|
|
62
|
+
else if (errorBody.error !== undefined)
|
|
63
|
+
message = JSON.stringify(errorBody.error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const text = await response.text();
|
|
68
|
+
if (text) {
|
|
69
|
+
message = text;
|
|
70
|
+
body = text;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// ignore parsing errors
|
|
76
|
+
}
|
|
77
|
+
return new APIError(message, response.status, response, request, body);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=base-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-helpers.js","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { z } from 'zod/v4';
|
|
2
|
+
export interface BaseAPIConfig {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
fetch?: typeof fetch;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
auth?: {
|
|
8
|
+
type: 'none' | 'bearer' | 'apiKey' | 'basic' | 'custom';
|
|
9
|
+
credentials?: string;
|
|
10
|
+
headerName?: string;
|
|
11
|
+
prefix?: string;
|
|
12
|
+
provider?: () => Promise<string | null>;
|
|
13
|
+
} | null;
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
hooks?: {
|
|
16
|
+
beforeRequest?: (request: Request) => Promise<Request> | Request;
|
|
17
|
+
afterResponse?: (response: Response) => Promise<Response> | Response;
|
|
18
|
+
onError?: (error: APIError) => Promise<void> | void;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare class APIError extends Error {
|
|
22
|
+
readonly status: number;
|
|
23
|
+
readonly response?: Response | undefined;
|
|
24
|
+
readonly request?: Request | undefined;
|
|
25
|
+
readonly body?: unknown | undefined;
|
|
26
|
+
constructor(message: string, status: number, response?: Response | undefined, request?: Request | undefined, body?: unknown | undefined);
|
|
27
|
+
}
|
|
28
|
+
export interface EndpointOptions<T = unknown> {
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
query?: Record<string, string | number | boolean | string[] | undefined>;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
schema?: z.ZodSchema<T>;
|
|
33
|
+
transform?: (data: unknown) => T;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=base-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-types.d.ts","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACxD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;KACxC,GAAG,IAAI,CAAC;IACT,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;QACjE,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KACpD,CAAC;CACF;AAED,qBAAa,QAAS,SAAQ,KAAK;aAGjB,MAAM,EAAE,MAAM;aACd,QAAQ,CAAC,EAAE,QAAQ;aACnB,OAAO,CAAC,EAAE,OAAO;aACjB,IAAI,CAAC,EAAE,OAAO;gBAJ9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,QAAQ,YAAA,EACnB,OAAO,CAAC,EAAE,OAAO,YAAA,EACjB,IAAI,CAAC,EAAE,OAAO,YAAA;CAK/B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class APIError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
response;
|
|
4
|
+
request;
|
|
5
|
+
body;
|
|
6
|
+
constructor(message, status, response, request, body) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.response = response;
|
|
10
|
+
this.request = request;
|
|
11
|
+
this.body = body;
|
|
12
|
+
this.name = 'APIError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=base-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-types.js","sourceRoot":"","sources":["../../../../src/lib/client/internal/base-types.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGjB;IACA;IACA;IACA;IALjB,YACC,OAAe,EACC,MAAc,EACd,QAAmB,EACnB,OAAiB,EACjB,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAW;QACnB,YAAO,GAAP,OAAO,CAAU;QACjB,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACxB,CAAC;CACD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EndpointOptions } from './base-types.ts';
|
|
2
|
+
type RequestExecutor = {
|
|
3
|
+
request<T = unknown>(options: {
|
|
4
|
+
method: string;
|
|
5
|
+
path: string;
|
|
6
|
+
body?: unknown;
|
|
7
|
+
} & EndpointOptions<T>): Promise<T>;
|
|
8
|
+
};
|
|
9
|
+
export declare class Endpoint {
|
|
10
|
+
private client;
|
|
11
|
+
private path;
|
|
12
|
+
constructor(client: RequestExecutor, path: string);
|
|
13
|
+
endpoint(subPath: string): Endpoint;
|
|
14
|
+
methods<T extends Record<string, (...args: never[]) => unknown>>(methods: T): T;
|
|
15
|
+
get<T = unknown>(path?: string, options?: EndpointOptions<T>): Promise<T>;
|
|
16
|
+
post<T = unknown>(path?: string, body?: unknown, options?: EndpointOptions<T>): Promise<T>;
|
|
17
|
+
put<T = unknown>(path?: string, body?: unknown, options?: EndpointOptions<T>): Promise<T>;
|
|
18
|
+
patch<T = unknown>(path?: string, body?: unknown, options?: EndpointOptions<T>): Promise<T>;
|
|
19
|
+
delete<T = unknown>(path?: string, options?: EndpointOptions<T>): Promise<T>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../../../src/lib/client/internal/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,KAAK,eAAe,GAAG;IACtB,OAAO,CAAC,CAAC,GAAG,OAAO,EAClB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;KACf,GAAG,eAAe,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAAC;CACd,CAAC;AAEF,qBAAa,QAAQ;IAEnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;gBADJ,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM;IAGrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAKnC,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IAQ/E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,SAAK,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAItF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,SAAK,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class Endpoint {
|
|
2
|
+
client;
|
|
3
|
+
path;
|
|
4
|
+
constructor(client, path) {
|
|
5
|
+
this.client = client;
|
|
6
|
+
this.path = path;
|
|
7
|
+
}
|
|
8
|
+
endpoint(subPath) {
|
|
9
|
+
const cleanPath = subPath.startsWith('/') ? subPath : `/${subPath}`;
|
|
10
|
+
return new Endpoint(this.client, `${this.path}${cleanPath}`);
|
|
11
|
+
}
|
|
12
|
+
methods(methods) {
|
|
13
|
+
const bound = {};
|
|
14
|
+
for (const key of Object.keys(methods)) {
|
|
15
|
+
bound[key] = methods[key].bind(this);
|
|
16
|
+
}
|
|
17
|
+
return bound;
|
|
18
|
+
}
|
|
19
|
+
get(path = '', options) {
|
|
20
|
+
return this.client.request({ method: 'GET', path: `${this.path}${path}`, ...options });
|
|
21
|
+
}
|
|
22
|
+
post(path = '', body, options) {
|
|
23
|
+
return this.client.request({ method: 'POST', path: `${this.path}${path}`, body, ...options });
|
|
24
|
+
}
|
|
25
|
+
put(path = '', body, options) {
|
|
26
|
+
return this.client.request({ method: 'PUT', path: `${this.path}${path}`, body, ...options });
|
|
27
|
+
}
|
|
28
|
+
patch(path = '', body, options) {
|
|
29
|
+
return this.client.request({ method: 'PATCH', path: `${this.path}${path}`, body, ...options });
|
|
30
|
+
}
|
|
31
|
+
delete(path = '', options) {
|
|
32
|
+
return this.client.request({ method: 'DELETE', path: `${this.path}${path}`, ...options });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=endpoint.js.map
|