create-swagger-client 0.1.1 → 0.1.2
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/index.mjs +315 -0
- package/package.json +5 -10
- package/dist/index.js +0 -69
package/index.mjs
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import openapiTS, { astToString } from "openapi-typescript";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { resolve } from "path";
|
|
5
|
+
import * as tsMorph from "ts-morph";
|
|
6
|
+
|
|
7
|
+
var args = process.argv.slice(2);
|
|
8
|
+
var source = args[0];
|
|
9
|
+
var outPut = args[1] || "client-api.ts";
|
|
10
|
+
if (!source) {
|
|
11
|
+
console.error("Please provide a source URL or file path.");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
var isUrl = (str) => {
|
|
15
|
+
try {
|
|
16
|
+
new URL(str);
|
|
17
|
+
return true;
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
async function generate() {
|
|
23
|
+
if (!source)
|
|
24
|
+
return;
|
|
25
|
+
if (isUrl(source) === false) {
|
|
26
|
+
source = resolve(process.cwd(), source);
|
|
27
|
+
}
|
|
28
|
+
const spinner = ora(`Generating API client from ${source}...`).start();
|
|
29
|
+
const ast = await openapiTS(source);
|
|
30
|
+
const contents = astToString(ast);
|
|
31
|
+
const project = new tsMorph.Project;
|
|
32
|
+
const sourceFile = project.createSourceFile(resolve(process.cwd(), outPut), contents, {
|
|
33
|
+
overwrite: true
|
|
34
|
+
});
|
|
35
|
+
sourceFile.addTypeAlias({
|
|
36
|
+
name: "RestMethod",
|
|
37
|
+
isExported: true,
|
|
38
|
+
type: '"get" | "post" | "put" | "delete" | "patch"'
|
|
39
|
+
});
|
|
40
|
+
sourceFile.addTypeAlias({
|
|
41
|
+
name: "KeyPaths",
|
|
42
|
+
isExported: true,
|
|
43
|
+
type: "keyof paths"
|
|
44
|
+
});
|
|
45
|
+
sourceFile.addTypeAlias({
|
|
46
|
+
name: "ExtractPathParams",
|
|
47
|
+
isExported: true,
|
|
48
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
49
|
+
type: "paths[T][K] extends { parameters: { path?: infer P } } ? P : never"
|
|
50
|
+
});
|
|
51
|
+
sourceFile.addTypeAlias({
|
|
52
|
+
name: "ExtractQueryParams",
|
|
53
|
+
isExported: true,
|
|
54
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
55
|
+
type: "paths[T][K] extends { parameters: { query?: infer Q } } ? Q : never"
|
|
56
|
+
});
|
|
57
|
+
sourceFile.addTypeAlias({
|
|
58
|
+
name: "ExtractHeaderParams",
|
|
59
|
+
isExported: true,
|
|
60
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
61
|
+
type: "paths[T][K] extends { parameters: { header?: infer H } } ? H : never"
|
|
62
|
+
});
|
|
63
|
+
sourceFile.addTypeAlias({
|
|
64
|
+
name: "ExtractBody",
|
|
65
|
+
isExported: true,
|
|
66
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
67
|
+
type: `paths[T][K] extends {
|
|
68
|
+
requestBody: { content: { "application/json": infer B } };
|
|
69
|
+
}
|
|
70
|
+
? B
|
|
71
|
+
: never`
|
|
72
|
+
});
|
|
73
|
+
sourceFile.addTypeAlias({
|
|
74
|
+
name: "APIResponse",
|
|
75
|
+
isExported: true,
|
|
76
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
77
|
+
type: `paths[T][K] extends {
|
|
78
|
+
responses:
|
|
79
|
+
| { content: { "application/json": infer R } }
|
|
80
|
+
| { [code: number]: { content: { "application/json": infer R } } };
|
|
81
|
+
}
|
|
82
|
+
? R
|
|
83
|
+
: unknown`
|
|
84
|
+
});
|
|
85
|
+
sourceFile.addTypeAlias({
|
|
86
|
+
name: "ApiPayload",
|
|
87
|
+
isExported: true,
|
|
88
|
+
typeParameters: ["T extends KeyPaths", "K extends RestMethod"],
|
|
89
|
+
type: `{
|
|
90
|
+
path?: ExtractPathParams<T, K>;
|
|
91
|
+
query?: ExtractQueryParams<T, K>;
|
|
92
|
+
body?: K extends "post" | "put" | "patch" ? ExtractBody<T, K> : never;
|
|
93
|
+
headers?: ExtractHeaderParams<T, K>;
|
|
94
|
+
}`
|
|
95
|
+
});
|
|
96
|
+
sourceFile.addTypeAlias({
|
|
97
|
+
name: "ApiClientType",
|
|
98
|
+
isExported: true,
|
|
99
|
+
type: `{
|
|
100
|
+
[K in RestMethod]: <T extends KeyPaths>(
|
|
101
|
+
path: T,
|
|
102
|
+
payload?: ApiPayload<T, K>,
|
|
103
|
+
) => Promise<APIResponse<T, K>>;
|
|
104
|
+
}`
|
|
105
|
+
});
|
|
106
|
+
sourceFile.addTypeAlias({
|
|
107
|
+
name: "TypePaths",
|
|
108
|
+
typeParameters: ["T extends RestMethod"],
|
|
109
|
+
type: `{
|
|
110
|
+
[K in KeyPaths]: paths[K] extends { [M in T]: unknown } ? K : never;
|
|
111
|
+
}[KeyPaths]`
|
|
112
|
+
});
|
|
113
|
+
sourceFile.addClass({
|
|
114
|
+
name: "RestApiClient",
|
|
115
|
+
isExported: true,
|
|
116
|
+
ctors: [
|
|
117
|
+
{
|
|
118
|
+
parameters: [
|
|
119
|
+
{ name: "basePath", type: "string", scope: tsMorph.Scope.Private },
|
|
120
|
+
{
|
|
121
|
+
name: "option",
|
|
122
|
+
type: "RequestInit",
|
|
123
|
+
hasQuestionToken: true,
|
|
124
|
+
scope: tsMorph.Scope.Private
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
methods: [
|
|
130
|
+
{
|
|
131
|
+
name: "fetcher",
|
|
132
|
+
scope: tsMorph.Scope.Public,
|
|
133
|
+
isAsync: true,
|
|
134
|
+
parameters: [
|
|
135
|
+
{ name: "input", type: "RequestInfo" },
|
|
136
|
+
{ name: "init", type: "RequestInit", hasQuestionToken: true }
|
|
137
|
+
],
|
|
138
|
+
statements: `const headers = {
|
|
139
|
+
"Content-Type": "application/json",
|
|
140
|
+
...init?.headers,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const response = await fetch(input, { ...init, headers });
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
const errorBody = await response.text();
|
|
146
|
+
throw new Error(
|
|
147
|
+
\`API request failed: \${response.status} \${response.statusText} - \${errorBody}\`,
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
return response.json();`
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "request",
|
|
154
|
+
typeParameters: ["M extends RestMethod", "P extends TypePaths<M>"],
|
|
155
|
+
parameters: [
|
|
156
|
+
{ name: "method", type: "M" },
|
|
157
|
+
{ name: "path", type: "P" },
|
|
158
|
+
{
|
|
159
|
+
name: "init",
|
|
160
|
+
type: "ApiPayload<P, M>",
|
|
161
|
+
initializer: "{} as ApiPayload<P, M>"
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
returnType: "Promise<APIResponse<P, M>>",
|
|
165
|
+
statements: `const url = new URL(this.basePath + String(path));
|
|
166
|
+
|
|
167
|
+
url.pathname = this.buildPathUrl(url.pathname, init.path);
|
|
168
|
+
this.appendQueryParams(url, init.query);
|
|
169
|
+
|
|
170
|
+
const requestInit: RequestInit = {
|
|
171
|
+
method: method.toUpperCase(),
|
|
172
|
+
...this.option,
|
|
173
|
+
headers: {
|
|
174
|
+
...(this.option?.headers ?? {}),
|
|
175
|
+
...(init.headers ?? {}),
|
|
176
|
+
},
|
|
177
|
+
body: this.prepareBody(method, init.body),
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
return this.fetcher(url.toString(), requestInit) as Promise<
|
|
181
|
+
APIResponse<P, M>
|
|
182
|
+
>;`
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "get",
|
|
186
|
+
scope: tsMorph.Scope.Public,
|
|
187
|
+
typeParameters: ['T extends TypePaths<"get">'],
|
|
188
|
+
parameters: [
|
|
189
|
+
{ name: "path", type: "T" },
|
|
190
|
+
{
|
|
191
|
+
name: "payload",
|
|
192
|
+
type: 'ApiPayload<T, "get">',
|
|
193
|
+
hasQuestionToken: true
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
returnType: 'Promise<APIResponse<T, "get">>',
|
|
197
|
+
statements: 'return this.request("get", path, payload);'
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "post",
|
|
201
|
+
scope: tsMorph.Scope.Public,
|
|
202
|
+
typeParameters: ['T extends TypePaths<"post">'],
|
|
203
|
+
parameters: [
|
|
204
|
+
{ name: "path", type: "T" },
|
|
205
|
+
{
|
|
206
|
+
name: "payload",
|
|
207
|
+
type: 'ApiPayload<T, "post">',
|
|
208
|
+
hasQuestionToken: true
|
|
209
|
+
}
|
|
210
|
+
],
|
|
211
|
+
returnType: 'Promise<APIResponse<T, "post">>',
|
|
212
|
+
statements: 'return this.request("post", path, payload);'
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "put",
|
|
216
|
+
scope: tsMorph.Scope.Public,
|
|
217
|
+
typeParameters: ['T extends TypePaths<"put">'],
|
|
218
|
+
parameters: [
|
|
219
|
+
{ name: "path", type: "T" },
|
|
220
|
+
{
|
|
221
|
+
name: "payload",
|
|
222
|
+
type: 'ApiPayload<T, "put">',
|
|
223
|
+
hasQuestionToken: true
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
returnType: 'Promise<APIResponse<T, "put">>',
|
|
227
|
+
statements: 'return this.request("put", path, payload);'
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: "delete",
|
|
231
|
+
scope: tsMorph.Scope.Public,
|
|
232
|
+
typeParameters: ['T extends TypePaths<"delete">'],
|
|
233
|
+
parameters: [
|
|
234
|
+
{ name: "path", type: "T" },
|
|
235
|
+
{
|
|
236
|
+
name: "payload",
|
|
237
|
+
type: 'ApiPayload<T, "delete">',
|
|
238
|
+
hasQuestionToken: true
|
|
239
|
+
}
|
|
240
|
+
],
|
|
241
|
+
returnType: 'Promise<APIResponse<T, "delete">>',
|
|
242
|
+
statements: 'return this.request("delete", path, payload);'
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
name: "patch",
|
|
246
|
+
scope: tsMorph.Scope.Public,
|
|
247
|
+
typeParameters: ['T extends TypePaths<"patch">'],
|
|
248
|
+
parameters: [
|
|
249
|
+
{ name: "path", type: "T" },
|
|
250
|
+
{
|
|
251
|
+
name: "payload",
|
|
252
|
+
type: 'ApiPayload<T, "patch">',
|
|
253
|
+
hasQuestionToken: true
|
|
254
|
+
}
|
|
255
|
+
],
|
|
256
|
+
returnType: 'Promise<APIResponse<T, "patch">>',
|
|
257
|
+
statements: 'return this.request("patch", path, payload);'
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "buildPathUrl",
|
|
261
|
+
scope: tsMorph.Scope.Private,
|
|
262
|
+
parameters: [
|
|
263
|
+
{ name: "basePath", type: "string" },
|
|
264
|
+
{ name: "pathParams", type: "unknown", hasQuestionToken: true }
|
|
265
|
+
],
|
|
266
|
+
returnType: "string",
|
|
267
|
+
statements: `let pathname = basePath;
|
|
268
|
+
if (pathParams != null) {
|
|
269
|
+
const params = pathParams as Record<string, unknown>;
|
|
270
|
+
pathname = decodeURIComponent(pathname).replace(/{(w+)}/g, (_, key) =>
|
|
271
|
+
encodeURIComponent(String(params[key])),
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
return pathname;`
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
name: "prepareBody",
|
|
278
|
+
scope: tsMorph.Scope.Private,
|
|
279
|
+
parameters: [
|
|
280
|
+
{ name: "method", type: "RestMethod" },
|
|
281
|
+
{ name: "body", type: "unknown", hasQuestionToken: true }
|
|
282
|
+
],
|
|
283
|
+
returnType: "string | undefined",
|
|
284
|
+
statements: `if (body && ["post", "put", "patch"].includes(method)) {
|
|
285
|
+
return JSON.stringify(body);
|
|
286
|
+
}
|
|
287
|
+
return undefined;`
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: "appendQueryParams",
|
|
291
|
+
scope: tsMorph.Scope.Private,
|
|
292
|
+
parameters: [
|
|
293
|
+
{ name: "url", type: "URL" },
|
|
294
|
+
{ name: "queryParams", type: "unknown", hasQuestionToken: true }
|
|
295
|
+
],
|
|
296
|
+
returnType: "void",
|
|
297
|
+
statements: `if (queryParams != null) {
|
|
298
|
+
const params = queryParams as Record<string, unknown>;
|
|
299
|
+
for (const [key, value] of Object.entries(params)) {
|
|
300
|
+
if (value !== undefined && value !== null) {
|
|
301
|
+
url.searchParams.append(key, String(value));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}`
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
});
|
|
308
|
+
await sourceFile.formatText();
|
|
309
|
+
await project.save();
|
|
310
|
+
spinner.stopAndPersist({
|
|
311
|
+
symbol: "✔",
|
|
312
|
+
text: `API client generated at ${resolve(process.cwd(), outPut)}`
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
generate();
|
package/package.json
CHANGED
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-swagger-client",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Generate fully type-safe REST API clients from OpenAPI/Swagger specifications",
|
|
5
|
-
"main": "./
|
|
6
|
-
"module": "./
|
|
5
|
+
"main": "./index.mjs",
|
|
6
|
+
"module": "./index.mjs",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"create-swagger-client": "./
|
|
9
|
+
"create-swagger-client": "./index.mjs"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
|
-
"
|
|
12
|
+
"index.mjs"
|
|
13
13
|
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "bun build index.ts --minify --outdir dist --target=node --external openapi-typescript --external ts-morph --external ora",
|
|
16
|
-
"typecheck": "tsc --noEmit",
|
|
17
|
-
"prepublishOnly": "bun run build"
|
|
18
|
-
},
|
|
19
14
|
"keywords": [
|
|
20
15
|
"openapi",
|
|
21
16
|
"swagger",
|
package/dist/index.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import y,{astToString as m}from"openapi-typescript";import h from"ora";import{resolve as r}from"path";import*as e from"ts-morph";var o=process.argv.slice(2),a=o[0],p=o[1]||"client-api.ts";if(!a)console.error("Please provide a source URL or file path."),process.exit(1);var u=(s)=>{try{return new URL(s),!0}catch{return!1}};async function c(){if(!a)return;if(u(a)===!1)a=r(process.cwd(),a);let s=h(`Generating API client from ${a}...`).start(),i=await y(a),d=m(i),n=new e.Project,t=n.createSourceFile(r(process.cwd(),p),d,{overwrite:!0});t.addTypeAlias({name:"RestMethod",isExported:!0,type:'"get" | "post" | "put" | "delete" | "patch"'}),t.addTypeAlias({name:"KeyPaths",isExported:!0,type:"keyof paths"}),t.addTypeAlias({name:"ExtractPathParams",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:"paths[T][K] extends { parameters: { path?: infer P } } ? P : never"}),t.addTypeAlias({name:"ExtractQueryParams",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:"paths[T][K] extends { parameters: { query?: infer Q } } ? Q : never"}),t.addTypeAlias({name:"ExtractHeaderParams",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:"paths[T][K] extends { parameters: { header?: infer H } } ? H : never"}),t.addTypeAlias({name:"ExtractBody",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:`paths[T][K] extends {
|
|
2
|
-
requestBody: { content: { "application/json": infer B } };
|
|
3
|
-
}
|
|
4
|
-
? B
|
|
5
|
-
: never`}),t.addTypeAlias({name:"APIResponse",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:`paths[T][K] extends {
|
|
6
|
-
responses:
|
|
7
|
-
| { content: { "application/json": infer R } }
|
|
8
|
-
| { [code: number]: { content: { "application/json": infer R } } };
|
|
9
|
-
}
|
|
10
|
-
? R
|
|
11
|
-
: unknown`}),t.addTypeAlias({name:"ApiPayload",isExported:!0,typeParameters:["T extends KeyPaths","K extends RestMethod"],type:`{
|
|
12
|
-
path?: ExtractPathParams<T, K>;
|
|
13
|
-
query?: ExtractQueryParams<T, K>;
|
|
14
|
-
body?: K extends "post" | "put" | "patch" ? ExtractBody<T, K> : never;
|
|
15
|
-
headers?: ExtractHeaderParams<T, K>;
|
|
16
|
-
}`}),t.addTypeAlias({name:"ApiClientType",isExported:!0,type:`{
|
|
17
|
-
[K in RestMethod]: <T extends KeyPaths>(
|
|
18
|
-
path: T,
|
|
19
|
-
payload?: ApiPayload<T, K>,
|
|
20
|
-
) => Promise<APIResponse<T, K>>;
|
|
21
|
-
}`}),t.addTypeAlias({name:"TypePaths",typeParameters:["T extends RestMethod"],type:`{
|
|
22
|
-
[K in KeyPaths]: paths[K] extends { [M in T]: unknown } ? K : never;
|
|
23
|
-
}[KeyPaths]`}),t.addClass({name:"RestApiClient",isExported:!0,ctors:[{parameters:[{name:"basePath",type:"string",scope:e.Scope.Private},{name:"option",type:"RequestInit",hasQuestionToken:!0,scope:e.Scope.Private}]}],methods:[{name:"fetcher",scope:e.Scope.Public,isAsync:!0,parameters:[{name:"input",type:"RequestInfo"},{name:"init",type:"RequestInit",hasQuestionToken:!0}],statements:`const headers = {
|
|
24
|
-
"Content-Type": "application/json",
|
|
25
|
-
...init?.headers,
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const response = await fetch(input, { ...init, headers });
|
|
29
|
-
if (!response.ok) {
|
|
30
|
-
const errorBody = await response.text();
|
|
31
|
-
throw new Error(
|
|
32
|
-
\`API request failed: \${response.status} \${response.statusText} - \${errorBody}\`,
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
return response.json();`},{name:"request",typeParameters:["M extends RestMethod","P extends TypePaths<M>"],parameters:[{name:"method",type:"M"},{name:"path",type:"P"},{name:"init",type:"ApiPayload<P, M>",initializer:"{} as ApiPayload<P, M>"}],returnType:"Promise<APIResponse<P, M>>",statements:`const url = new URL(this.basePath + String(path));
|
|
36
|
-
|
|
37
|
-
url.pathname = this.buildPathUrl(url.pathname, init.path);
|
|
38
|
-
this.appendQueryParams(url, init.query);
|
|
39
|
-
|
|
40
|
-
const requestInit: RequestInit = {
|
|
41
|
-
method: method.toUpperCase(),
|
|
42
|
-
...this.option,
|
|
43
|
-
headers: {
|
|
44
|
-
...(this.option?.headers ?? {}),
|
|
45
|
-
...(init.headers ?? {}),
|
|
46
|
-
},
|
|
47
|
-
body: this.prepareBody(method, init.body),
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
return this.fetcher(url.toString(), requestInit) as Promise<
|
|
51
|
-
APIResponse<P, M>
|
|
52
|
-
>;`},{name:"get",scope:e.Scope.Public,typeParameters:['T extends TypePaths<"get">'],parameters:[{name:"path",type:"T"},{name:"payload",type:'ApiPayload<T, "get">',hasQuestionToken:!0}],returnType:'Promise<APIResponse<T, "get">>',statements:'return this.request("get", path, payload);'},{name:"post",scope:e.Scope.Public,typeParameters:['T extends TypePaths<"post">'],parameters:[{name:"path",type:"T"},{name:"payload",type:'ApiPayload<T, "post">',hasQuestionToken:!0}],returnType:'Promise<APIResponse<T, "post">>',statements:'return this.request("post", path, payload);'},{name:"put",scope:e.Scope.Public,typeParameters:['T extends TypePaths<"put">'],parameters:[{name:"path",type:"T"},{name:"payload",type:'ApiPayload<T, "put">',hasQuestionToken:!0}],returnType:'Promise<APIResponse<T, "put">>',statements:'return this.request("put", path, payload);'},{name:"delete",scope:e.Scope.Public,typeParameters:['T extends TypePaths<"delete">'],parameters:[{name:"path",type:"T"},{name:"payload",type:'ApiPayload<T, "delete">',hasQuestionToken:!0}],returnType:'Promise<APIResponse<T, "delete">>',statements:'return this.request("delete", path, payload);'},{name:"patch",scope:e.Scope.Public,typeParameters:['T extends TypePaths<"patch">'],parameters:[{name:"path",type:"T"},{name:"payload",type:'ApiPayload<T, "patch">',hasQuestionToken:!0}],returnType:'Promise<APIResponse<T, "patch">>',statements:'return this.request("patch", path, payload);'},{name:"buildPathUrl",scope:e.Scope.Private,parameters:[{name:"basePath",type:"string"},{name:"pathParams",type:"unknown",hasQuestionToken:!0}],returnType:"string",statements:`let pathname = basePath;
|
|
53
|
-
if (pathParams != null) {
|
|
54
|
-
const params = pathParams as Record<string, unknown>;
|
|
55
|
-
pathname = decodeURIComponent(pathname).replace(/{(w+)}/g, (_, key) =>
|
|
56
|
-
encodeURIComponent(String(params[key])),
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
return pathname;`},{name:"prepareBody",scope:e.Scope.Private,parameters:[{name:"method",type:"RestMethod"},{name:"body",type:"unknown",hasQuestionToken:!0}],returnType:"string | undefined",statements:`if (body && ["post", "put", "patch"].includes(method)) {
|
|
60
|
-
return JSON.stringify(body);
|
|
61
|
-
}
|
|
62
|
-
return undefined;`},{name:"appendQueryParams",scope:e.Scope.Private,parameters:[{name:"url",type:"URL"},{name:"queryParams",type:"unknown",hasQuestionToken:!0}],returnType:"void",statements:`if (queryParams != null) {
|
|
63
|
-
const params = queryParams as Record<string, unknown>;
|
|
64
|
-
for (const [key, value] of Object.entries(params)) {
|
|
65
|
-
if (value !== undefined && value !== null) {
|
|
66
|
-
url.searchParams.append(key, String(value));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}`}]}),await t.formatText(),await n.save(),s.stopAndPersist({symbol:"✔",text:`API client generated at ${r(process.cwd(),p)}`})}c();
|