@levr-one/sdk 0.0.0-stage → 1.0.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 (108) hide show
  1. package/README.md +132 -2
  2. package/dist/client.config.d.ts +3 -0
  3. package/dist/client.config.js +5 -0
  4. package/dist/gen/_common/index.d.ts +3 -0
  5. package/dist/gen/_common/index.js +3 -0
  6. package/dist/gen/_common/types.d.ts +29 -0
  7. package/dist/gen/_common/types.js +2 -0
  8. package/dist/gen/_common/zod.d.ts +10 -0
  9. package/dist/gen/_common/zod.js +31 -0
  10. package/dist/gen/attachment-upload/functions.d.ts +14 -0
  11. package/dist/gen/attachment-upload/functions.js +28 -0
  12. package/dist/gen/attachment-upload/index.d.ts +4 -0
  13. package/dist/gen/attachment-upload/index.js +4 -0
  14. package/dist/gen/attachment-upload/types.d.ts +40 -0
  15. package/dist/gen/attachment-upload/types.js +2 -0
  16. package/dist/gen/attachment-upload/zod.d.ts +14 -0
  17. package/dist/gen/attachment-upload/zod.js +34 -0
  18. package/dist/gen/auth/functions.d.ts +22 -0
  19. package/dist/gen/auth/functions.js +32 -0
  20. package/dist/gen/auth/index.d.ts +4 -0
  21. package/dist/gen/auth/index.js +4 -0
  22. package/dist/gen/auth/types.d.ts +52 -0
  23. package/dist/gen/auth/types.js +2 -0
  24. package/dist/gen/auth/zod.d.ts +16 -0
  25. package/dist/gen/auth/zod.js +37 -0
  26. package/dist/gen/comment-issue/functions.d.ts +14 -0
  27. package/dist/gen/comment-issue/functions.js +18 -0
  28. package/dist/gen/comment-issue/index.d.ts +4 -0
  29. package/dist/gen/comment-issue/index.js +4 -0
  30. package/dist/gen/comment-issue/types.d.ts +40 -0
  31. package/dist/gen/comment-issue/types.js +2 -0
  32. package/dist/gen/comment-issue/zod.d.ts +14 -0
  33. package/dist/gen/comment-issue/zod.js +35 -0
  34. package/dist/gen/comment-run/functions.d.ts +14 -0
  35. package/dist/gen/comment-run/functions.js +18 -0
  36. package/dist/gen/comment-run/index.d.ts +4 -0
  37. package/dist/gen/comment-run/index.js +4 -0
  38. package/dist/gen/comment-run/types.d.ts +40 -0
  39. package/dist/gen/comment-run/types.js +2 -0
  40. package/dist/gen/comment-run/zod.d.ts +14 -0
  41. package/dist/gen/comment-run/zod.js +35 -0
  42. package/dist/gen/comment-test/functions.d.ts +14 -0
  43. package/dist/gen/comment-test/functions.js +18 -0
  44. package/dist/gen/comment-test/index.d.ts +4 -0
  45. package/dist/gen/comment-test/index.js +4 -0
  46. package/dist/gen/comment-test/types.d.ts +40 -0
  47. package/dist/gen/comment-test/types.js +2 -0
  48. package/dist/gen/comment-test/zod.d.ts +14 -0
  49. package/dist/gen/comment-test/zod.js +35 -0
  50. package/dist/gen/import/functions.d.ts +14 -0
  51. package/dist/gen/import/functions.js +28 -0
  52. package/dist/gen/import/index.d.ts +4 -0
  53. package/dist/gen/import/index.js +4 -0
  54. package/dist/gen/import/types.d.ts +90 -0
  55. package/dist/gen/import/types.js +2 -0
  56. package/dist/gen/import/zod.d.ts +14 -0
  57. package/dist/gen/import/zod.js +85 -0
  58. package/dist/gen/index.d.ts +15 -0
  59. package/dist/gen/index.js +15 -0
  60. package/dist/gen/issue/functions.d.ts +14 -0
  61. package/dist/gen/issue/functions.js +18 -0
  62. package/dist/gen/issue/index.d.ts +4 -0
  63. package/dist/gen/issue/index.js +4 -0
  64. package/dist/gen/issue/types.d.ts +125 -0
  65. package/dist/gen/issue/types.js +2 -0
  66. package/dist/gen/issue/zod.d.ts +10 -0
  67. package/dist/gen/issue/zod.js +114 -0
  68. package/dist/gen/issue-gate-verification/functions.d.ts +22 -0
  69. package/dist/gen/issue-gate-verification/functions.js +32 -0
  70. package/dist/gen/issue-gate-verification/index.d.ts +4 -0
  71. package/dist/gen/issue-gate-verification/index.js +4 -0
  72. package/dist/gen/issue-gate-verification/types.d.ts +46 -0
  73. package/dist/gen/issue-gate-verification/types.js +2 -0
  74. package/dist/gen/issue-gate-verification/zod.d.ts +12 -0
  75. package/dist/gen/issue-gate-verification/zod.js +38 -0
  76. package/dist/gen/run-api/functions.d.ts +14 -0
  77. package/dist/gen/run-api/functions.js +18 -0
  78. package/dist/gen/run-api/index.d.ts +4 -0
  79. package/dist/gen/run-api/index.js +4 -0
  80. package/dist/gen/run-api/types.d.ts +93 -0
  81. package/dist/gen/run-api/types.js +2 -0
  82. package/dist/gen/run-api/zod.d.ts +14 -0
  83. package/dist/gen/run-api/zod.js +57 -0
  84. package/dist/gen/team/functions.d.ts +14 -0
  85. package/dist/gen/team/functions.js +18 -0
  86. package/dist/gen/team/index.d.ts +4 -0
  87. package/dist/gen/team/index.js +4 -0
  88. package/dist/gen/team/types.d.ts +69 -0
  89. package/dist/gen/team/types.js +2 -0
  90. package/dist/gen/team/zod.d.ts +10 -0
  91. package/dist/gen/team/zod.js +58 -0
  92. package/dist/gen/test-case-import/functions.d.ts +22 -0
  93. package/dist/gen/test-case-import/functions.js +42 -0
  94. package/dist/gen/test-case-import/index.d.ts +4 -0
  95. package/dist/gen/test-case-import/index.js +4 -0
  96. package/dist/gen/test-case-import/types.d.ts +142 -0
  97. package/dist/gen/test-case-import/types.js +2 -0
  98. package/dist/gen/test-case-import/zod.d.ts +24 -0
  99. package/dist/gen/test-case-import/zod.js +129 -0
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.js +5 -0
  102. package/dist/runtime/client.d.ts +2 -0
  103. package/dist/runtime/client.js +229 -0
  104. package/dist/runtime/index.d.ts +3 -0
  105. package/dist/runtime/index.js +8 -0
  106. package/dist/runtime/types.d.ts +83 -0
  107. package/dist/runtime/types.js +1 -0
  108. package/package.json +41 -4
@@ -0,0 +1,229 @@
1
+ function createInterceptorManager() {
2
+ const _fns = [];
3
+ return {
4
+ _fns,
5
+ use(fn) {
6
+ _fns.push(fn);
7
+ },
8
+ eject(fn) {
9
+ const idx = _fns.indexOf(fn);
10
+ if (idx !== -1)
11
+ _fns[idx] = undefined;
12
+ },
13
+ };
14
+ }
15
+ function buildPath(urlTemplate, pathParams) {
16
+ if (!pathParams)
17
+ return urlTemplate;
18
+ return urlTemplate.replace(/\{(\w+)\}/g, (_, key) => {
19
+ const val = pathParams[key];
20
+ if (val === undefined)
21
+ return `{${key}}`;
22
+ const str = typeof val === 'object' && val !== null
23
+ ? JSON.stringify(val)
24
+ : String(val);
25
+ return encodeURIComponent(str);
26
+ });
27
+ }
28
+ function buildQuery(query) {
29
+ if (!query)
30
+ return '';
31
+ const params = new URLSearchParams();
32
+ for (const [key, value] of Object.entries(query)) {
33
+ if (value === null || value === undefined)
34
+ continue;
35
+ if (Array.isArray(value)) {
36
+ for (const item of value) {
37
+ if (item !== null && item !== undefined) {
38
+ params.append(key, String(item));
39
+ }
40
+ }
41
+ }
42
+ else if (typeof value === 'object') {
43
+ params.append(key, JSON.stringify(value));
44
+ }
45
+ else {
46
+ params.append(key, String(value));
47
+ }
48
+ }
49
+ const str = params.toString();
50
+ return str ? `?${str}` : '';
51
+ }
52
+ async function setAuthHeader(headers, config, security) {
53
+ if (!security?.length || !config.auth)
54
+ return;
55
+ const scheme = security[0];
56
+ if (!scheme)
57
+ return;
58
+ let token;
59
+ if (typeof config.auth === 'function') {
60
+ token = await config.auth(scheme);
61
+ }
62
+ else {
63
+ token = config.auth;
64
+ }
65
+ if (token) {
66
+ const prefix = token.startsWith('Bearer ') ? '' : 'Bearer ';
67
+ headers.set('Authorization', `${prefix}${token}`);
68
+ }
69
+ }
70
+ export function createClient(initialConfig = {}) {
71
+ let _config = { ...initialConfig };
72
+ const interceptors = {
73
+ request: createInterceptorManager(),
74
+ response: createInterceptorManager(),
75
+ error: createInterceptorManager(),
76
+ };
77
+ const getConfig = () => ({ ..._config });
78
+ const setConfig = (config) => {
79
+ _config = { ...config };
80
+ return getConfig();
81
+ };
82
+ const request = async (options) => {
83
+ const fetchFn = _config.fetch ?? globalThis.fetch;
84
+ const resolvedBase = typeof _config.baseUrl === 'function'
85
+ ? _config.baseUrl()
86
+ : _config.baseUrl;
87
+ const base = resolvedBase ?? '';
88
+ const pathStr = buildPath(options.url, options.path);
89
+ const queryStr = buildQuery(options.query);
90
+ const url = `${base}${pathStr}${queryStr}`;
91
+ const headers = new Headers();
92
+ if (_config.headers) {
93
+ for (const [k, v] of Object.entries(_config.headers)) {
94
+ headers.set(k, v);
95
+ }
96
+ }
97
+ if (options.headers) {
98
+ for (const [k, v] of Object.entries(options.headers)) {
99
+ headers.set(k, v);
100
+ }
101
+ }
102
+ if (_config.workspaceId) {
103
+ if (!headers.has('Workspace-Id')) {
104
+ headers.set('Workspace-Id', _config.workspaceId);
105
+ }
106
+ }
107
+ await setAuthHeader(headers, _config, options.security);
108
+ let body;
109
+ if (options.body !== undefined) {
110
+ if (options.bodySerializer) {
111
+ const serialized = options.bodySerializer(options.body);
112
+ if (serialized instanceof FormData) {
113
+ body = serialized;
114
+ headers.delete('Content-Type');
115
+ }
116
+ else {
117
+ body = serialized;
118
+ }
119
+ }
120
+ else if (options.body instanceof FormData) {
121
+ body = options.body;
122
+ headers.delete('Content-Type');
123
+ }
124
+ else {
125
+ body = JSON.stringify(options.body);
126
+ if (!headers.has('Content-Type')) {
127
+ headers.set('Content-Type', 'application/json');
128
+ }
129
+ }
130
+ }
131
+ else {
132
+ headers.delete('Content-Type');
133
+ }
134
+ if (options.requestValidator) {
135
+ await options.requestValidator(options);
136
+ }
137
+ let req = new Request(url, {
138
+ method: options.method ?? 'GET',
139
+ headers,
140
+ body,
141
+ redirect: 'follow',
142
+ credentials: 'include',
143
+ });
144
+ for (const fn of interceptors.request._fns) {
145
+ if (fn)
146
+ req = await fn(req, options);
147
+ }
148
+ let response = await fetchFn(req);
149
+ for (const fn of interceptors.response._fns) {
150
+ if (fn)
151
+ response = await fn(response, req, options);
152
+ }
153
+ const result = { request: req, response };
154
+ if (response.ok) {
155
+ if (response.status === 204 ||
156
+ response.headers.get('Content-Length') === '0') {
157
+ return {
158
+ ok: true,
159
+ data: {},
160
+ error: undefined,
161
+ ...result,
162
+ };
163
+ }
164
+ const parseAs = options.parseAs ?? 'json';
165
+ let data;
166
+ if (parseAs === 'stream') {
167
+ return {
168
+ ok: true,
169
+ data: response.body,
170
+ error: undefined,
171
+ ...result,
172
+ };
173
+ }
174
+ if (parseAs === 'auto' || parseAs === 'json') {
175
+ const ct = response.headers.get('Content-Type') ?? '';
176
+ if (ct.includes('json')) {
177
+ data = await response.json();
178
+ }
179
+ else {
180
+ data = await response.text();
181
+ }
182
+ }
183
+ else {
184
+ data = await response[parseAs]();
185
+ }
186
+ if (parseAs === 'json' && options.responseTransformer) {
187
+ data = await options.responseTransformer(data);
188
+ }
189
+ return {
190
+ ok: true,
191
+ data: data,
192
+ error: undefined,
193
+ ...result,
194
+ };
195
+ }
196
+ const textError = await response.text();
197
+ let jsonError;
198
+ try {
199
+ jsonError = JSON.parse(textError);
200
+ }
201
+ catch { }
202
+ let error = jsonError ?? textError;
203
+ for (const fn of interceptors.error._fns) {
204
+ if (fn)
205
+ error = await fn(error, response, req, options);
206
+ }
207
+ error = error || {};
208
+ if (options.throwOnError) {
209
+ throw error;
210
+ }
211
+ return {
212
+ ok: false,
213
+ data: undefined,
214
+ error: error,
215
+ ...result,
216
+ };
217
+ };
218
+ return {
219
+ getConfig,
220
+ setConfig,
221
+ request,
222
+ get: (options) => request({ ...options, method: 'GET' }),
223
+ post: (options) => request({ ...options, method: 'POST' }),
224
+ put: (options) => request({ ...options, method: 'PUT' }),
225
+ patch: (options) => request({ ...options, method: 'PATCH' }),
226
+ delete: (options) => request({ ...options, method: 'DELETE' }),
227
+ interceptors,
228
+ };
229
+ }
@@ -0,0 +1,3 @@
1
+ export { createClient } from './client.js';
2
+ export type { Client, ClientConfig, RequestOptions, RequestResult, Options, TDataShape, Config, CreateClientConfig, AuthScheme, InterceptorManager, } from './types.js';
3
+ export declare const client: import("./types.js").Client;
@@ -0,0 +1,8 @@
1
+ // Runtime client barrel
2
+ export { createClient } from './client.js';
3
+ // Default client instance. Point it elsewhere with `client.setConfig()`.
4
+ import { createClient } from './client.js';
5
+ const defaultConfig = {
6
+ baseUrl: 'https://api.levr.one',
7
+ };
8
+ export const client = createClient(defaultConfig);
@@ -0,0 +1,83 @@
1
+ export type AuthScheme = {
2
+ scheme: string;
3
+ type: string;
4
+ };
5
+ export interface ClientConfig {
6
+ baseUrl?: string | (() => string);
7
+ auth?: ((scheme: AuthScheme) => Promise<string> | string) | string;
8
+ headers?: Record<string, string>;
9
+ workspaceId?: string;
10
+ fetch?: typeof globalThis.fetch;
11
+ }
12
+ export interface RequestOptions {
13
+ url: string;
14
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
15
+ path?: Record<string, unknown>;
16
+ query?: Record<string, unknown>;
17
+ body?: unknown;
18
+ headers?: Record<string, string>;
19
+ security?: ReadonlyArray<AuthScheme>;
20
+ requestValidator?: (data: unknown) => Promise<unknown>;
21
+ responseTransformer?: (data: unknown) => Promise<unknown>;
22
+ throwOnError?: boolean;
23
+ client?: Client;
24
+ bodySerializer?: (body: unknown) => string | FormData | undefined;
25
+ parseAs?: 'json' | 'text' | 'blob' | 'arrayBuffer' | 'stream' | 'auto';
26
+ responseStyle?: 'data' | 'fields';
27
+ }
28
+ type UnwrapResponse<T> = T extends Record<string, unknown> ? keyof T extends never ? T : T[keyof T] : T;
29
+ export type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean> = ThrowOnError extends true ? Promise<{
30
+ ok: true;
31
+ data: UnwrapResponse<TData>;
32
+ request: Request;
33
+ response: Response;
34
+ }> : Promise<{
35
+ ok: true;
36
+ data: UnwrapResponse<TData>;
37
+ error: undefined;
38
+ request: Request;
39
+ response: Response;
40
+ } | {
41
+ ok: false;
42
+ data: undefined;
43
+ error: TError;
44
+ request: Request;
45
+ response: Response;
46
+ }>;
47
+ type InterceptorFn<T extends unknown[]> = (...args: T) => Promise<T[0]> | T[0];
48
+ export interface InterceptorManager<T extends unknown[]> {
49
+ use(fn: InterceptorFn<T>): void;
50
+ eject(fn: InterceptorFn<T>): void;
51
+ _fns: Array<InterceptorFn<T> | undefined>;
52
+ }
53
+ type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions, 'method'>) => RequestResult<TData, TError, ThrowOnError>;
54
+ export interface Client {
55
+ getConfig(): ClientConfig;
56
+ setConfig(config: ClientConfig): ClientConfig;
57
+ request: <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: RequestOptions) => RequestResult<TData, TError, ThrowOnError>;
58
+ get: MethodFn;
59
+ post: MethodFn;
60
+ put: MethodFn;
61
+ patch: MethodFn;
62
+ delete: MethodFn;
63
+ interceptors: {
64
+ request: InterceptorManager<[Request, RequestOptions]>;
65
+ response: InterceptorManager<[Response, Request, RequestOptions]>;
66
+ error: InterceptorManager<[unknown, Response, Request, RequestOptions]>;
67
+ };
68
+ }
69
+ export interface TDataShape {
70
+ body?: unknown;
71
+ headers?: unknown;
72
+ path?: unknown;
73
+ query?: unknown;
74
+ url: string;
75
+ }
76
+ type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>;
77
+ export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = OmitKeys<RequestOptions, 'body' | 'path' | 'query' | 'url' | 'method'> & Omit<TData, 'url'> & {
78
+ throwOnError?: ThrowOnError;
79
+ client?: Client;
80
+ };
81
+ export type Config = ClientConfig;
82
+ export type CreateClientConfig<T = ClientConfig> = (override?: Partial<T>) => T;
83
+ export {};
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "@levr-one/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "TypeScript SDK for the Levr API",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./client": {
15
+ "types": "./dist/runtime/index.d.ts",
16
+ "default": "./dist/runtime/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "author": "BitModern",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "zod": "^3.25.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/BitModern/levr.git",
37
+ "directory": "packages/sdk"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/BitModern/levr/issues"
41
+ },
42
+ "homepage": "https://github.com/BitModern/levr/tree/main/packages/sdk#readme"
43
+ }