typedapi-client-helpers 0.2.0 → 0.3.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/CHANGELOG.md +68 -0
- package/LICENSE +21 -0
- package/README.md +221 -220
- package/dist/cjs/httpClient.js +258 -0
- package/dist/cjs/httpClient.js.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/ApiResult.js +3 -0
- package/dist/cjs/interfaces/ApiResult.js.map +1 -0
- package/dist/cjs/interfaces/Filter.js +3 -0
- package/dist/cjs/interfaces/Filter.js.map +1 -0
- package/dist/cjs/interfaces/SortType.js +3 -0
- package/dist/cjs/interfaces/SortType.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types/ApiCallOptions.js +3 -0
- package/dist/cjs/types/ApiCallOptions.js.map +1 -0
- package/dist/cjs/types/ApiMethodArguments.js +3 -0
- package/dist/cjs/types/ApiMethodArguments.js.map +1 -0
- package/dist/cjs/types/ApiMethodOptions.js +3 -0
- package/dist/cjs/types/ApiMethodOptions.js.map +1 -0
- package/dist/cjs/types/ApiMethodTypes.js +3 -0
- package/dist/cjs/types/ApiMethodTypes.js.map +1 -0
- package/dist/cjs/types/HttpResponse.js +3 -0
- package/dist/cjs/types/HttpResponse.js.map +1 -0
- package/dist/cjs/types/httpClientTypes.js +3 -0
- package/dist/cjs/types/httpClientTypes.js.map +1 -0
- package/dist/cjs/utils/SortTypeFromSortDirection.js +43 -0
- package/dist/cjs/utils/SortTypeFromSortDirection.js.map +1 -0
- package/dist/cjs/utils/buildQuery.js +96 -0
- package/dist/cjs/utils/buildQuery.js.map +1 -0
- package/dist/cjs/utils/extractArgsCallbacksAndParams.js +51 -0
- package/dist/cjs/utils/extractArgsCallbacksAndParams.js.map +1 -0
- package/dist/cjs/utils/extractArgsToastsAndParams.js +49 -0
- package/dist/cjs/utils/extractArgsToastsAndParams.js.map +1 -0
- package/dist/cjs/utils/handleApiResponse.js +124 -0
- package/dist/cjs/utils/handleApiResponse.js.map +1 -0
- package/dist/cjs/utils/toFormData.js +58 -0
- package/dist/cjs/utils/toFormData.js.map +1 -0
- package/dist/cjs/utils/wireMapping.js +123 -0
- package/dist/cjs/utils/wireMapping.js.map +1 -0
- package/dist/esm/httpClient.js +251 -0
- package/dist/esm/httpClient.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/ApiResult.js +2 -0
- package/dist/esm/interfaces/ApiResult.js.map +1 -0
- package/dist/esm/interfaces/Filter.js +2 -0
- package/dist/esm/interfaces/Filter.js.map +1 -0
- package/dist/esm/interfaces/SortType.js +2 -0
- package/dist/esm/interfaces/SortType.js.map +1 -0
- package/dist/esm/types/ApiCallOptions.js +2 -0
- package/dist/esm/types/ApiCallOptions.js.map +1 -0
- package/dist/esm/types/ApiMethodArguments.js +2 -0
- package/dist/esm/types/ApiMethodArguments.js.map +1 -0
- package/dist/esm/types/ApiMethodOptions.js +2 -0
- package/dist/esm/types/ApiMethodOptions.js.map +1 -0
- package/dist/esm/types/ApiMethodTypes.js +2 -0
- package/dist/esm/types/ApiMethodTypes.js.map +1 -0
- package/dist/esm/types/HttpResponse.js +2 -0
- package/dist/esm/types/HttpResponse.js.map +1 -0
- package/dist/esm/types/httpClientTypes.js +2 -0
- package/dist/esm/types/httpClientTypes.js.map +1 -0
- package/dist/esm/utils/SortTypeFromSortDirection.js +38 -0
- package/dist/esm/utils/SortTypeFromSortDirection.js.map +1 -0
- package/dist/esm/utils/buildQuery.js +93 -0
- package/dist/esm/utils/buildQuery.js.map +1 -0
- package/dist/esm/utils/extractArgsCallbacksAndParams.js +48 -0
- package/dist/esm/utils/extractArgsCallbacksAndParams.js.map +1 -0
- package/dist/esm/utils/extractArgsToastsAndParams.js +46 -0
- package/dist/esm/utils/extractArgsToastsAndParams.js.map +1 -0
- package/dist/esm/utils/handleApiResponse.js +121 -0
- package/dist/esm/utils/handleApiResponse.js.map +1 -0
- package/dist/esm/utils/toFormData.js +55 -0
- package/dist/esm/utils/toFormData.js.map +1 -0
- package/dist/esm/utils/wireMapping.js +119 -0
- package/dist/esm/utils/wireMapping.js.map +1 -0
- package/dist/types/httpClient.d.ts +63 -0
- package/dist/types/httpClient.d.ts.map +1 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/ApiResult.d.ts +32 -0
- package/dist/types/interfaces/ApiResult.d.ts.map +1 -0
- package/dist/types/interfaces/Filter.d.ts +31 -0
- package/dist/types/interfaces/Filter.d.ts.map +1 -0
- package/dist/types/interfaces/SortType.d.ts +7 -0
- package/dist/types/interfaces/SortType.d.ts.map +1 -0
- package/dist/types/types/ApiCallOptions.d.ts +26 -0
- package/dist/types/types/ApiCallOptions.d.ts.map +1 -0
- package/dist/types/types/ApiMethodArguments.d.ts +6 -0
- package/dist/types/types/ApiMethodArguments.d.ts.map +1 -0
- package/dist/types/types/ApiMethodOptions.d.ts +8 -0
- package/dist/types/types/ApiMethodOptions.d.ts.map +1 -0
- package/dist/types/types/ApiMethodTypes.d.ts +47 -0
- package/dist/types/types/ApiMethodTypes.d.ts.map +1 -0
- package/dist/types/types/HttpResponse.d.ts +2 -0
- package/dist/types/types/HttpResponse.d.ts.map +1 -0
- package/dist/types/types/httpClientTypes.d.ts +2 -0
- package/dist/types/types/httpClientTypes.d.ts.map +1 -0
- package/dist/types/utils/SortTypeFromSortDirection.d.ts +13 -0
- package/dist/types/utils/SortTypeFromSortDirection.d.ts.map +1 -0
- package/dist/types/utils/buildQuery.d.ts +16 -0
- package/dist/types/utils/buildQuery.d.ts.map +1 -0
- package/dist/types/utils/extractArgsCallbacksAndParams.d.ts +22 -0
- package/dist/types/utils/extractArgsCallbacksAndParams.d.ts.map +1 -0
- package/dist/types/utils/extractArgsToastsAndParams.d.ts +20 -0
- package/dist/types/utils/extractArgsToastsAndParams.d.ts.map +1 -0
- package/dist/types/utils/handleApiResponse.d.ts +11 -0
- package/dist/types/utils/handleApiResponse.d.ts.map +1 -0
- package/dist/types/utils/toFormData.d.ts +10 -0
- package/dist/types/utils/toFormData.d.ts.map +1 -0
- package/dist/types/utils/wireMapping.d.ts +30 -0
- package/dist/types/utils/wireMapping.d.ts.map +1 -0
- package/package.json +90 -82
- package/scripts/build.mjs +74 -0
- package/scripts/generate-api-minimal.mjs +568 -476
- package/scripts/openapi-generator/controller-template.mjs +1 -1
- package/scripts/openapi-generator/index.mjs +357 -113
- package/scripts/openapi-generator/method-template.mjs +201 -244
- package/scripts/openapi-generator/names.mjs +37 -86
- package/scripts/openapi-generator/openapi-utils.mjs +411 -147
- package/scripts/openapi-generator/schema.mjs +518 -238
- package/dist/index.cjs +0 -536
- package/dist/index.d.cts +0 -285
- package/dist/index.d.ts +0 -285
- package/dist/index.js +0 -495
|
@@ -1,476 +1,568 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { generateApi } from "./openapi-generator/index.mjs";
|
|
6
|
-
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = path.dirname(__filename);
|
|
9
|
-
|
|
10
|
-
const packageRoot = path.resolve(__dirname, "..");
|
|
11
|
-
const runtimePackageJsonPath = path.join(packageRoot, "package.json");
|
|
12
|
-
const runtimePackageJson = JSON.parse(
|
|
13
|
-
fs.readFileSync(runtimePackageJsonPath, "utf8"),
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
const consumerPackageJsonPath = path.resolve(process.cwd(), "package.json");
|
|
17
|
-
const consumerPackageJson = fs.existsSync(consumerPackageJsonPath)
|
|
18
|
-
? JSON.parse(fs.readFileSync(consumerPackageJsonPath, "utf8"))
|
|
19
|
-
: {};
|
|
20
|
-
|
|
21
|
-
const cwd = process.cwd();
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
process.env.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
process.env.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
process.env.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
if (
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
if (
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { generateApi } from "./openapi-generator/index.mjs";
|
|
6
|
+
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
|
|
10
|
+
const packageRoot = path.resolve(__dirname, "..");
|
|
11
|
+
const runtimePackageJsonPath = path.join(packageRoot, "package.json");
|
|
12
|
+
const runtimePackageJson = JSON.parse(
|
|
13
|
+
fs.readFileSync(runtimePackageJsonPath, "utf8"),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
const consumerPackageJsonPath = path.resolve(process.cwd(), "package.json");
|
|
17
|
+
const consumerPackageJson = fs.existsSync(consumerPackageJsonPath)
|
|
18
|
+
? JSON.parse(fs.readFileSync(consumerPackageJsonPath, "utf8"))
|
|
19
|
+
: {};
|
|
20
|
+
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
const cliArguments = new Set(process.argv.slice(2));
|
|
23
|
+
|
|
24
|
+
if (cliArguments.has("--help") || cliArguments.has("-h")) {
|
|
25
|
+
console.log(`typedapi-generate [options]
|
|
26
|
+
|
|
27
|
+
Options:
|
|
28
|
+
--check Fail when generated files differ
|
|
29
|
+
--strict Do not fall back to a stale Swagger backup
|
|
30
|
+
--offline Generate only from the configured Swagger backup
|
|
31
|
+
--verbose Print additional diagnostics
|
|
32
|
+
--help Show this help`);
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const checkMode = cliArguments.has("--check");
|
|
37
|
+
const strictMode = cliArguments.has("--strict");
|
|
38
|
+
const offlineMode = cliArguments.has("--offline");
|
|
39
|
+
const verboseMode = cliArguments.has("--verbose");
|
|
40
|
+
|
|
41
|
+
const config = {
|
|
42
|
+
...(runtimePackageJson.config ?? {}),
|
|
43
|
+
...(consumerPackageJson.config ?? {}),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const runtimePackageName =
|
|
47
|
+
path.resolve(cwd) === packageRoot ? "../.." : runtimePackageJson.name;
|
|
48
|
+
|
|
49
|
+
const swaggerFile = getStringSetting(
|
|
50
|
+
process.env.SWAGGER_FILE,
|
|
51
|
+
process.env.npm_config_swagger_file,
|
|
52
|
+
config.swaggerFile,
|
|
53
|
+
config.input,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const swaggerUrl = getStringSetting(
|
|
57
|
+
process.env.SWAGGER_URL,
|
|
58
|
+
process.env.npm_config_swagger_url,
|
|
59
|
+
config.swaggerUrl,
|
|
60
|
+
config.url,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const defaultSwaggerUrl = getStringSetting(
|
|
64
|
+
config.defaultSwaggerUrl,
|
|
65
|
+
"https://localhost:7000/swagger/v1/swagger.json",
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const swaggerBackupPath = path.resolve(
|
|
69
|
+
cwd,
|
|
70
|
+
getStringSetting(
|
|
71
|
+
process.env.TYPED_API_SWAGGER_BACKUP_FILE,
|
|
72
|
+
process.env.npm_config_typed_api_swagger_backup_file,
|
|
73
|
+
config.typedApiSwaggerBackupFile,
|
|
74
|
+
"swagger/swagger.backup.json",
|
|
75
|
+
),
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const swaggerDownloadTimeoutMs = getNumberSetting(
|
|
79
|
+
process.env.TYPED_API_DOWNLOAD_TIMEOUT_MS,
|
|
80
|
+
process.env.npm_config_typed_api_download_timeout_ms,
|
|
81
|
+
config.typedApiDownloadTimeoutMs,
|
|
82
|
+
15000,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const apiRoot = path.resolve(
|
|
86
|
+
cwd,
|
|
87
|
+
getStringSetting(
|
|
88
|
+
process.env.API_OUTPUT,
|
|
89
|
+
process.env.npm_config_api_output,
|
|
90
|
+
config.apiOutput,
|
|
91
|
+
config.output,
|
|
92
|
+
"src/api",
|
|
93
|
+
),
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const methodsDir = path.join(apiRoot, "methods");
|
|
97
|
+
|
|
98
|
+
const defaultFunctionsPathSetting = getStringSetting(
|
|
99
|
+
process.env.TYPED_API_DEFAULT_FUNCTIONS_PATH,
|
|
100
|
+
process.env.npm_config_typed_api_default_functions_path,
|
|
101
|
+
config.typedApiDefaultFunctionsPath,
|
|
102
|
+
"src/defaultApiFunctions",
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const defaultFunctionsFilePath = path.resolve(cwd, defaultFunctionsPathSetting);
|
|
106
|
+
|
|
107
|
+
const defaultSuccessHandlerName = getStringSetting(
|
|
108
|
+
process.env.TYPED_API_DEFAULT_SUCCESS_HANDLER,
|
|
109
|
+
process.env.npm_config_typed_api_default_success_handler,
|
|
110
|
+
config.typedApiDefaultSuccessHandler,
|
|
111
|
+
"handleGoodResult",
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const defaultErrorHandlerName = getStringSetting(
|
|
115
|
+
process.env.TYPED_API_DEFAULT_ERROR_HANDLER,
|
|
116
|
+
process.env.npm_config_typed_api_default_error_handler,
|
|
117
|
+
config.typedApiDefaultErrorHandler,
|
|
118
|
+
"handleErrors",
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const generatorOptions = {
|
|
122
|
+
cleanOutput: getBooleanSetting(
|
|
123
|
+
process.env.TYPED_API_CLEAN_OUTPUT,
|
|
124
|
+
process.env.npm_config_typed_api_clean_output,
|
|
125
|
+
process.env.npm_config_clean_output,
|
|
126
|
+
config.typedApiCleanOutput,
|
|
127
|
+
config.cleanOutput,
|
|
128
|
+
true,
|
|
129
|
+
),
|
|
130
|
+
moduleNameFirstTag: getBooleanSetting(
|
|
131
|
+
process.env.TYPED_API_MODULE_NAME_FIRST_TAG,
|
|
132
|
+
process.env.npm_config_typed_api_module_name_first_tag,
|
|
133
|
+
process.env.npm_config_module_name_first_tag,
|
|
134
|
+
config.typedApiModuleNameFirstTag,
|
|
135
|
+
config.moduleNameFirstTag,
|
|
136
|
+
true,
|
|
137
|
+
),
|
|
138
|
+
defaultResponseAsSuccess: getBooleanSetting(
|
|
139
|
+
process.env.TYPED_API_DEFAULT_RESPONSE_AS_SUCCESS,
|
|
140
|
+
process.env.npm_config_typed_api_default_response_as_success,
|
|
141
|
+
process.env.npm_config_default_response_as_success,
|
|
142
|
+
config.typedApiDefaultResponseAsSuccess,
|
|
143
|
+
config.defaultResponseAsSuccess,
|
|
144
|
+
false,
|
|
145
|
+
),
|
|
146
|
+
generateUnionEnums: getBooleanSetting(
|
|
147
|
+
process.env.TYPED_API_GENERATE_UNION_ENUMS,
|
|
148
|
+
process.env.npm_config_typed_api_generate_union_enums,
|
|
149
|
+
process.env.npm_config_generate_union_enums,
|
|
150
|
+
config.typedApiGenerateUnionEnums,
|
|
151
|
+
config.generateUnionEnums,
|
|
152
|
+
false,
|
|
153
|
+
),
|
|
154
|
+
enumNamesAsValues: getBooleanSetting(
|
|
155
|
+
process.env.TYPED_API_ENUM_NAMES_AS_VALUES,
|
|
156
|
+
process.env.npm_config_typed_api_enum_names_as_values,
|
|
157
|
+
process.env.npm_config_enum_names_as_values,
|
|
158
|
+
config.typedApiEnumNamesAsValues,
|
|
159
|
+
config.enumNamesAsValues,
|
|
160
|
+
false,
|
|
161
|
+
),
|
|
162
|
+
useTypeOnlyImports: getBooleanSetting(
|
|
163
|
+
process.env.TYPED_API_USE_TYPE_ONLY_IMPORTS,
|
|
164
|
+
process.env.npm_config_typed_api_use_type_only_imports,
|
|
165
|
+
process.env.npm_config_use_type_only_imports,
|
|
166
|
+
config.typedApiUseTypeOnlyImports,
|
|
167
|
+
config.useTypeOnlyImports,
|
|
168
|
+
true,
|
|
169
|
+
),
|
|
170
|
+
useFilterFormValues: getBooleanSetting(
|
|
171
|
+
process.env.TYPED_API_USE_FILTER_FORM_VALUES,
|
|
172
|
+
process.env.npm_config_typed_api_use_filter_form_values,
|
|
173
|
+
config.typedApiUseFilterFormValues,
|
|
174
|
+
true,
|
|
175
|
+
),
|
|
176
|
+
generateMissingOperationIds: getBooleanSetting(
|
|
177
|
+
process.env.TYPED_API_GENERATE_MISSING_OPERATION_IDS,
|
|
178
|
+
process.env.npm_config_typed_api_generate_missing_operation_ids,
|
|
179
|
+
config.typedApiGenerateMissingOperationIds,
|
|
180
|
+
false,
|
|
181
|
+
),
|
|
182
|
+
methodNameStyle: getMethodNameStyle(
|
|
183
|
+
process.env.TYPED_API_METHOD_NAME_STYLE,
|
|
184
|
+
process.env.npm_config_typed_api_method_name_style,
|
|
185
|
+
config.typedApiMethodNameStyle,
|
|
186
|
+
"operationId",
|
|
187
|
+
),
|
|
188
|
+
prefixMethodNamesWithController: getBooleanSetting(
|
|
189
|
+
process.env.TYPED_API_PREFIX_METHOD_NAMES_WITH_CONTROLLER,
|
|
190
|
+
process.env.npm_config_typed_api_prefix_method_names_with_controller,
|
|
191
|
+
config.typedApiPrefixMethodNamesWithController,
|
|
192
|
+
true,
|
|
193
|
+
),
|
|
194
|
+
check: checkMode,
|
|
195
|
+
baseUrl: getStringSetting(
|
|
196
|
+
process.env.TYPED_API_BASE_URL,
|
|
197
|
+
process.env.npm_config_typed_api_base_url,
|
|
198
|
+
config.typedApiBaseUrl,
|
|
199
|
+
),
|
|
200
|
+
runtimePackageName,
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
function getStringSetting(...values) {
|
|
204
|
+
for (const value of values) {
|
|
205
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
206
|
+
return value.trim();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function getMethodNameStyle(...values) {
|
|
214
|
+
const value = getStringSetting(...values) ?? "operationId";
|
|
215
|
+
const normalized = value.replace(/[\s_-]/g, "").toLowerCase();
|
|
216
|
+
|
|
217
|
+
if (["operationid", "operation"].includes(normalized)) return "operationId";
|
|
218
|
+
if (["action", "actionname", "controllermethod"].includes(normalized)) return "action";
|
|
219
|
+
|
|
220
|
+
throw new Error(
|
|
221
|
+
`Invalid typedApiMethodNameStyle ${JSON.stringify(value)}. Use "operationId" or "action".`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function getBooleanSetting(...values) {
|
|
226
|
+
const fallback = values[values.length - 1];
|
|
227
|
+
|
|
228
|
+
for (const value of values.slice(0, -1)) {
|
|
229
|
+
if (typeof value === "boolean") return value;
|
|
230
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
231
|
+
const normalized = value.trim().toLowerCase();
|
|
232
|
+
if (["1", "true", "yes", "on"].includes(normalized)) return true;
|
|
233
|
+
if (["0", "false", "no", "off"].includes(normalized)) return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return Boolean(fallback);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function getNumberSetting(...values) {
|
|
241
|
+
for (const value of values) {
|
|
242
|
+
const number = typeof value === "number" ? value : Number(value);
|
|
243
|
+
if (Number.isFinite(number) && number > 0) return number;
|
|
244
|
+
}
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function fileExists(filePath) {
|
|
249
|
+
try {
|
|
250
|
+
return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
|
|
251
|
+
} catch {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function displayPath(filePath) {
|
|
257
|
+
return path.relative(cwd, filePath) || ".";
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function writeSwaggerBackup(content, sourceLabel) {
|
|
261
|
+
fs.mkdirSync(path.dirname(swaggerBackupPath), { recursive: true });
|
|
262
|
+
const temporaryPath = `${swaggerBackupPath}.tmp-${process.pid}-${Date.now()}`;
|
|
263
|
+
fs.writeFileSync(temporaryPath, content);
|
|
264
|
+
fs.renameSync(temporaryPath, swaggerBackupPath);
|
|
265
|
+
|
|
266
|
+
console.log(
|
|
267
|
+
`Updated Swagger backup from ${sourceLabel}: ${displayPath(swaggerBackupPath)}`,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function copySwaggerBackupFromFile(filePath) {
|
|
272
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
273
|
+
JSON.parse(content);
|
|
274
|
+
writeSwaggerBackup(content, path.relative(cwd, filePath));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
async function downloadSwaggerBackupFromUrl(url) {
|
|
278
|
+
const controller = new AbortController();
|
|
279
|
+
const timeout = setTimeout(
|
|
280
|
+
() => controller.abort(new Error(`Swagger download timed out after ${swaggerDownloadTimeoutMs}ms.`)),
|
|
281
|
+
swaggerDownloadTimeoutMs,
|
|
282
|
+
);
|
|
283
|
+
let response;
|
|
284
|
+
try {
|
|
285
|
+
response = await fetch(url, { signal: controller.signal });
|
|
286
|
+
} finally {
|
|
287
|
+
clearTimeout(timeout);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (!response.ok) {
|
|
291
|
+
throw new Error(
|
|
292
|
+
`Swagger URL returned ${response.status} ${response.statusText}: ${url}`,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const content = await response.text();
|
|
297
|
+
JSON.parse(content);
|
|
298
|
+
writeSwaggerBackup(content, url);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function useBackupSwaggerInput(reason) {
|
|
302
|
+
if (!fileExists(swaggerBackupPath)) {
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
console.warn(
|
|
307
|
+
`${reason} Using Swagger backup: ${displayPath(swaggerBackupPath)}`,
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
return {
|
|
311
|
+
input: swaggerBackupPath,
|
|
312
|
+
label: swaggerBackupPath,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async function resolveSwaggerInput() {
|
|
317
|
+
if (offlineMode) {
|
|
318
|
+
if (!fileExists(swaggerBackupPath)) {
|
|
319
|
+
throw new Error(`Offline mode requires an existing Swagger backup: ${swaggerBackupPath}`);
|
|
320
|
+
}
|
|
321
|
+
return { input: swaggerBackupPath, label: swaggerBackupPath };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (swaggerFile) {
|
|
325
|
+
const swaggerFilePath = path.resolve(cwd, swaggerFile);
|
|
326
|
+
|
|
327
|
+
if (fileExists(swaggerFilePath)) {
|
|
328
|
+
copySwaggerBackupFromFile(swaggerFilePath);
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
input: swaggerFilePath,
|
|
332
|
+
label: swaggerFilePath,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const backupInput = strictMode
|
|
337
|
+
? undefined
|
|
338
|
+
: useBackupSwaggerInput(`Swagger file was not found: ${swaggerFilePath}.`);
|
|
339
|
+
|
|
340
|
+
if (backupInput) return backupInput;
|
|
341
|
+
|
|
342
|
+
throw new Error(
|
|
343
|
+
`Swagger file was not found and no backup exists: ${swaggerFilePath}`,
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (swaggerUrl) {
|
|
348
|
+
try {
|
|
349
|
+
await downloadSwaggerBackupFromUrl(swaggerUrl);
|
|
350
|
+
|
|
351
|
+
return {
|
|
352
|
+
input: swaggerBackupPath,
|
|
353
|
+
label: swaggerUrl,
|
|
354
|
+
};
|
|
355
|
+
} catch (error) {
|
|
356
|
+
const backupInput = strictMode
|
|
357
|
+
? undefined
|
|
358
|
+
: useBackupSwaggerInput(`Swagger URL is not available: ${swaggerUrl}.`);
|
|
359
|
+
|
|
360
|
+
if (backupInput) return backupInput;
|
|
361
|
+
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const defaultSwaggerFile = path.resolve(cwd, "swagger/swagger.json");
|
|
367
|
+
|
|
368
|
+
if (fileExists(defaultSwaggerFile)) {
|
|
369
|
+
copySwaggerBackupFromFile(defaultSwaggerFile);
|
|
370
|
+
|
|
371
|
+
return {
|
|
372
|
+
input: defaultSwaggerFile,
|
|
373
|
+
label: defaultSwaggerFile,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
try {
|
|
378
|
+
await downloadSwaggerBackupFromUrl(defaultSwaggerUrl);
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
input: swaggerBackupPath,
|
|
382
|
+
label: defaultSwaggerUrl,
|
|
383
|
+
};
|
|
384
|
+
} catch {
|
|
385
|
+
const backupInput = strictMode
|
|
386
|
+
? undefined
|
|
387
|
+
: useBackupSwaggerInput(
|
|
388
|
+
"Default Swagger file was not found and default Swagger URL is not available.",
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
if (backupInput) return backupInput;
|
|
392
|
+
|
|
393
|
+
throw new Error(
|
|
394
|
+
`No Swagger input found. Add swagger/swagger.json, configure swaggerFile, or configure swaggerUrl.`,
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function createImportStatement({ names, from, typeOnly = false }) {
|
|
400
|
+
const cleanNames = [...new Set(names.filter(Boolean))];
|
|
401
|
+
if (cleanNames.length === 0) return "";
|
|
402
|
+
const importKeyword = typeOnly ? "import type" : "import";
|
|
403
|
+
return `${importKeyword} { ${cleanNames.join(", ")} } from ${JSON.stringify(from)};`;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function createDefaultFunctionsFileIfMissing(filePath) {
|
|
407
|
+
const extension = path.extname(filePath);
|
|
408
|
+
const resolvedFilePath = extension ? filePath : `${filePath}.ts`;
|
|
409
|
+
|
|
410
|
+
if (fs.existsSync(resolvedFilePath)) {
|
|
411
|
+
return resolvedFilePath;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
fs.mkdirSync(path.dirname(resolvedFilePath), { recursive: true });
|
|
415
|
+
|
|
416
|
+
fs.writeFileSync(
|
|
417
|
+
resolvedFilePath,
|
|
418
|
+
`${createImportStatement({
|
|
419
|
+
names: ["ApiErrorResult", "ApiSuccessResult"],
|
|
420
|
+
from: runtimePackageName,
|
|
421
|
+
typeOnly: generatorOptions.useTypeOnlyImports !== false,
|
|
422
|
+
})}
|
|
423
|
+
|
|
424
|
+
export function ${defaultSuccessHandlerName}<T>(
|
|
425
|
+
_response: ApiSuccessResult<T>,
|
|
426
|
+
): void | Promise<void> {
|
|
427
|
+
// Add your default success handling here.
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export function ${defaultErrorHandlerName}<T>(
|
|
431
|
+
_error: ApiErrorResult<T>,
|
|
432
|
+
): void | Promise<void> {
|
|
433
|
+
// Add your default error handling here.
|
|
434
|
+
}
|
|
435
|
+
`,
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
console.log(
|
|
439
|
+
`Created default API handler file: ${path.relative(process.cwd(), resolvedFilePath)}`,
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
return resolvedFilePath;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function toRelativeImportPath(fromDirectory, filePath) {
|
|
446
|
+
let relativePath = path.relative(fromDirectory, filePath);
|
|
447
|
+
|
|
448
|
+
if (!relativePath.startsWith(".")) {
|
|
449
|
+
relativePath = `./${relativePath}`;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return relativePath
|
|
453
|
+
.replaceAll(path.sep, "/")
|
|
454
|
+
.replace(/\.(ts|tsx|js|jsx)$/, "");
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function escapeRegExp(value) {
|
|
458
|
+
return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
function fileExportsName(source, exportName) {
|
|
462
|
+
const escapedName = escapeRegExp(exportName);
|
|
463
|
+
|
|
464
|
+
const directExportPattern = new RegExp(
|
|
465
|
+
`export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+${escapedName}\\b`,
|
|
466
|
+
"m",
|
|
467
|
+
);
|
|
468
|
+
|
|
469
|
+
if (directExportPattern.test(source)) {
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
const namedExportBlocks = source.matchAll(/export\s*\{([\s\S]*?)\}/g);
|
|
474
|
+
|
|
475
|
+
for (const match of namedExportBlocks) {
|
|
476
|
+
const exportedNames = match[1]
|
|
477
|
+
.split(",")
|
|
478
|
+
.map((part) => part.trim())
|
|
479
|
+
.filter(Boolean);
|
|
480
|
+
|
|
481
|
+
if (
|
|
482
|
+
exportedNames.some((part) => {
|
|
483
|
+
const [localName, aliasName] = part
|
|
484
|
+
.split(/\s+as\s+/)
|
|
485
|
+
.map((name) => name.trim());
|
|
486
|
+
|
|
487
|
+
return (
|
|
488
|
+
aliasName === exportName || (!aliasName && localName === exportName)
|
|
489
|
+
);
|
|
490
|
+
})
|
|
491
|
+
) {
|
|
492
|
+
return true;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
return false;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function resolveDefaultHandlers() {
|
|
500
|
+
const candidatePath = path.extname(defaultFunctionsFilePath)
|
|
501
|
+
? defaultFunctionsFilePath
|
|
502
|
+
: `${defaultFunctionsFilePath}.ts`;
|
|
503
|
+
if (checkMode && !fs.existsSync(candidatePath)) {
|
|
504
|
+
if (verboseMode) console.log("Skipping missing default handler file in check mode.");
|
|
505
|
+
return undefined;
|
|
506
|
+
}
|
|
507
|
+
const defaultFunctionsFile = createDefaultFunctionsFileIfMissing(defaultFunctionsFilePath);
|
|
508
|
+
const source = fs.readFileSync(defaultFunctionsFile, "utf8");
|
|
509
|
+
const hasSuccessHandler = fileExportsName(source, defaultSuccessHandlerName);
|
|
510
|
+
const hasErrorHandler = fileExportsName(source, defaultErrorHandlerName);
|
|
511
|
+
|
|
512
|
+
if (!hasSuccessHandler || !hasErrorHandler) {
|
|
513
|
+
const missingNames = [
|
|
514
|
+
...(!hasSuccessHandler ? [defaultSuccessHandlerName] : []),
|
|
515
|
+
...(!hasErrorHandler ? [defaultErrorHandlerName] : []),
|
|
516
|
+
];
|
|
517
|
+
|
|
518
|
+
console.warn(
|
|
519
|
+
`Default API handlers were not imported because ${path.relative(
|
|
520
|
+
process.cwd(),
|
|
521
|
+
defaultFunctionsFile,
|
|
522
|
+
)} does not export: ${missingNames.join(", ")}.`,
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
return undefined;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return {
|
|
529
|
+
path: toRelativeImportPath(methodsDir, defaultFunctionsFile),
|
|
530
|
+
success: defaultSuccessHandlerName,
|
|
531
|
+
error: defaultErrorHandlerName,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
async function main() {
|
|
536
|
+
const swaggerInput = await resolveSwaggerInput();
|
|
537
|
+
|
|
538
|
+
console.log(`Generating API from: ${swaggerInput.label}`);
|
|
539
|
+
console.log(`Output folder: ${apiRoot}`);
|
|
540
|
+
console.log(
|
|
541
|
+
"Generator: local typedapi OpenAPI generator, function-only methods",
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
const result = await generateApi({
|
|
545
|
+
input: swaggerInput.input,
|
|
546
|
+
output: apiRoot,
|
|
547
|
+
...generatorOptions,
|
|
548
|
+
generatorVersion: runtimePackageJson.version,
|
|
549
|
+
defaultHandlers: resolveDefaultHandlers(),
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
for (const file of result.files) {
|
|
553
|
+
console.log(`Generated ${path.relative(cwd, file)}`);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (verboseMode && result.writeStrategy === "managed-file-sync") {
|
|
557
|
+
console.log(
|
|
558
|
+
"Used Windows-safe managed-file synchronization because the output directory could not be replaced atomically.",
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
console.log(checkMode ? "Generated API is up to date." : "API generation completed.");
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
main().catch((error) => {
|
|
566
|
+
console.error(error);
|
|
567
|
+
process.exit(1);
|
|
568
|
+
});
|