react-query-lightbase-codegen 1.6.3 → 2.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 (52) hide show
  1. package/dist/config/loadConfig.d.ts +2 -0
  2. package/dist/config/loadConfig.js +24 -0
  3. package/dist/generator/clientGenerator.d.ts +13 -0
  4. package/dist/generator/clientGenerator.js +199 -0
  5. package/dist/generator/instanceGenerator.d.ts +1 -0
  6. package/dist/generator/instanceGenerator.js +21 -0
  7. package/dist/generator/reactQueryGenerator.d.ts +2 -0
  8. package/dist/generator/reactQueryGenerator.js +82 -0
  9. package/dist/generator/schemaGenerator.d.ts +5 -0
  10. package/dist/generator/schemaGenerator.js +116 -0
  11. package/dist/index.d.ts +5 -3
  12. package/dist/index.js +106 -4
  13. package/dist/types/config.d.ts +11 -0
  14. package/dist/types/config.js +2 -0
  15. package/dist/types.d.ts +5 -0
  16. package/dist/types.js +2 -0
  17. package/dist/utils.d.ts +31 -20
  18. package/dist/utils.js +57 -179
  19. package/package.json +54 -82
  20. package/readme.md +94 -0
  21. package/src/config/loadConfig.ts +25 -0
  22. package/src/generator/clientGenerator.ts +234 -0
  23. package/src/generator/instanceGenerator.ts +20 -0
  24. package/src/generator/reactQueryGenerator.ts +92 -0
  25. package/src/generator/schemaGenerator.ts +139 -0
  26. package/src/index.ts +78 -3
  27. package/src/types/config.ts +12 -0
  28. package/src/types.ts +5 -0
  29. package/src/utils.ts +56 -213
  30. package/README.md +0 -77
  31. package/dist/convertSwaggerFile.d.ts +0 -5
  32. package/dist/convertSwaggerFile.js +0 -26
  33. package/dist/convertSwaggerFile.js.map +0 -1
  34. package/dist/generateHooks.d.ts +0 -18
  35. package/dist/generateHooks.js +0 -444
  36. package/dist/generateHooks.js.map +0 -1
  37. package/dist/generateImports.d.ts +0 -6
  38. package/dist/generateImports.js +0 -21
  39. package/dist/generateImports.js.map +0 -1
  40. package/dist/generateSchemas.d.ts +0 -7
  41. package/dist/generateSchemas.js +0 -100
  42. package/dist/generateSchemas.js.map +0 -1
  43. package/dist/importSpecs.d.ts +0 -10
  44. package/dist/importSpecs.js +0 -127
  45. package/dist/importSpecs.js.map +0 -1
  46. package/dist/index.js.map +0 -1
  47. package/dist/utils.js.map +0 -1
  48. package/src/convertSwaggerFile.ts +0 -25
  49. package/src/generateHooks.ts +0 -538
  50. package/src/generateImports.ts +0 -32
  51. package/src/generateSchemas.ts +0 -117
  52. package/src/importSpecs.ts +0 -168
@@ -1,538 +0,0 @@
1
- import lodash from 'lodash';
2
- const { get, groupBy } = lodash;
3
- import {
4
- ComponentsObject,
5
- OperationObject,
6
- ParameterObject,
7
- ReferenceObject,
8
- ResponseObject,
9
- SchemaObject,
10
- } from 'openapi3-ts';
11
- import { formatDescription, getResReqTypes, isReference, resolveValue } from './utils.js';
12
- import pasCase from 'case';
13
-
14
- const { pascal, camel } = pasCase;
15
-
16
- const IdentifierRegexp = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
17
-
18
- /**
19
- * Return every params in a path
20
- */
21
- const getParamsInPath = (path: string) => {
22
- let n;
23
- const output = [];
24
- const templatePathRegex = /\{(\w+)}/g;
25
- while ((n = templatePathRegex.exec(path)) !== null) {
26
- output.push(n[1]);
27
- }
28
-
29
- return output;
30
- };
31
-
32
- export let imports: string[] = [];
33
-
34
- /**
35
- * Generate a react-query component from openapi operation specs
36
- */
37
- export const createHook = ({
38
- operation,
39
- verb,
40
- route,
41
- operationIds,
42
- parameters,
43
- schemasComponents,
44
- headerFilters,
45
- }: {
46
- operation: OperationObject;
47
- verb: string;
48
- route: string;
49
- operationIds: string[];
50
- parameters: (ReferenceObject | ParameterObject)[] | undefined;
51
- schemasComponents?: ComponentsObject;
52
- headerFilters?: string[];
53
- }) => {
54
- const { operationId = route.replace('/', '') } = operation;
55
- if (operationId === '*') {
56
- throw new Error(`Invalid operationId/Route set for ${verb} ${route}`);
57
- }
58
- if (operationIds.includes(operationId)) {
59
- return { implementation: '', imports: [], queryImports: [] };
60
- }
61
- operationIds.push(operationId);
62
-
63
- imports = [];
64
-
65
- route = route.replace(/\{/g, '${').replace('//', '/'); // `/pet/{id}` => `/pet/${id}`
66
-
67
- // Remove the last param of the route if we are in the DELETE case
68
- let lastParamInTheRoute: string | null = null;
69
-
70
- const componentName = pascal(operationId!);
71
-
72
- const isOk = ([statusCode]: [string, ResponseObject | ReferenceObject]) =>
73
- statusCode.toString().startsWith('2');
74
-
75
- const responseTypes = getResReqTypes(Object.entries(operation.responses).filter(isOk)) || 'unknown';
76
- const requestBodyTypes = operation.requestBody ? getResReqTypes([['body', operation.requestBody]]) : null;
77
-
78
- let queryImports = [] as Array<'mutation' | 'query' | 'infiniteQuery'>;
79
-
80
- const paramsInPath = getParamsInPath(route).filter(
81
- (param) => !(verb === 'delete' && param === lastParamInTheRoute)
82
- );
83
-
84
- const {
85
- query: queryParams = [],
86
- path: pathParams = [],
87
- header = [],
88
- } = groupBy(
89
- [...(parameters || []), ...(operation.parameters || [])].map<ParameterObject>((p) => {
90
- if (isReference(p)) {
91
- return get(schemasComponents, p.$ref.replace('#/components/', '').replace('/', '.'));
92
- } else {
93
- return p;
94
- }
95
- }),
96
- 'in'
97
- );
98
-
99
- const headerParams = header.filter((p) => !headerFilters?.includes(p.name));
100
- const requiredParams = [...queryParams, ...pathParams, ...headerParams].filter((p) => p.required);
101
- // TODO: extract all requestBody or remove useQuery variants
102
- let enabledParam: boolean | string = true;
103
- if (requiredParams.length) {
104
- enabledParam = 'hasDefinedProps(params,';
105
- enabledParam += requiredParams.map((p) => `"${p.name}"`).join(', ');
106
- }
107
-
108
- if (operation.requestBody && 'content' in operation.requestBody) {
109
- // get all required requestBody schemas and output the required properties
110
- const generatedBodyProps = Object.keys(operation.requestBody.content).reduce((acc, contentType) => {
111
- if (
112
- contentType.startsWith('application/json') ||
113
- contentType.startsWith('application/ld+json') ||
114
- contentType.startsWith('application/octet-stream')
115
- ) {
116
- // @ts-ignore
117
- const schema = operation.requestBody.content[contentType].schema!;
118
-
119
- if ('required' in schema) {
120
- // @ts-ignore
121
- acc.push(...schema.required);
122
- }
123
- }
124
- return acc;
125
- }, []);
126
-
127
- if (generatedBodyProps.length) {
128
- if (enabledParam === true) {
129
- enabledParam = 'hasDefinedProps(params,';
130
- enabledParam += generatedBodyProps.map((p) => `"${p}"`).join(', ');
131
- } else {
132
- enabledParam += ',';
133
- enabledParam += generatedBodyProps.map((p) => `"${p}"`).join(', ');
134
- }
135
- }
136
- }
137
-
138
- const paramsTypes = paramsInPath
139
- .map((p) => {
140
- try {
141
- const { name, required, schema } = pathParams.find((i) => i.name === p)!;
142
- return `${name}${required ? '' : '?'}: ${resolveValue(schema!)}`;
143
- } catch (err) {
144
- throw new Error(`The path params ${p} can't be found in parameters (${operationId})`);
145
- }
146
- })
147
- .join('; ');
148
-
149
- const queryParamsType = queryParams
150
- .map((p) => {
151
- const processedName = IdentifierRegexp.test(p.name) ? p.name : `"${p.name}"`;
152
- return `${formatDescription(p.description)}
153
- ${processedName}${p.required ? '' : '?'}: ${resolveValue(p.schema!)}`;
154
- })
155
- .join(';\n ');
156
-
157
- const headerType = headerParams
158
- .map((p) => {
159
- try {
160
- const { name, required, schema } = headerParams.find((i) => i.name === p.name)!;
161
- return `"${name}"${required ? '' : '?'}: ${resolveValue(schema!)}`;
162
- } catch (err) {
163
- throw new Error(`The path params ${p} can't be found in parameters (${operationId})`);
164
- }
165
- })
166
- .join('; ');
167
-
168
- // Retrieve the type of the param for delete verb
169
- const lastParamInTheRouteDefinition =
170
- operation.parameters && lastParamInTheRoute
171
- ? (operation.parameters.find((p) => {
172
- if (isReference(p)) {
173
- return false;
174
- }
175
- return p.name === lastParamInTheRoute;
176
- }) as ParameterObject | undefined) // Reference is not possible
177
- : { schema: { type: 'string' } };
178
-
179
- if (!lastParamInTheRouteDefinition) {
180
- throw new Error(`The path params ${lastParamInTheRoute} can't be found in parameters (${operationId})`);
181
- }
182
-
183
- const defaultDescription = `type: ${verb}\noperationId: ${operationId}\nurl: ${route}`;
184
-
185
- const description = formatDescription(
186
- operation.summary && operation.description
187
- ? `${defaultDescription}\n\n${operation.summary}\n\n${operation.description}`
188
- : `${defaultDescription}`
189
- );
190
-
191
- let output = `\n\n${description}`;
192
-
193
- const headerParam = headerType && headerType !== 'void' ? `${headerType};` : '';
194
- const queryParam = queryParamsType && queryParamsType !== 'void' ? `${queryParamsType}` : '';
195
- const requestBodyComponent = requestBodyTypes && requestBodyTypes !== 'void' ? `${requestBodyTypes}` : '';
196
-
197
- const isUpdateRequest = ['post', 'patch', 'put'].includes(verb);
198
-
199
- const fetchName = camel(componentName);
200
-
201
- const hasRequestBodyArrray = requestBodyComponent && requestBodyComponent.includes('[]');
202
- const body = hasRequestBodyArrray ? `{body: ${requestBodyComponent}}` : `${requestBodyComponent}`;
203
- const bodyProps = hasRequestBodyArrray ? `{body, ...props}` : 'props';
204
-
205
- // const generateEnabledBodyProps = () => {
206
- const definitionKey = Object.keys(schemasComponents?.schemas || {}).find(
207
- (key) => pascal(key) === requestBodyComponent
208
- );
209
-
210
- if (definitionKey && !hasRequestBodyArrray) {
211
- const scheme = schemasComponents?.schemas?.[definitionKey] as SchemaObject;
212
- const generatedBodyProps = Object.keys(scheme.properties as SchemaObject);
213
- const requiredBodyProps = generatedBodyProps.filter((p) => scheme.required?.includes(p));
214
-
215
- if (requiredBodyProps.length) {
216
- if (enabledParam === true) {
217
- enabledParam = 'hasDefinedProps(params,';
218
- enabledParam += requiredBodyProps.map((p) => `"${p}"`).join(', ');
219
- } else {
220
- enabledParam += ',';
221
- enabledParam += requiredBodyProps.map((p) => `"${p}"`).join(', ');
222
- }
223
- }
224
- }
225
-
226
- if (operation.requestBody && 'content' in operation.requestBody) {
227
- let generatedBodyProps = [];
228
- for (let contentType of Object.keys(operation.requestBody.content)) {
229
- if (
230
- contentType.startsWith('application/json') ||
231
- contentType.startsWith('application/ld+json') ||
232
- contentType.startsWith('application/octet-stream')
233
- ) {
234
- const schema = operation.requestBody.content[contentType].schema!;
235
-
236
- if ('properties' in schema) {
237
- // @ts-ignore
238
- generatedBodyProps.push(...Object.keys(schema.properties));
239
- }
240
- }
241
- }
242
- }
243
-
244
- if (enabledParam !== true) {
245
- enabledParam += ')';
246
- }
247
-
248
- const createQueryHooks = (emptyParams?: boolean) => {
249
- const key = emptyParams ? '' : `params`;
250
- const queryParamType = emptyParams ? '' : `Partial<${componentName}Params>`;
251
- const queryKey = emptyParams
252
- ? `["${componentName.toLowerCase()}"]`
253
- : `["${componentName.toLowerCase()}", params]`;
254
- const props = emptyParams ? `props?` : `params`;
255
- const propTest = emptyParams ? '' : `${props}: ${queryParamType}`;
256
- const createQuery = () => `
257
- export function get${componentName}QueryOptions(${propTest}) {
258
- const enabled = ${enabledParam}
259
-
260
- return queryOptions({
261
- queryKey: ${queryKey},
262
- queryFn: enabled ? () => ${fetchName}(${key}) : skipToken,
263
- });
264
- }`;
265
-
266
- queryImports.push('query');
267
- return createQuery();
268
- };
269
-
270
- const generateProps = (props: ParameterObject[]) => {
271
- return props.map((item) => `["${item.name}"]: props["${item.name}"]`).join(',');
272
- };
273
-
274
- const generateBodyProps = () => {
275
- if (definitionKey && !hasRequestBodyArrray) {
276
- const scheme = schemasComponents?.schemas?.[definitionKey] as SchemaObject;
277
- const schemProperties = Object.keys(scheme.properties as SchemaObject);
278
- if (
279
- operation.requestBody &&
280
- 'content' in operation.requestBody &&
281
- Object.keys(operation.requestBody.content)[0] === 'multipart/form-data'
282
- ) {
283
- let formData = `const body = new FormData()`;
284
- schemProperties.forEach((item) => {
285
- if (scheme.required?.includes(item)) {
286
- formData += `\nbody.append("${item}", props["${item}"]);`;
287
- } else {
288
- formData += `\n if (props["${item}"] != null) {\n body.append("${item}", props["${item}"]);\n}`;
289
- }
290
- });
291
- return formData;
292
- }
293
-
294
- const generatedBodyProps = schemProperties
295
- .map((item: string) => `["${item}"]: props["${item}"]`)
296
- .join(',');
297
- return `const body = {${generatedBodyProps}}`;
298
- }
299
-
300
- if (operation.requestBody && 'content' in operation.requestBody) {
301
- let generatedBodyProps = [];
302
- let bodyData = '';
303
- const contentTypes = Object.keys(operation.requestBody.content);
304
- if (contentTypes.includes('multipart/form-data')) {
305
- console.log('UPDATE2');
306
-
307
- bodyData += `const body = new FormData()`;
308
-
309
- for (let contentType of contentTypes) {
310
- const schema = operation.requestBody.content[contentType].schema!;
311
- if ('properties' in schema) {
312
- const schemaProperties = Object.keys(schema.properties || []);
313
- for (let item of schemaProperties) {
314
- if (schema.required?.includes(item)) {
315
- bodyData += `\nbody.append("${item}", props["${item}"].toString());`;
316
- } else {
317
- bodyData += `\n if (props["${item}"] != null) {\n body.append("${item}", props["${item}"].toString());\n}`;
318
- }
319
- }
320
- }
321
- }
322
- return bodyData;
323
- }
324
- for (let contentType of contentTypes) {
325
- if (
326
- contentType.startsWith('application/json') ||
327
- contentType.startsWith('application/ld+json') ||
328
- contentType.startsWith('application/octet-stream')
329
- ) {
330
- const schema = operation.requestBody.content[contentType].schema!;
331
-
332
- if ('properties' in schema) {
333
- // @ts-ignore
334
- generatedBodyProps.push(...Object.keys(schema.properties));
335
- }
336
- }
337
- }
338
- return `const body = {${generatedBodyProps.map((item) => `${item}: props["${item}"]`).join(',')}}`;
339
- }
340
- };
341
-
342
- const hasFormData = generateBodyProps()?.includes('FormData');
343
- const defaultHeaders = JSON.stringify({
344
- ContentType: hasFormData ? 'multipart/form-data' : 'application/json',
345
- });
346
-
347
- if (!requestBodyComponent && !paramsInPath.length && !queryParam && !headerParam) {
348
- output += `
349
- export const ${fetchName} = async () => {
350
- const result = await api.${verb}<${responseTypes}>("${route}");
351
- return result.data;
352
- }
353
- `;
354
- }
355
- if (!requestBodyComponent && paramsInPath.length && queryParam && !headerParam) {
356
- const config = isUpdateRequest ? 'undefined,{params}' : '{params}';
357
- output += `
358
- export type ${componentName}Params = {
359
- ${paramsTypes}
360
- ${queryParamsType};
361
- }
362
-
363
- export const ${fetchName} = async (props:${componentName}Params) => {
364
- const {${paramsInPath.join(', ')}, ...params} = props
365
- const result = await api.${verb}<${responseTypes}>(\`${route}\`, ${config})
366
- return result.data;
367
- }`;
368
- }
369
- if (!requestBodyComponent && paramsInPath.length && !queryParam && !headerParam) {
370
- output += `
371
- export type ${componentName}Params = {
372
- ${paramsTypes}
373
- }
374
-
375
- export const ${fetchName} = async (props: ${componentName}Params ) => {
376
- const result = await api.${verb}<${responseTypes}>(\`${route.replace(/\{/g, '{props.')}\`);
377
- return result.data;
378
- }
379
- `;
380
- }
381
- if (!requestBodyComponent && !paramsInPath.length && queryParam && !headerParam) {
382
- const config = isUpdateRequest ? 'null,{params}' : '{params}';
383
- output += `
384
- export type ${componentName}Params = {
385
- ${queryParamsType}
386
- }
387
-
388
- export const ${fetchName} = async (params: ${componentName}Params) => {
389
- const result = await api.${verb}<${responseTypes}>("${route}", ${config})
390
- return result.data;
391
- }
392
- `;
393
- }
394
- if (!requestBodyComponent && !paramsInPath.length && queryParam && headerParam) {
395
- const config = isUpdateRequest ? 'null,{headers, params: queryParams}' : '{headers, params: queryParams}';
396
- output += `
397
- export type ${componentName}Params = {
398
- ${headerParam}
399
- ${queryParamsType}
400
- }
401
- export const ${fetchName} = async (props: ${componentName}Params) => {
402
- const headers = {${generateProps(header)}}
403
- const queryParams = {${generateProps(queryParams)}}
404
- const result = await api.${verb}<${responseTypes}>("${route}", ${config})
405
- return result.data
406
- }`;
407
- }
408
- if (!requestBodyComponent && !paramsInPath.length && !queryParam && headerParam) {
409
- const config = isUpdateRequest ? 'null,{headers}' : '{headers}';
410
- output += `
411
- export type ${componentName}Params = {
412
- ${headerParam}
413
- };
414
-
415
- export const ${fetchName} = async (headers: ${componentName}Params) => {
416
- const result = await api.${verb}<${responseTypes}>("${route}", ${config});
417
- return result.data;
418
- }
419
- `;
420
- }
421
- if (requestBodyComponent && !paramsInPath.length && !queryParam && !headerParam) {
422
- output += `
423
-
424
- export type ${componentName}Params = ${requestBodyComponent}
425
-
426
- export const ${fetchName} = async (body: ${componentName}Params) => {
427
- const result = await api.${verb}<${responseTypes}>("${route}", body, {headers: ${defaultHeaders}})
428
- return result.data
429
- }
430
- `;
431
- }
432
- if (requestBodyComponent && !paramsInPath.length && queryParam && !headerParam) {
433
- output += `
434
- export type ${componentName}Params = ${body} & {
435
- ${queryParamsType}
436
- }
437
-
438
- export const ${fetchName} = async (${bodyProps}: ${componentName}Params) => {
439
- ${generateBodyProps()}
440
- const params = {${generateProps(queryParams)}}
441
- const result = await api.${verb}<${responseTypes}>("${route}", body, {params, headers: ${defaultHeaders}})
442
- return result.data
443
- }
444
- `;
445
- }
446
- if (requestBodyComponent && !paramsInPath.length && !queryParam && headerParam) {
447
- output += `
448
- export type ${componentName}Params = ${body} & {
449
- ${headerParam}
450
- };
451
-
452
- export const ${fetchName} = async (${bodyProps}: ${componentName}Params) => {
453
- ${generateBodyProps()}
454
- const headers = null
455
- const result = await api.${verb}<${responseTypes}>("${route}", body, {headers})
456
- return result.data
457
- }
458
- `;
459
- }
460
- if (requestBodyComponent && !paramsInPath.length && queryParam && headerParam) {
461
- output += `
462
- export type ${componentName}Params = ${body} & {
463
- ${headerParam}
464
- ${queryParamsType}
465
- };
466
- export const ${fetchName} = async (${bodyProps}: ${componentName}Params) => {
467
- ${generateBodyProps()}
468
- const headers = null
469
- const params = {${generateProps(queryParams)}}
470
- const result = await api.${verb}<${responseTypes}>("${route}", body, {headers, params})
471
- return result.data
472
- }
473
- `;
474
- }
475
- if (requestBodyComponent && paramsInPath.length && !queryParam && !headerParam) {
476
- output += `
477
- export type ${componentName}Params = ${body} & {
478
- ${headerParam}
479
- ${paramsTypes}
480
- };
481
-
482
- export const ${fetchName} = async (${bodyProps}: ${componentName}Params) => {
483
- ${generateBodyProps()}
484
- const result = await api.${verb}<${responseTypes}>(\`${route.replace(/\{/g, '{props.')}\`, body, {headers: ${defaultHeaders}})
485
- return result.data
486
- }
487
- `;
488
- }
489
-
490
- if (requestBodyComponent && paramsInPath.length && queryParam && !headerParam) {
491
- output += `
492
- export type ${componentName}Params = ${body} & {
493
- ${headerParam}
494
- ${paramsTypes}
495
- ${queryParamsType}
496
- };
497
-
498
- export const ${fetchName} = async (${bodyProps}: ${componentName}Params) => {
499
- ${generateBodyProps()}
500
- const params = {${generateProps(queryParams)}}
501
- const result = await api.${verb}<${responseTypes}>(\`${route.replace(/\{/g, '{props.')}\`, body, {params, headers: ${defaultHeaders}})
502
- return result.data
503
- }
504
- `;
505
- }
506
-
507
- if (requestBodyComponent && paramsInPath.length && queryParam && headerParam) {
508
- output += `// TODO: NOT SUPPORTED requestBodyComponent && paramsInPath && queryParam && headerParam)`;
509
- }
510
-
511
- if (!requestBodyComponent && paramsInPath.length && !queryParam && headerParam) {
512
- const config = isUpdateRequest ? 'null,{headers}' : '{headers}';
513
- output += `
514
- export type ${componentName}Params = {
515
- ${headerParam}
516
- ${paramsTypes}
517
- };
518
-
519
- export const ${fetchName} = async (props: ${componentName}Params) => {
520
- const headers = {${generateProps(header)}}
521
- const result = await api.${verb}<${responseTypes}>(\`${route.replace(/\{/g, '{props.')}\`, ${config})
522
- return result.data
523
- }
524
- `;
525
- }
526
-
527
- if (!requestBodyComponent && paramsInPath.length && queryParam && headerParam) {
528
- output += `// TODO: NOT SUPPORTED (paramsInPath && queryParam && headerParam)`;
529
- }
530
-
531
- if (requestBodyComponent && paramsInPath.length && !queryParam && headerParam) {
532
- output += `// TODO: NOT SUPPORTED (requestBodyComponent && paramsInPath && headerParam)`;
533
- }
534
-
535
- output += createQueryHooks(!requestBodyComponent && !paramsInPath.length && !queryParam && !headerParam);
536
-
537
- return { implementation: output, imports, queryImports };
538
- };
@@ -1,32 +0,0 @@
1
- export const generateImports = ({
2
- schemaName,
3
- apiDirectory,
4
- schemaImports,
5
- queryImports,
6
- }: {
7
- apiDirectory: string;
8
- schemaName: string;
9
- schemaImports: string[];
10
- queryImports: ('query' | 'mutation' | 'infiniteQuery')[];
11
- }) => {
12
- const importTypes = schemaImports.join(',');
13
- let imports = [] as string[];
14
- if (queryImports.includes('query')) {
15
- imports = [...imports, 'skipToken', 'queryOptions'];
16
- }
17
- if (queryImports.includes('infiniteQuery')) {
18
- imports = [...imports, 'infiniteQueryOptions'];
19
- }
20
-
21
- const importString = [...new Set(imports)].join(',');
22
-
23
- return `
24
- import {
25
- ${importString}
26
- } from '@tanstack/react-query';
27
-
28
- import { api } from '${apiDirectory}';
29
- import {${importTypes}} from './${schemaName}'
30
-
31
- `;
32
- };
@@ -1,117 +0,0 @@
1
- import pasCase from 'case';
2
- import lodash from 'lodash';
3
- const { isEmpty } = lodash;
4
- const { pascal } = pasCase;
5
- import { ComponentsObject, OpenAPIObject, SchemaObject } from 'openapi3-ts';
6
- import { formatDescription, getScalar, isReference, resolveValue } from './utils.js';
7
-
8
- import { getDocs, getResReqTypes } from './utils.js';
9
-
10
- /**
11
- * Generate the interface string
12
- */
13
- const generateInterface = (name: string, schema: SchemaObject) => {
14
- const scalar = getScalar(schema);
15
- return `${formatDescription(schema.description)}
16
- export type ${pascal(name)} = ${scalar}
17
- `;
18
- };
19
-
20
- /**
21
- * Extract all types from #/components/schemas
22
- */
23
- const generateSchemasDefinition = (schemas: ComponentsObject['schemas'] = {}) => {
24
- if (isEmpty(schemas)) {
25
- return '';
26
- }
27
-
28
- return (
29
- '\n // SCEHMAS \n' +
30
- Object.entries(schemas)
31
- .map(([name, schema]) =>
32
- !isReference(schema) &&
33
- (!schema.type || schema.type === 'object') &&
34
- !schema.allOf &&
35
- !schema.oneOf &&
36
- !isReference(schema) &&
37
- !schema.nullable
38
- ? generateInterface(name, schema)
39
- : `${formatDescription(isReference(schema) ? undefined : schema.description)} export type ${pascal(
40
- name
41
- )} = ${resolveValue(schema)};`
42
- )
43
- .join('\n\n') +
44
- '\n'
45
- );
46
- };
47
-
48
- /**
49
- * Extract all types from #/components/requestBodies
50
- */
51
- const generateRequestBodiesDefinition = (requestBodies: ComponentsObject['requestBodies'] = {}) => {
52
- if (isEmpty(requestBodies)) {
53
- return '';
54
- }
55
-
56
- return (
57
- '\n // REQUEST BODIES \n' +
58
- Object.entries(requestBodies)
59
- .map(([name, requestBody]) => {
60
- const doc = getDocs(requestBody);
61
- const type = getResReqTypes([['', requestBody]]);
62
- const isEmptyInterface = type === '{}';
63
- if (isEmptyInterface) {
64
- return `${doc}\nexport type ${pascal(name)}RequestBody = ${type}`;
65
- } else if (type.includes('{') && !type.includes('|') && !type.includes('&')) {
66
- return `${doc}\nexport type ${pascal(name)}RequestBody = ${type}`;
67
- } else {
68
- return `${doc}\nexport type ${pascal(name)}RequestBody = ${type};`;
69
- }
70
- })
71
- .join('\n\n') +
72
- '\n'
73
- );
74
- };
75
-
76
- /**
77
- * Extract all types from #/components/responses
78
- */
79
- const generateResponsesDefinition = (responses: ComponentsObject['responses'] = {}) => {
80
- if (isEmpty(responses)) {
81
- return '';
82
- }
83
-
84
- return (
85
- '\n // RESPONSES \n' +
86
- Object.entries(responses)
87
- .map(([name, response]) => {
88
- const doc = getDocs(response);
89
- const type = getResReqTypes([['', response]]);
90
- const isEmptyInterface = type === '{}';
91
- if (!type) {
92
- return;
93
- }
94
- if (isEmptyInterface) {
95
- return `export type RQ${pascal(name)}Response = ${type}`;
96
- } else if (type.includes('{') && !type.includes('|') && !type.includes('&')) {
97
- return `${doc}\nexport type RQ${pascal(name)}Response = ${type}`;
98
- } else {
99
- return `${doc}\nexport type RQ${pascal(name)}Response = ${type};`;
100
- }
101
- })
102
- .join('\n\n') +
103
- '\n'
104
- );
105
- };
106
-
107
- /**
108
- * Extract all types from #/components/schemas
109
- */
110
- export const generateSchemas = ({ spec }: { spec: OpenAPIObject }) => {
111
- const schemaOutput =
112
- generateRequestBodiesDefinition(spec.components?.requestBodies) +
113
- generateResponsesDefinition(spec.components?.responses) +
114
- generateSchemasDefinition(spec.components?.schemas);
115
-
116
- return schemaOutput;
117
- };