Skip to content

Commit 941596a

Browse files
committed
feat: remove lodash prefixes
1 parent 30c4006 commit 941596a

12 files changed

+77
-10
lines changed

src/generateSaddlebackSpec.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
11
import { generate, Options } from './generate';
2+
import { isString } from './utils/isString';
3+
import { getOpenApiSpec } from './utils/getOpenApiSpec';
4+
import { OpenApi } from './openApi/v3/interfaces/OpenApi';
5+
import { Dictionary } from './utils/types';
6+
import { OpenApiSchema } from './openApi/v3/interfaces/OpenApiSchema';
7+
import { removeLodashPrefix } from './utils/removeLodashPrefix';
8+
import { mapSwaggerRef } from './utils/mapSwaggerRef';
9+
import { removeLodashPrefixFromRef } from './utils/removeLodashPrefixFromRef';
210

311
type Config = Options & {
412
useSaddlebackServices?: boolean;
513
additionalModelFileExtension?: boolean;
614
additionalServiceFileExtension?: boolean;
15+
removeLodashPrefixes?: boolean;
716
};
817

918
export const generateSaddlebackSpec = async (config: Config) => {
10-
await generate({ ...config });
19+
const openApi: OpenApi = isString(config.input) ? await getOpenApiSpec(config.input) : config.input;
20+
21+
if (config.removeLodashPrefixes && openApi.components && openApi.components.schemas) {
22+
const newSchemas: Dictionary<OpenApiSchema> = {};
23+
24+
for (const schemaKey in openApi.components.schemas) {
25+
if (openApi.components.schemas.hasOwnProperty(schemaKey)) {
26+
newSchemas[removeLodashPrefix(schemaKey)] = openApi.components.schemas[schemaKey];
27+
}
28+
}
29+
30+
openApi.components.schemas = newSchemas;
31+
}
32+
33+
mapSwaggerRef(openApi, removeLodashPrefixFromRef);
34+
35+
await generate({ ...config, input: openApi });
1136
};
1237

1338
export default generateSaddlebackSpec;

src/templates/exportSaddlebackService.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ export const fetch{{{../name}}}{{pascalCase name}} = async ({{> saddlebackParame
5151
contentType: '{{{parametersBody.mediaType}}}',
5252
{{/if}}
5353
{{/if}}
54+
{{#if parameters}}
5455
...config,
56+
{{/if}}
5557
});
5658

5759
try {

src/templates/index.hbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ export { ${{{name}}} } from './schemas/${{{name}}}';
4141
{{#if services}}
4242

4343
{{#each services}}
44+
{{#equals @root.httpClient 'saddleback'}}
45+
export * as fetch{{{name}}}{{{@root.postfix}}} from './services/{{{name}}}{{{@root.postfix}}}{{#if ../additionalServiceFileExtension}}.service{{/if}}';
46+
{{else}}
4447
export { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.postfix}}}{{#if ../additionalServiceFileExtension}}.service{{/if}}';
48+
{{/equals}}
4549
{{/each}}
4650
{{/if}}
4751
{{/if}}

src/utils/mapSwaggerRef.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export const mapSwaggerRef = (obj: Record<string, any>, mapFunction: Function): void => {
2+
const searchRef = (obj: Record<string, any>) => {
3+
for (const key in obj) {
4+
if (obj.hasOwnProperty(key)) {
5+
if (key === '$ref') {
6+
obj[key] = mapFunction(obj[key]);
7+
} else if (typeof obj[key] === 'object') searchRef(obj[key]);
8+
}
9+
}
10+
}
11+
12+
searchRef(obj);
13+
};

src/utils/removeLodashPrefix.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const removeLodashPrefix = (s: string): string => {
2+
return s.split('_').slice(-1)[0];
3+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { removeLodashPrefix } from './removeLodashPrefix';
2+
3+
export const removeLodashPrefixFromRef = (swaggerRef: string) => {
4+
return (
5+
swaggerRef
6+
.split('/')
7+
.slice(0, -1)
8+
.reduce((acc: string, it: string) => `${acc}${it}/`, '') +
9+
removeLodashPrefix(swaggerRef.split('/').slice(-1)[0])
10+
);
11+
};

src/utils/writeClient.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export const writeClient = async (
141141
exportModels,
142142
exportSchemas,
143143
postfix,
144+
httpClient,
144145
clientName
145146
);
146147
}

src/utils/writeClientIndex.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Client } from '../client/interfaces/Client';
22
import { writeFile } from './fileSystem';
33
import type { Templates } from './registerHandlebarTemplates';
44
import { writeClientIndex } from './writeClientIndex';
5+
import { HttpClient } from '../HttpClient';
56

67
jest.mock('./fileSystem');
78

@@ -35,7 +36,7 @@ describe('writeClientIndex', () => {
3536
},
3637
};
3738

38-
await writeClientIndex(client, templates, '/', true, true, true, true, true, 'Service');
39+
await writeClientIndex(client, templates, '/', true, true, true, true, true, 'Service', HttpClient.AXIOS);
3940

4041
expect(writeFile).toBeCalledWith('/index.ts', 'index');
4142
});

src/utils/writeClientIndex.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isDefined } from './isDefined';
66
import { Templates } from './registerHandlebarTemplates';
77
import { sortModelsByName } from './sortModelsByName';
88
import { sortServicesByName } from './sortServicesByName';
9+
import { HttpClient } from '../HttpClient';
910

1011
/**
1112
* Generate the OpenAPI client index file using the Handlebar template and write it to disk.
@@ -20,6 +21,7 @@ import { sortServicesByName } from './sortServicesByName';
2021
* @param exportModels Generate models
2122
* @param exportSchemas Generate schemas
2223
* @param postfix Service name postfix
24+
* @param httpClient The selected httpClient (fetch, xhr, node or axios)
2325
* @param clientName Custom client class name
2426
*/
2527
export const writeClientIndex = async (
@@ -32,6 +34,7 @@ export const writeClientIndex = async (
3234
exportModels: boolean,
3335
exportSchemas: boolean,
3436
postfix: string,
37+
httpClient: HttpClient,
3538
clientName?: string
3639
): Promise<void> => {
3740
const templateResult = templates.index({
@@ -47,6 +50,7 @@ export const writeClientIndex = async (
4750
models: sortModelsByName(client.models),
4851
services: sortServicesByName(client.services),
4952
exportClient: isDefined(clientName),
53+
httpClient,
5054
});
5155

5256
await writeFile(resolve(outputPath, 'index.ts'), templateResult);

test/index.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ const main = async () => {
6060
// await generate('./test/spec/v2.json', './test/generated/v2/');
6161
// await generate('./test/spec/v3.json', './test/generated/v3/');
6262
const config = {
63-
httpClient: 'axios',
64-
clientName: 'TestAxiosClassName',
63+
httpClient: 'saddleback',
64+
clientName: '',
6565
useOptions: true,
6666
useUnionTypes: false,
6767
exportCore: false,
@@ -70,27 +70,26 @@ const main = async () => {
7070
exportSchemas: false,
7171
indent: '4',
7272
postfix: '',
73-
filterMethod: 'greedy',
74-
filterArray: ['/api/agreement', '/api/agreement/{id}', '/api/share-page/compare-results'],
7573
additionalModelFileExtension: false,
7674
additionalServiceFileExtension: false,
75+
removeLodashPrefixes: true,
7776
};
78-
await OpenAPI.generateCustomSpec({
77+
await OpenAPI.generateSaddlebackSpec({
7978
input: './test/spec/saddlebackCoreApi.json',
8079
output: './test/new/saddleback/core',
8180
...config,
8281
});
83-
await OpenAPI.generateCustomSpec({
82+
await OpenAPI.generateSaddlebackSpec({
8483
input: './test/spec/saddlebackEventApi.json',
8584
output: './test/new/saddleback/event',
8685
...config,
8786
});
88-
await OpenAPI.generateCustomSpec({
87+
await OpenAPI.generateSaddlebackSpec({
8988
input: './test/spec/saddlebackWebAppApi.json',
9089
output: './test/new/saddleback/web',
9190
...config,
9291
});
93-
await OpenAPI.generateCustomSpec({
92+
await OpenAPI.generateSaddlebackSpec({
9493
input: './test/spec/saddlebackWorkflowApi.json',
9594
output: './test/new/saddleback/workflow',
9695
...config,

0 commit comments

Comments
 (0)