Skip to content

Commit de79c6b

Browse files
committed
template and partial override
1 parent 4de57e7 commit de79c6b

8 files changed

+368
-179
lines changed

src/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { getOpenApiSpec } from './utils/getOpenApiSpec';
66
import { getOpenApiVersion, OpenApiVersion } from './utils/getOpenApiVersion';
77
import { isString } from './utils/isString';
88
import { postProcessClient } from './utils/postProcessClient';
9-
import { registerHandlebarTemplates } from './utils/registerHandlebarTemplates';
9+
import { PartialsOverwrite, registerHandlebarTemplates, TemplatesOverwrite } from './utils/registerHandlebarTemplates';
1010
import { writeClient } from './utils/writeClient';
1111

1212
export { HttpClient } from './HttpClient';
@@ -28,6 +28,8 @@ export type Options = {
2828
postfixModels?: string;
2929
request?: string;
3030
write?: boolean;
31+
templatesOverride?: TemplatesOverwrite;
32+
partialsOverride?: PartialsOverwrite;
3133
};
3234

3335
/**
@@ -66,13 +68,17 @@ export const generate = async ({
6668
postfixModels = '',
6769
request,
6870
write = true,
71+
templatesOverride = {},
72+
partialsOverride = {},
6973
}: Options): Promise<void> => {
7074
const openApi = isString(input) ? await getOpenApiSpec(input) : input;
7175
const openApiVersion = getOpenApiVersion(openApi);
7276
const templates = registerHandlebarTemplates({
7377
httpClient,
7478
useUnionTypes,
7579
useOptions,
80+
templatesOverride,
81+
partialsOverride,
7682
});
7783

7884
switch (openApiVersion) {

src/utils/PartialsEnum.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
export enum PartialsEnum {
2+
'exportEnum' = 'exportEnum',
3+
'exportInterface' = 'exportInterface',
4+
'exportComposition' = 'exportComposition',
5+
'exportType' = 'exportType',
6+
'header' = 'header',
7+
'isNullable' = 'isNullable',
8+
'isReadOnly' = 'isReadOnly',
9+
'isRequired' = 'isRequired',
10+
'parameters' = 'parameters',
11+
'result' = 'result',
12+
'schema' = 'schema',
13+
'schemaArray' = 'schemaArray',
14+
'schemaComposition' = 'schemaComposition',
15+
'schemaDictionary' = 'schemaDictionary',
16+
'schemaEnum' = 'schemaEnum',
17+
'schemaGeneric' = 'schemaGeneric',
18+
'schemaInterface' = 'schemaInterface',
19+
'type' = 'type',
20+
'typeArray' = 'typeArray',
21+
'typeDictionary' = 'typeDictionary',
22+
'typeEnum' = 'typeEnum',
23+
'typeGeneric' = 'typeGeneric',
24+
'typeInterface' = 'typeInterface',
25+
'typeIntersection' = 'typeIntersection',
26+
'typeReference' = 'typeReference',
27+
'typeUnion' = 'typeUnion',
28+
'base' = 'base',
29+
'functionsCatchErrorCodes' = 'functions/catchErrorCodes',
30+
'functionsGetFormData' = 'functions/getFormData',
31+
'functionsGetQueryString' = 'functions/getQueryString',
32+
'functionsGetUrl' = 'functions/getUrl',
33+
'functionsIsBlob' = 'functions/isBlob',
34+
'functionsIsDefined' = 'functions/isDefined',
35+
'functionsIsFormData' = 'functions/isFormData',
36+
'functionsIsString' = 'functions/isString',
37+
'functionsIsStringWithValue' = 'functions/isStringWithValue',
38+
'functionsIsSuccess' = 'functions/isSuccess',
39+
'functionsBase64' = 'functions/base64',
40+
'functionsResolve' = 'functions/resolve',
41+
'fetchGetHeaders' = 'fetch/getHeaders',
42+
'fetchGetRequestBody' = 'fetch/getRequestBody',
43+
'fetchGetResponseBody' = 'fetch/getResponseBody',
44+
'fetchGetResponseHeader' = 'fetch/getResponseHeader',
45+
'fetchSendRequest' = 'fetch/sendRequest',
46+
'fetchRequest' = 'fetch/request',
47+
'xhrGetHeaders' = 'xhr/getHeaders',
48+
'xhrGetRequestBody' = 'xhr/getRequestBody',
49+
'xhrGetResponseBody' = 'xhr/getResponseBody',
50+
'xhrGetResponseHeader' = 'xhr/getResponseHeader',
51+
'xhrSendRequest' = 'xhr/sendRequest',
52+
'xhrRequest' = 'xhr/request',
53+
'nodeGetHeaders' = 'node/getHeaders',
54+
'nodeGetRequestBody' = 'node/getRequestBody',
55+
'nodeGetResponseBody' = 'node/getResponseBody',
56+
'nodeGetResponseHeader' = 'node/getResponseHeader',
57+
'nodeSendRequest' = 'node/sendRequest',
58+
'nodeRequest' = 'node/request',
59+
'axiosGetHeaders' = 'axios/getHeaders',
60+
'axiosGetRequestBody' = 'axios/getRequestBody',
61+
'axiosGetResponseBody' = 'axios/getResponseBody',
62+
'axiosGetResponseHeader' = 'axios/getResponseHeader',
63+
'axiosSendRequest' = 'axios/sendRequest',
64+
'axiosRequest' = 'axios/request',
65+
'angularGetHeaders' = 'angular/getHeaders',
66+
'angularGetRequestBody' = 'angular/getRequestBody',
67+
'angularGetResponseBody' = 'angular/getResponseBody',
68+
'angularGetResponseHeader' = 'angular/getResponseHeader',
69+
'angularSendRequest' = 'angular/sendRequest',
70+
'angularRequest' = 'angular/request',
71+
}

src/utils/TemplatesEnum.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export enum TemplatesEnum {
2+
'index' = 'index',
3+
'client' = 'client',
4+
'exportModel' = 'exportModel',
5+
'exportSchema' = 'exportSchema',
6+
'exportService' = 'exportService',
7+
'coreSettings' = 'coreSettings',
8+
'coreApiError' = 'coreApiError',
9+
'coreApiRequestOptions' = 'coreApiRequestOptions',
10+
'coreApiResult' = 'coreApiResult',
11+
'coreCancelablePromise' = 'coreCancelablePromise',
12+
'coreRequest' = 'coreRequest',
13+
'coreBaseHttpRequest' = 'coreBaseHttpRequest',
14+
'coreHttpRequest' = 'coreHttpRequest',
15+
}

src/utils/defaultPartials.ts

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import angularGetHeaders from '../templates/core/angular/getHeaders.hbs';
2+
import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs';
3+
import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs';
4+
import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs';
5+
import angularRequest from '../templates/core/angular/request.hbs';
6+
import angularSendRequest from '../templates/core/angular/sendRequest.hbs';
7+
import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs';
8+
import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs';
9+
import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs';
10+
import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs';
11+
import axiosRequest from '../templates/core/axios/request.hbs';
12+
import axiosSendRequest from '../templates/core/axios/sendRequest.hbs';
13+
import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs';
14+
import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs';
15+
import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs';
16+
import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hbs';
17+
import fetchRequest from '../templates/core/fetch/request.hbs';
18+
import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs';
19+
import functionsBase64 from '../templates/core/functions/base64.hbs';
20+
import functionsCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs';
21+
import functionsGetFormData from '../templates/core/functions/getFormData.hbs';
22+
import functionsGetQueryString from '../templates/core/functions/getQueryString.hbs';
23+
import functionsGetUrl from '../templates/core/functions/getUrl.hbs';
24+
import functionsIsBlob from '../templates/core/functions/isBlob.hbs';
25+
import functionsIsDefined from '../templates/core/functions/isDefined.hbs';
26+
import functionsIsFormData from '../templates/core/functions/isFormData.hbs';
27+
import functionsIsString from '../templates/core/functions/isString.hbs';
28+
import functionsIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs';
29+
import functionsIsSuccess from '../templates/core/functions/isSuccess.hbs';
30+
import functionsResolve from '../templates/core/functions/resolve.hbs';
31+
import nodeGetHeaders from '../templates/core/node/getHeaders.hbs';
32+
import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs';
33+
import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs';
34+
import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs';
35+
import nodeRequest from '../templates/core/node/request.hbs';
36+
import nodeSendRequest from '../templates/core/node/sendRequest.hbs';
37+
import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs';
38+
import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs';
39+
import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs';
40+
import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs';
41+
import xhrRequest from '../templates/core/xhr/request.hbs';
42+
import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs';
43+
import partialBase from '../templates/partials/base.hbs';
44+
import partialExportComposition from '../templates/partials/exportComposition.hbs';
45+
import partialExportEnum from '../templates/partials/exportEnum.hbs';
46+
import partialExportInterface from '../templates/partials/exportInterface.hbs';
47+
import partialExportType from '../templates/partials/exportType.hbs';
48+
import partialHeader from '../templates/partials/header.hbs';
49+
import partialIsNullable from '../templates/partials/isNullable.hbs';
50+
import partialIsReadOnly from '../templates/partials/isReadOnly.hbs';
51+
import partialIsRequired from '../templates/partials/isRequired.hbs';
52+
import partialParameters from '../templates/partials/parameters.hbs';
53+
import partialResult from '../templates/partials/result.hbs';
54+
import partialSchema from '../templates/partials/schema.hbs';
55+
import partialSchemaArray from '../templates/partials/schemaArray.hbs';
56+
import partialSchemaComposition from '../templates/partials/schemaComposition.hbs';
57+
import partialSchemaDictionary from '../templates/partials/schemaDictionary.hbs';
58+
import partialSchemaEnum from '../templates/partials/schemaEnum.hbs';
59+
import partialSchemaGeneric from '../templates/partials/schemaGeneric.hbs';
60+
import partialSchemaInterface from '../templates/partials/schemaInterface.hbs';
61+
import partialType from '../templates/partials/type.hbs';
62+
import partialTypeArray from '../templates/partials/typeArray.hbs';
63+
import partialTypeDictionary from '../templates/partials/typeDictionary.hbs';
64+
import partialTypeEnum from '../templates/partials/typeEnum.hbs';
65+
import partialTypeGeneric from '../templates/partials/typeGeneric.hbs';
66+
import partialTypeInterface from '../templates/partials/typeInterface.hbs';
67+
import partialTypeIntersection from '../templates/partials/typeIntersection.hbs';
68+
import partialTypeReference from '../templates/partials/typeReference.hbs';
69+
import partialTypeUnion from '../templates/partials/typeUnion.hbs';
70+
import { PartialsEnum } from './PartialsEnum';
71+
72+
export const defaultPartials: Record<PartialsEnum, TemplateSpecification> = {
73+
[PartialsEnum.exportEnum]: partialExportEnum,
74+
[PartialsEnum.exportInterface]: partialExportInterface,
75+
[PartialsEnum.exportComposition]: partialExportComposition,
76+
[PartialsEnum.exportType]: partialExportType,
77+
[PartialsEnum.header]: partialHeader,
78+
[PartialsEnum.isNullable]: partialIsNullable,
79+
[PartialsEnum.isReadOnly]: partialIsReadOnly,
80+
[PartialsEnum.isRequired]: partialIsRequired,
81+
[PartialsEnum.parameters]: partialParameters,
82+
[PartialsEnum.result]: partialResult,
83+
[PartialsEnum.schema]: partialSchema,
84+
[PartialsEnum.schemaArray]: partialSchemaArray,
85+
[PartialsEnum.schemaComposition]: partialSchemaComposition,
86+
[PartialsEnum.schemaDictionary]: partialSchemaDictionary,
87+
[PartialsEnum.schemaEnum]: partialSchemaEnum,
88+
[PartialsEnum.schemaGeneric]: partialSchemaGeneric,
89+
[PartialsEnum.schemaInterface]: partialSchemaInterface,
90+
[PartialsEnum.type]: partialType,
91+
[PartialsEnum.typeArray]: partialTypeArray,
92+
[PartialsEnum.typeDictionary]: partialTypeDictionary,
93+
[PartialsEnum.typeEnum]: partialTypeEnum,
94+
[PartialsEnum.typeGeneric]: partialTypeGeneric,
95+
[PartialsEnum.typeInterface]: partialTypeInterface,
96+
[PartialsEnum.typeIntersection]: partialTypeIntersection,
97+
[PartialsEnum.typeReference]: partialTypeReference,
98+
[PartialsEnum.typeUnion]: partialTypeUnion,
99+
[PartialsEnum.base]: partialBase,
100+
[PartialsEnum.functionsCatchErrorCodes]: functionsCatchErrorCodes,
101+
[PartialsEnum.functionsGetFormData]: functionsGetFormData,
102+
[PartialsEnum.functionsGetQueryString]: functionsGetQueryString,
103+
[PartialsEnum.functionsGetUrl]: functionsGetUrl,
104+
[PartialsEnum.functionsIsBlob]: functionsIsBlob,
105+
[PartialsEnum.functionsIsDefined]: functionsIsDefined,
106+
[PartialsEnum.functionsIsFormData]: functionsIsFormData,
107+
[PartialsEnum.functionsIsString]: functionsIsString,
108+
[PartialsEnum.functionsIsStringWithValue]: functionsIsStringWithValue,
109+
[PartialsEnum.functionsIsSuccess]: functionsIsSuccess,
110+
[PartialsEnum.functionsBase64]: functionsBase64,
111+
[PartialsEnum.functionsResolve]: functionsResolve,
112+
[PartialsEnum.fetchGetHeaders]: fetchGetHeaders,
113+
[PartialsEnum.fetchGetRequestBody]: fetchGetRequestBody,
114+
[PartialsEnum.fetchGetResponseBody]: fetchGetResponseBody,
115+
[PartialsEnum.fetchGetResponseHeader]: fetchGetResponseHeader,
116+
[PartialsEnum.fetchSendRequest]: fetchSendRequest,
117+
[PartialsEnum.fetchRequest]: fetchRequest,
118+
[PartialsEnum.xhrGetHeaders]: xhrGetHeaders,
119+
[PartialsEnum.xhrGetRequestBody]: xhrGetRequestBody,
120+
[PartialsEnum.xhrGetResponseBody]: xhrGetResponseBody,
121+
[PartialsEnum.xhrGetResponseHeader]: xhrGetResponseHeader,
122+
[PartialsEnum.xhrSendRequest]: xhrSendRequest,
123+
[PartialsEnum.xhrRequest]: xhrRequest,
124+
[PartialsEnum.nodeGetHeaders]: nodeGetHeaders,
125+
[PartialsEnum.nodeGetRequestBody]: nodeGetRequestBody,
126+
[PartialsEnum.nodeGetResponseBody]: nodeGetResponseBody,
127+
[PartialsEnum.nodeGetResponseHeader]: nodeGetResponseHeader,
128+
[PartialsEnum.nodeSendRequest]: nodeSendRequest,
129+
[PartialsEnum.nodeRequest]: nodeRequest,
130+
[PartialsEnum.axiosGetHeaders]: axiosGetHeaders,
131+
[PartialsEnum.axiosGetRequestBody]: axiosGetRequestBody,
132+
[PartialsEnum.axiosGetResponseBody]: axiosGetResponseBody,
133+
[PartialsEnum.axiosGetResponseHeader]: axiosGetResponseHeader,
134+
[PartialsEnum.axiosSendRequest]: axiosSendRequest,
135+
[PartialsEnum.axiosRequest]: axiosRequest,
136+
[PartialsEnum.angularGetHeaders]: angularGetHeaders,
137+
[PartialsEnum.angularGetRequestBody]: angularGetRequestBody,
138+
[PartialsEnum.angularGetResponseBody]: angularGetResponseBody,
139+
[PartialsEnum.angularGetResponseHeader]: angularGetResponseHeader,
140+
[PartialsEnum.angularSendRequest]: angularSendRequest,
141+
[PartialsEnum.angularRequest]: angularRequest,
142+
};

src/utils/defaultTemplates.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import templateClient from '../templates/client.hbs';
2+
import templateCoreApiError from '../templates/core/ApiError.hbs';
3+
import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs';
4+
import templateCoreApiResult from '../templates/core/ApiResult.hbs';
5+
import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs';
6+
import templateCancelablePromise from '../templates/core/CancelablePromise.hbs';
7+
import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs';
8+
import templateCoreSettings from '../templates/core/OpenAPI.hbs';
9+
import templateCoreRequest from '../templates/core/request.hbs';
10+
import templateExportModel from '../templates/exportModel.hbs';
11+
import templateExportSchema from '../templates/exportSchema.hbs';
12+
import templateExportService from '../templates/exportService.hbs';
13+
import templateIndex from '../templates/index.hbs';
14+
import { TemplatesEnum } from './TemplatesEnum';
15+
16+
export const defaultTemplates: Record<TemplatesEnum, TemplateSpecification> = {
17+
[TemplatesEnum['index']]: templateIndex,
18+
[TemplatesEnum['client']]: templateClient,
19+
[TemplatesEnum['exportModel']]: templateExportModel,
20+
[TemplatesEnum['exportSchema']]: templateExportSchema,
21+
[TemplatesEnum['exportService']]: templateExportService,
22+
[TemplatesEnum['coreSettings']]: templateCoreSettings,
23+
[TemplatesEnum['coreApiError']]: templateCoreApiError,
24+
[TemplatesEnum['coreApiRequestOptions']]: templateCoreApiRequestOptions,
25+
[TemplatesEnum['coreApiResult']]: templateCoreApiResult,
26+
[TemplatesEnum['coreCancelablePromise']]: templateCancelablePromise,
27+
[TemplatesEnum['coreRequest']]: templateCoreRequest,
28+
[TemplatesEnum['coreBaseHttpRequest']]: templateCoreBaseHttpRequest,
29+
[TemplatesEnum['coreHttpRequest']]: templateCoreHttpRequest,
30+
};

src/utils/registerHandlebarTemplates.spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { HttpClient } from '../HttpClient';
2+
import { PartialsEnum } from './PartialsEnum';
23
import { registerHandlebarTemplates } from './registerHandlebarTemplates';
4+
import { TemplatesEnum } from './TemplatesEnum';
35

46
describe('registerHandlebarTemplates', () => {
57
it('should return correct templates', () => {
68
const templates = registerHandlebarTemplates({
79
httpClient: HttpClient.FETCH,
810
useOptions: false,
911
useUnionTypes: false,
12+
templatesOverride: {},
13+
partialsOverride: {},
1014
});
1115
expect(templates.index).toBeDefined();
1216
expect(templates.exports.model).toBeDefined();
@@ -18,4 +22,41 @@ describe('registerHandlebarTemplates', () => {
1822
expect(templates.core.apiResult).toBeDefined();
1923
expect(templates.core.request).toBeDefined();
2024
});
25+
it('should allow templateOverwrite', () => {
26+
const customTemplate = 'custom index';
27+
const templates = registerHandlebarTemplates({
28+
httpClient: HttpClient.FETCH,
29+
useOptions: false,
30+
useUnionTypes: false,
31+
templatesOverride: {
32+
[TemplatesEnum.client]: customTemplate,
33+
},
34+
partialsOverride: {},
35+
});
36+
expect(templates.client({})).toEqual('custom index');
37+
});
38+
39+
it('should allow partialOverwrite', () => {
40+
const templates = registerHandlebarTemplates({
41+
httpClient: HttpClient.FETCH,
42+
useOptions: false,
43+
useUnionTypes: false,
44+
templatesOverride: { [TemplatesEnum.index]: `Index template {{> ${PartialsEnum.angularGetHeaders} }}` },
45+
partialsOverride: { [PartialsEnum.angularGetHeaders]: `partial content` },
46+
});
47+
48+
expect(templates.index({})).toEqual('Index template partial content');
49+
});
50+
51+
it('should allow partialOverwrite with a custom template', () => {
52+
const templates = registerHandlebarTemplates({
53+
httpClient: HttpClient.FETCH,
54+
useOptions: false,
55+
useUnionTypes: false,
56+
templatesOverride: { [TemplatesEnum.index]: `Index template {{> custom }}` },
57+
partialsOverride: { custom: `custom content` },
58+
});
59+
60+
expect(templates.index({})).toEqual('Index template custom content');
61+
});
2162
});

0 commit comments

Comments
 (0)