@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.
Files changed (117) hide show
  1. package/SPEC.md +107 -0
  2. package/dist/factory.d.ts +34 -0
  3. package/dist/factory.d.ts.map +1 -0
  4. package/dist/factory.js +80 -0
  5. package/dist/factory.js.map +1 -0
  6. package/dist/index.d.ts +10 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +6 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/client/core.d.ts +8 -0
  11. package/dist/lib/client/core.d.ts.map +1 -0
  12. package/dist/lib/client/core.js +5 -0
  13. package/dist/lib/client/core.js.map +1 -0
  14. package/dist/lib/client/internal/base-client.d.ts +19 -0
  15. package/dist/lib/client/internal/base-client.d.ts.map +1 -0
  16. package/dist/lib/client/internal/base-client.js +92 -0
  17. package/dist/lib/client/internal/base-client.js.map +1 -0
  18. package/dist/lib/client/internal/base-helpers.d.ts +9 -0
  19. package/dist/lib/client/internal/base-helpers.d.ts.map +1 -0
  20. package/dist/lib/client/internal/base-helpers.js +79 -0
  21. package/dist/lib/client/internal/base-helpers.js.map +1 -0
  22. package/dist/lib/client/internal/base-types.d.ts +35 -0
  23. package/dist/lib/client/internal/base-types.d.ts.map +1 -0
  24. package/dist/lib/client/internal/base-types.js +15 -0
  25. package/dist/lib/client/internal/base-types.js.map +1 -0
  26. package/dist/lib/client/internal/endpoint.d.ts +22 -0
  27. package/dist/lib/client/internal/endpoint.d.ts.map +1 -0
  28. package/dist/lib/client/internal/endpoint.js +35 -0
  29. package/dist/lib/client/internal/endpoint.js.map +1 -0
  30. package/dist/lib/client/internal/generator.d.ts +20 -0
  31. package/dist/lib/client/internal/generator.d.ts.map +1 -0
  32. package/dist/lib/client/internal/generator.js +173 -0
  33. package/dist/lib/client/internal/generator.js.map +1 -0
  34. package/dist/lib/client/internal/index.d.ts +5 -0
  35. package/dist/lib/client/internal/index.d.ts.map +1 -0
  36. package/dist/lib/client/internal/index.js +4 -0
  37. package/dist/lib/client/internal/index.js.map +1 -0
  38. package/dist/lib/client/internal/node/http2-fetch.node.d.ts +2 -0
  39. package/dist/lib/client/internal/node/http2-fetch.node.d.ts.map +1 -0
  40. package/dist/lib/client/internal/node/http2-fetch.node.js +131 -0
  41. package/dist/lib/client/internal/node/http2-fetch.node.js.map +1 -0
  42. package/dist/lib/client/internal/request-builder.d.ts +15 -0
  43. package/dist/lib/client/internal/request-builder.d.ts.map +1 -0
  44. package/dist/lib/client/internal/request-builder.js +158 -0
  45. package/dist/lib/client/internal/request-builder.js.map +1 -0
  46. package/dist/lib/client/internal/sse-stream.d.ts +23 -0
  47. package/dist/lib/client/internal/sse-stream.d.ts.map +1 -0
  48. package/dist/lib/client/internal/sse-stream.js +110 -0
  49. package/dist/lib/client/internal/sse-stream.js.map +1 -0
  50. package/dist/lib/client/internal/vibes-client.d.ts +32 -0
  51. package/dist/lib/client/internal/vibes-client.d.ts.map +1 -0
  52. package/dist/lib/client/internal/vibes-client.js +120 -0
  53. package/dist/lib/client/internal/vibes-client.js.map +1 -0
  54. package/dist/lib/client/internal/wrap-fetch.d.ts +6 -0
  55. package/dist/lib/client/internal/wrap-fetch.d.ts.map +1 -0
  56. package/dist/lib/client/internal/wrap-fetch.js +46 -0
  57. package/dist/lib/client/internal/wrap-fetch.js.map +1 -0
  58. package/dist/lib/client/node.d.ts +5 -0
  59. package/dist/lib/client/node.d.ts.map +1 -0
  60. package/dist/lib/client/node.js +33 -0
  61. package/dist/lib/client/node.js.map +1 -0
  62. package/dist/lib/client/types.d.ts +145 -0
  63. package/dist/lib/client/types.d.ts.map +1 -0
  64. package/dist/lib/client/types.js +21 -0
  65. package/dist/lib/client/types.js.map +1 -0
  66. package/dist/plugin.d.ts +19 -0
  67. package/dist/plugin.d.ts.map +1 -0
  68. package/dist/plugin.js +80 -0
  69. package/dist/plugin.js.map +1 -0
  70. package/dist/schemas.d.ts +90 -0
  71. package/dist/schemas.d.ts.map +1 -0
  72. package/dist/schemas.js +9 -0
  73. package/dist/schemas.js.map +1 -0
  74. package/dist/sse-client.d.ts +39 -0
  75. package/dist/sse-client.d.ts.map +1 -0
  76. package/dist/sse-client.js +124 -0
  77. package/dist/sse-client.js.map +1 -0
  78. package/dist/tools/api-request/api-request.descriptor.d.ts +48 -0
  79. package/dist/tools/api-request/api-request.descriptor.d.ts.map +1 -0
  80. package/dist/tools/api-request/api-request.descriptor.js +27 -0
  81. package/dist/tools/api-request/api-request.descriptor.js.map +1 -0
  82. package/dist/tools/api-request/api-request.impl.consumer.d.ts +13 -0
  83. package/dist/tools/api-request/api-request.impl.consumer.d.ts.map +1 -0
  84. package/dist/tools/api-request/api-request.impl.consumer.js +51 -0
  85. package/dist/tools/api-request/api-request.impl.consumer.js.map +1 -0
  86. package/dist/tools/api-request/index.d.ts +5 -0
  87. package/dist/tools/api-request/index.d.ts.map +1 -0
  88. package/dist/tools/api-request/index.js +4 -0
  89. package/dist/tools/api-request/index.js.map +1 -0
  90. package/dist/tools/api-request/schemas/index.d.ts +33 -0
  91. package/dist/tools/api-request/schemas/index.d.ts.map +1 -0
  92. package/dist/tools/api-request/schemas/index.js +24 -0
  93. package/dist/tools/api-request/schemas/index.js.map +1 -0
  94. package/package.json +99 -0
  95. package/src/factory.ts +114 -0
  96. package/src/index.ts +15 -0
  97. package/src/lib/client/core.ts +13 -0
  98. package/src/lib/client/internal/base-client.ts +107 -0
  99. package/src/lib/client/internal/base-helpers.ts +74 -0
  100. package/src/lib/client/internal/base-types.ts +42 -0
  101. package/src/lib/client/internal/endpoint.ts +51 -0
  102. package/src/lib/client/internal/generator.ts +181 -0
  103. package/src/lib/client/internal/index.ts +4 -0
  104. package/src/lib/client/internal/node/http2-fetch.node.ts +138 -0
  105. package/src/lib/client/internal/request-builder.ts +147 -0
  106. package/src/lib/client/internal/sse-stream.ts +130 -0
  107. package/src/lib/client/internal/vibes-client.ts +167 -0
  108. package/src/lib/client/internal/wrap-fetch.ts +59 -0
  109. package/src/lib/client/node.ts +36 -0
  110. package/src/lib/client/types.ts +156 -0
  111. package/src/plugin.ts +104 -0
  112. package/src/schemas.ts +91 -0
  113. package/src/sse-client.ts +155 -0
  114. package/src/tools/api-request/api-request.descriptor.ts +28 -0
  115. package/src/tools/api-request/api-request.impl.consumer.ts +66 -0
  116. package/src/tools/api-request/index.ts +4 -0
  117. 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"}
@@ -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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"}
@@ -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,5 @@
1
+ export { VibesClient } from "./internal/vibes-client.js";
2
+ export { ClientError } from "./types.js";
3
+ export { BaseAPIClient } from "./internal/base-client.js";
4
+ export { Endpoint } from "./internal/endpoint.js";
5
+ //# sourceMappingURL=core.js.map
@@ -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