diff --git a/src/index.ts b/src/index.ts index e63919085..5df559414 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import { getOpenApiSpec } from './utils/getOpenApiSpec'; import { getOpenApiVersion, OpenApiVersion } from './utils/getOpenApiVersion'; import { isString } from './utils/isString'; import { postProcessClient } from './utils/postProcessClient'; -import { registerHandlebarTemplates } from './utils/registerHandlebarTemplates'; +import { PartialsOverwrite, registerHandlebarTemplates, TemplatesOverwrite } from './utils/registerHandlebarTemplates'; import { writeClient } from './utils/writeClient'; export { HttpClient } from './HttpClient'; @@ -28,6 +28,8 @@ export type Options = { postfixModels?: string; request?: string; write?: boolean; + templatesOverride?: TemplatesOverwrite; + partialsOverride?: PartialsOverwrite; }; /** @@ -66,6 +68,8 @@ export const generate = async ({ postfixModels = '', request, write = true, + templatesOverride = {}, + partialsOverride = {}, }: Options): Promise => { const openApi = isString(input) ? await getOpenApiSpec(input) : input; const openApiVersion = getOpenApiVersion(openApi); @@ -73,6 +77,8 @@ export const generate = async ({ httpClient, useUnionTypes, useOptions, + templatesOverride, + partialsOverride, }); switch (openApiVersion) { diff --git a/src/utils/PartialsEnum.ts b/src/utils/PartialsEnum.ts new file mode 100644 index 000000000..3e29636cb --- /dev/null +++ b/src/utils/PartialsEnum.ts @@ -0,0 +1,71 @@ +export enum PartialsEnum { + 'exportEnum' = 'exportEnum', + 'exportInterface' = 'exportInterface', + 'exportComposition' = 'exportComposition', + 'exportType' = 'exportType', + 'header' = 'header', + 'isNullable' = 'isNullable', + 'isReadOnly' = 'isReadOnly', + 'isRequired' = 'isRequired', + 'parameters' = 'parameters', + 'result' = 'result', + 'schema' = 'schema', + 'schemaArray' = 'schemaArray', + 'schemaComposition' = 'schemaComposition', + 'schemaDictionary' = 'schemaDictionary', + 'schemaEnum' = 'schemaEnum', + 'schemaGeneric' = 'schemaGeneric', + 'schemaInterface' = 'schemaInterface', + 'type' = 'type', + 'typeArray' = 'typeArray', + 'typeDictionary' = 'typeDictionary', + 'typeEnum' = 'typeEnum', + 'typeGeneric' = 'typeGeneric', + 'typeInterface' = 'typeInterface', + 'typeIntersection' = 'typeIntersection', + 'typeReference' = 'typeReference', + 'typeUnion' = 'typeUnion', + 'base' = 'base', + 'functionsCatchErrorCodes' = 'functions/catchErrorCodes', + 'functionsGetFormData' = 'functions/getFormData', + 'functionsGetQueryString' = 'functions/getQueryString', + 'functionsGetUrl' = 'functions/getUrl', + 'functionsIsBlob' = 'functions/isBlob', + 'functionsIsDefined' = 'functions/isDefined', + 'functionsIsFormData' = 'functions/isFormData', + 'functionsIsString' = 'functions/isString', + 'functionsIsStringWithValue' = 'functions/isStringWithValue', + 'functionsIsSuccess' = 'functions/isSuccess', + 'functionsBase64' = 'functions/base64', + 'functionsResolve' = 'functions/resolve', + 'fetchGetHeaders' = 'fetch/getHeaders', + 'fetchGetRequestBody' = 'fetch/getRequestBody', + 'fetchGetResponseBody' = 'fetch/getResponseBody', + 'fetchGetResponseHeader' = 'fetch/getResponseHeader', + 'fetchSendRequest' = 'fetch/sendRequest', + 'fetchRequest' = 'fetch/request', + 'xhrGetHeaders' = 'xhr/getHeaders', + 'xhrGetRequestBody' = 'xhr/getRequestBody', + 'xhrGetResponseBody' = 'xhr/getResponseBody', + 'xhrGetResponseHeader' = 'xhr/getResponseHeader', + 'xhrSendRequest' = 'xhr/sendRequest', + 'xhrRequest' = 'xhr/request', + 'nodeGetHeaders' = 'node/getHeaders', + 'nodeGetRequestBody' = 'node/getRequestBody', + 'nodeGetResponseBody' = 'node/getResponseBody', + 'nodeGetResponseHeader' = 'node/getResponseHeader', + 'nodeSendRequest' = 'node/sendRequest', + 'nodeRequest' = 'node/request', + 'axiosGetHeaders' = 'axios/getHeaders', + 'axiosGetRequestBody' = 'axios/getRequestBody', + 'axiosGetResponseBody' = 'axios/getResponseBody', + 'axiosGetResponseHeader' = 'axios/getResponseHeader', + 'axiosSendRequest' = 'axios/sendRequest', + 'axiosRequest' = 'axios/request', + 'angularGetHeaders' = 'angular/getHeaders', + 'angularGetRequestBody' = 'angular/getRequestBody', + 'angularGetResponseBody' = 'angular/getResponseBody', + 'angularGetResponseHeader' = 'angular/getResponseHeader', + 'angularSendRequest' = 'angular/sendRequest', + 'angularRequest' = 'angular/request', +} diff --git a/src/utils/TemplatesEnum.ts b/src/utils/TemplatesEnum.ts new file mode 100644 index 000000000..16a5eb919 --- /dev/null +++ b/src/utils/TemplatesEnum.ts @@ -0,0 +1,15 @@ +export enum TemplatesEnum { + 'index' = 'index', + 'client' = 'client', + 'exportModel' = 'exportModel', + 'exportSchema' = 'exportSchema', + 'exportService' = 'exportService', + 'coreSettings' = 'coreSettings', + 'coreApiError' = 'coreApiError', + 'coreApiRequestOptions' = 'coreApiRequestOptions', + 'coreApiResult' = 'coreApiResult', + 'coreCancelablePromise' = 'coreCancelablePromise', + 'coreRequest' = 'coreRequest', + 'coreBaseHttpRequest' = 'coreBaseHttpRequest', + 'coreHttpRequest' = 'coreHttpRequest', +} diff --git a/src/utils/defaultPartials.ts b/src/utils/defaultPartials.ts new file mode 100644 index 000000000..9321b7f64 --- /dev/null +++ b/src/utils/defaultPartials.ts @@ -0,0 +1,142 @@ +import angularGetHeaders from '../templates/core/angular/getHeaders.hbs'; +import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs'; +import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs'; +import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs'; +import angularRequest from '../templates/core/angular/request.hbs'; +import angularSendRequest from '../templates/core/angular/sendRequest.hbs'; +import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; +import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs'; +import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs'; +import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs'; +import axiosRequest from '../templates/core/axios/request.hbs'; +import axiosSendRequest from '../templates/core/axios/sendRequest.hbs'; +import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs'; +import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs'; +import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs'; +import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hbs'; +import fetchRequest from '../templates/core/fetch/request.hbs'; +import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs'; +import functionsBase64 from '../templates/core/functions/base64.hbs'; +import functionsCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs'; +import functionsGetFormData from '../templates/core/functions/getFormData.hbs'; +import functionsGetQueryString from '../templates/core/functions/getQueryString.hbs'; +import functionsGetUrl from '../templates/core/functions/getUrl.hbs'; +import functionsIsBlob from '../templates/core/functions/isBlob.hbs'; +import functionsIsDefined from '../templates/core/functions/isDefined.hbs'; +import functionsIsFormData from '../templates/core/functions/isFormData.hbs'; +import functionsIsString from '../templates/core/functions/isString.hbs'; +import functionsIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; +import functionsIsSuccess from '../templates/core/functions/isSuccess.hbs'; +import functionsResolve from '../templates/core/functions/resolve.hbs'; +import nodeGetHeaders from '../templates/core/node/getHeaders.hbs'; +import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs'; +import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs'; +import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'; +import nodeRequest from '../templates/core/node/request.hbs'; +import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; +import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; +import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; +import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs'; +import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs'; +import xhrRequest from '../templates/core/xhr/request.hbs'; +import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; +import partialBase from '../templates/partials/base.hbs'; +import partialExportComposition from '../templates/partials/exportComposition.hbs'; +import partialExportEnum from '../templates/partials/exportEnum.hbs'; +import partialExportInterface from '../templates/partials/exportInterface.hbs'; +import partialExportType from '../templates/partials/exportType.hbs'; +import partialHeader from '../templates/partials/header.hbs'; +import partialIsNullable from '../templates/partials/isNullable.hbs'; +import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; +import partialIsRequired from '../templates/partials/isRequired.hbs'; +import partialParameters from '../templates/partials/parameters.hbs'; +import partialResult from '../templates/partials/result.hbs'; +import partialSchema from '../templates/partials/schema.hbs'; +import partialSchemaArray from '../templates/partials/schemaArray.hbs'; +import partialSchemaComposition from '../templates/partials/schemaComposition.hbs'; +import partialSchemaDictionary from '../templates/partials/schemaDictionary.hbs'; +import partialSchemaEnum from '../templates/partials/schemaEnum.hbs'; +import partialSchemaGeneric from '../templates/partials/schemaGeneric.hbs'; +import partialSchemaInterface from '../templates/partials/schemaInterface.hbs'; +import partialType from '../templates/partials/type.hbs'; +import partialTypeArray from '../templates/partials/typeArray.hbs'; +import partialTypeDictionary from '../templates/partials/typeDictionary.hbs'; +import partialTypeEnum from '../templates/partials/typeEnum.hbs'; +import partialTypeGeneric from '../templates/partials/typeGeneric.hbs'; +import partialTypeInterface from '../templates/partials/typeInterface.hbs'; +import partialTypeIntersection from '../templates/partials/typeIntersection.hbs'; +import partialTypeReference from '../templates/partials/typeReference.hbs'; +import partialTypeUnion from '../templates/partials/typeUnion.hbs'; +import { PartialsEnum } from './PartialsEnum'; + +export const defaultPartials: Record = { + [PartialsEnum.exportEnum]: partialExportEnum, + [PartialsEnum.exportInterface]: partialExportInterface, + [PartialsEnum.exportComposition]: partialExportComposition, + [PartialsEnum.exportType]: partialExportType, + [PartialsEnum.header]: partialHeader, + [PartialsEnum.isNullable]: partialIsNullable, + [PartialsEnum.isReadOnly]: partialIsReadOnly, + [PartialsEnum.isRequired]: partialIsRequired, + [PartialsEnum.parameters]: partialParameters, + [PartialsEnum.result]: partialResult, + [PartialsEnum.schema]: partialSchema, + [PartialsEnum.schemaArray]: partialSchemaArray, + [PartialsEnum.schemaComposition]: partialSchemaComposition, + [PartialsEnum.schemaDictionary]: partialSchemaDictionary, + [PartialsEnum.schemaEnum]: partialSchemaEnum, + [PartialsEnum.schemaGeneric]: partialSchemaGeneric, + [PartialsEnum.schemaInterface]: partialSchemaInterface, + [PartialsEnum.type]: partialType, + [PartialsEnum.typeArray]: partialTypeArray, + [PartialsEnum.typeDictionary]: partialTypeDictionary, + [PartialsEnum.typeEnum]: partialTypeEnum, + [PartialsEnum.typeGeneric]: partialTypeGeneric, + [PartialsEnum.typeInterface]: partialTypeInterface, + [PartialsEnum.typeIntersection]: partialTypeIntersection, + [PartialsEnum.typeReference]: partialTypeReference, + [PartialsEnum.typeUnion]: partialTypeUnion, + [PartialsEnum.base]: partialBase, + [PartialsEnum.functionsCatchErrorCodes]: functionsCatchErrorCodes, + [PartialsEnum.functionsGetFormData]: functionsGetFormData, + [PartialsEnum.functionsGetQueryString]: functionsGetQueryString, + [PartialsEnum.functionsGetUrl]: functionsGetUrl, + [PartialsEnum.functionsIsBlob]: functionsIsBlob, + [PartialsEnum.functionsIsDefined]: functionsIsDefined, + [PartialsEnum.functionsIsFormData]: functionsIsFormData, + [PartialsEnum.functionsIsString]: functionsIsString, + [PartialsEnum.functionsIsStringWithValue]: functionsIsStringWithValue, + [PartialsEnum.functionsIsSuccess]: functionsIsSuccess, + [PartialsEnum.functionsBase64]: functionsBase64, + [PartialsEnum.functionsResolve]: functionsResolve, + [PartialsEnum.fetchGetHeaders]: fetchGetHeaders, + [PartialsEnum.fetchGetRequestBody]: fetchGetRequestBody, + [PartialsEnum.fetchGetResponseBody]: fetchGetResponseBody, + [PartialsEnum.fetchGetResponseHeader]: fetchGetResponseHeader, + [PartialsEnum.fetchSendRequest]: fetchSendRequest, + [PartialsEnum.fetchRequest]: fetchRequest, + [PartialsEnum.xhrGetHeaders]: xhrGetHeaders, + [PartialsEnum.xhrGetRequestBody]: xhrGetRequestBody, + [PartialsEnum.xhrGetResponseBody]: xhrGetResponseBody, + [PartialsEnum.xhrGetResponseHeader]: xhrGetResponseHeader, + [PartialsEnum.xhrSendRequest]: xhrSendRequest, + [PartialsEnum.xhrRequest]: xhrRequest, + [PartialsEnum.nodeGetHeaders]: nodeGetHeaders, + [PartialsEnum.nodeGetRequestBody]: nodeGetRequestBody, + [PartialsEnum.nodeGetResponseBody]: nodeGetResponseBody, + [PartialsEnum.nodeGetResponseHeader]: nodeGetResponseHeader, + [PartialsEnum.nodeSendRequest]: nodeSendRequest, + [PartialsEnum.nodeRequest]: nodeRequest, + [PartialsEnum.axiosGetHeaders]: axiosGetHeaders, + [PartialsEnum.axiosGetRequestBody]: axiosGetRequestBody, + [PartialsEnum.axiosGetResponseBody]: axiosGetResponseBody, + [PartialsEnum.axiosGetResponseHeader]: axiosGetResponseHeader, + [PartialsEnum.axiosSendRequest]: axiosSendRequest, + [PartialsEnum.axiosRequest]: axiosRequest, + [PartialsEnum.angularGetHeaders]: angularGetHeaders, + [PartialsEnum.angularGetRequestBody]: angularGetRequestBody, + [PartialsEnum.angularGetResponseBody]: angularGetResponseBody, + [PartialsEnum.angularGetResponseHeader]: angularGetResponseHeader, + [PartialsEnum.angularSendRequest]: angularSendRequest, + [PartialsEnum.angularRequest]: angularRequest, +}; diff --git a/src/utils/defaultTemplates.ts b/src/utils/defaultTemplates.ts new file mode 100644 index 000000000..783ae3bc9 --- /dev/null +++ b/src/utils/defaultTemplates.ts @@ -0,0 +1,30 @@ +import templateClient from '../templates/client.hbs'; +import templateCoreApiError from '../templates/core/ApiError.hbs'; +import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; +import templateCoreApiResult from '../templates/core/ApiResult.hbs'; +import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; +import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; +import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; +import templateCoreSettings from '../templates/core/OpenAPI.hbs'; +import templateCoreRequest from '../templates/core/request.hbs'; +import templateExportModel from '../templates/exportModel.hbs'; +import templateExportSchema from '../templates/exportSchema.hbs'; +import templateExportService from '../templates/exportService.hbs'; +import templateIndex from '../templates/index.hbs'; +import { TemplatesEnum } from './TemplatesEnum'; + +export const defaultTemplates: Record = { + [TemplatesEnum['index']]: templateIndex, + [TemplatesEnum['client']]: templateClient, + [TemplatesEnum['exportModel']]: templateExportModel, + [TemplatesEnum['exportSchema']]: templateExportSchema, + [TemplatesEnum['exportService']]: templateExportService, + [TemplatesEnum['coreSettings']]: templateCoreSettings, + [TemplatesEnum['coreApiError']]: templateCoreApiError, + [TemplatesEnum['coreApiRequestOptions']]: templateCoreApiRequestOptions, + [TemplatesEnum['coreApiResult']]: templateCoreApiResult, + [TemplatesEnum['coreCancelablePromise']]: templateCancelablePromise, + [TemplatesEnum['coreRequest']]: templateCoreRequest, + [TemplatesEnum['coreBaseHttpRequest']]: templateCoreBaseHttpRequest, + [TemplatesEnum['coreHttpRequest']]: templateCoreHttpRequest, +}; diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts index 5e1302384..2128e09c0 100644 --- a/src/utils/registerHandlebarTemplates.spec.ts +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -1,5 +1,7 @@ import { HttpClient } from '../HttpClient'; +import { PartialsEnum } from './PartialsEnum'; import { registerHandlebarTemplates } from './registerHandlebarTemplates'; +import { TemplatesEnum } from './TemplatesEnum'; describe('registerHandlebarTemplates', () => { it('should return correct templates', () => { @@ -7,6 +9,8 @@ describe('registerHandlebarTemplates', () => { httpClient: HttpClient.FETCH, useOptions: false, useUnionTypes: false, + templatesOverride: {}, + partialsOverride: {}, }); expect(templates.index).toBeDefined(); expect(templates.exports.model).toBeDefined(); @@ -18,4 +22,41 @@ describe('registerHandlebarTemplates', () => { expect(templates.core.apiResult).toBeDefined(); expect(templates.core.request).toBeDefined(); }); + it('should allow templateOverwrite', () => { + const customTemplate = 'custom index'; + const templates = registerHandlebarTemplates({ + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + templatesOverride: { + [TemplatesEnum.client]: customTemplate, + }, + partialsOverride: {}, + }); + expect(templates.client({})).toEqual('custom index'); + }); + + it('should allow partialOverwrite', () => { + const templates = registerHandlebarTemplates({ + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + templatesOverride: { [TemplatesEnum.index]: `Index template {{> ${PartialsEnum.angularGetHeaders} }}` }, + partialsOverride: { [PartialsEnum.angularGetHeaders]: `partial content` }, + }); + + expect(templates.index({})).toEqual('Index template partial content'); + }); + + it('should allow partialOverwrite with a custom template', () => { + const templates = registerHandlebarTemplates({ + httpClient: HttpClient.FETCH, + useOptions: false, + useUnionTypes: false, + templatesOverride: { [TemplatesEnum.index]: `Index template {{> custom }}` }, + partialsOverride: { custom: `custom content` }, + }); + + expect(templates.index({})).toEqual('Index template custom content'); + }); }); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..290819868 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -1,89 +1,12 @@ +import { precompile } from 'handlebars'; import Handlebars from 'handlebars/runtime'; import { HttpClient } from '../HttpClient'; -import templateClient from '../templates/client.hbs'; -import angularGetHeaders from '../templates/core/angular/getHeaders.hbs'; -import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs'; -import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs'; -import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs'; -import angularRequest from '../templates/core/angular/request.hbs'; -import angularSendRequest from '../templates/core/angular/sendRequest.hbs'; -import templateCoreApiError from '../templates/core/ApiError.hbs'; -import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; -import templateCoreApiResult from '../templates/core/ApiResult.hbs'; -import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; -import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs'; -import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs'; -import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs'; -import axiosRequest from '../templates/core/axios/request.hbs'; -import axiosSendRequest from '../templates/core/axios/sendRequest.hbs'; -import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; -import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; -import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs'; -import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs'; -import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs'; -import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hbs'; -import fetchRequest from '../templates/core/fetch/request.hbs'; -import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs'; -import functionBase64 from '../templates/core/functions/base64.hbs'; -import functionCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs'; -import functionGetFormData from '../templates/core/functions/getFormData.hbs'; -import functionGetQueryString from '../templates/core/functions/getQueryString.hbs'; -import functionGetUrl from '../templates/core/functions/getUrl.hbs'; -import functionIsBlob from '../templates/core/functions/isBlob.hbs'; -import functionIsDefined from '../templates/core/functions/isDefined.hbs'; -import functionIsFormData from '../templates/core/functions/isFormData.hbs'; -import functionIsString from '../templates/core/functions/isString.hbs'; -import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; -import functionIsSuccess from '../templates/core/functions/isSuccess.hbs'; -import functionResolve from '../templates/core/functions/resolve.hbs'; -import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; -import nodeGetHeaders from '../templates/core/node/getHeaders.hbs'; -import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs'; -import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs'; -import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'; -import nodeRequest from '../templates/core/node/request.hbs'; -import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; -import templateCoreSettings from '../templates/core/OpenAPI.hbs'; -import templateCoreRequest from '../templates/core/request.hbs'; -import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; -import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; -import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs'; -import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs'; -import xhrRequest from '../templates/core/xhr/request.hbs'; -import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; -import templateExportModel from '../templates/exportModel.hbs'; -import templateExportSchema from '../templates/exportSchema.hbs'; -import templateExportService from '../templates/exportService.hbs'; -import templateIndex from '../templates/index.hbs'; -import partialBase from '../templates/partials/base.hbs'; -import partialExportComposition from '../templates/partials/exportComposition.hbs'; -import partialExportEnum from '../templates/partials/exportEnum.hbs'; -import partialExportInterface from '../templates/partials/exportInterface.hbs'; -import partialExportType from '../templates/partials/exportType.hbs'; -import partialHeader from '../templates/partials/header.hbs'; -import partialIsNullable from '../templates/partials/isNullable.hbs'; -import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; -import partialIsRequired from '../templates/partials/isRequired.hbs'; -import partialParameters from '../templates/partials/parameters.hbs'; -import partialResult from '../templates/partials/result.hbs'; -import partialSchema from '../templates/partials/schema.hbs'; -import partialSchemaArray from '../templates/partials/schemaArray.hbs'; -import partialSchemaComposition from '../templates/partials/schemaComposition.hbs'; -import partialSchemaDictionary from '../templates/partials/schemaDictionary.hbs'; -import partialSchemaEnum from '../templates/partials/schemaEnum.hbs'; -import partialSchemaGeneric from '../templates/partials/schemaGeneric.hbs'; -import partialSchemaInterface from '../templates/partials/schemaInterface.hbs'; -import partialType from '../templates/partials/type.hbs'; -import partialTypeArray from '../templates/partials/typeArray.hbs'; -import partialTypeDictionary from '../templates/partials/typeDictionary.hbs'; -import partialTypeEnum from '../templates/partials/typeEnum.hbs'; -import partialTypeGeneric from '../templates/partials/typeGeneric.hbs'; -import partialTypeInterface from '../templates/partials/typeInterface.hbs'; -import partialTypeIntersection from '../templates/partials/typeIntersection.hbs'; -import partialTypeReference from '../templates/partials/typeReference.hbs'; -import partialTypeUnion from '../templates/partials/typeUnion.hbs'; +import { defaultPartials } from './defaultPartials'; +import { defaultTemplates } from './defaultTemplates'; +import { PartialsEnum } from './PartialsEnum'; import { registerHandlebarHelpers } from './registerHandlebarHelpers'; +import { TemplatesEnum } from './TemplatesEnum'; export interface Templates { index: Handlebars.TemplateDelegate; @@ -105,6 +28,24 @@ export interface Templates { }; } +export interface TemplatesOverwrite extends Partial> {} +export interface PartialsOverwrite + extends Partial> {} + +const getTemplate = ( + index: PartialsEnum | TemplatesEnum | string, + templates: Partial> +): HandlebarsTemplateDelegate => { + const template = Object.entries(templates).find(([key]) => key === index)?.[1]; + if (!template) { + throw new Error('Template not found'); + } + if (typeof template === 'string') { + return Handlebars.template(evalPrecompiledTemplate(precompile(template))); + } else { + return Handlebars.template(template); + } +}; /** * Read all the Handlebar templates that we need and return on wrapper object * so we can easily access the templates in out generator / write functions. @@ -113,112 +54,55 @@ export const registerHandlebarTemplates = (root: { httpClient: HttpClient; useOptions: boolean; useUnionTypes: boolean; + templatesOverride: TemplatesOverwrite; + partialsOverride: PartialsOverwrite; }): Templates => { + const templatesOverride = root.templatesOverride ?? {}; + const partialsOverride = root.partialsOverride ?? {}; + const allTemplates = { + ...defaultTemplates, + + ...templatesOverride, + }; + const allPartials = { + ...defaultPartials, + ...partialsOverride, + }; registerHandlebarHelpers(root); // Main templates (entry points for the files we write to disk) const templates: Templates = { - index: Handlebars.template(templateIndex), - client: Handlebars.template(templateClient), + index: getTemplate(TemplatesEnum.index, allTemplates), + client: getTemplate(TemplatesEnum.client, allTemplates), exports: { - model: Handlebars.template(templateExportModel), - schema: Handlebars.template(templateExportSchema), - service: Handlebars.template(templateExportService), + model: getTemplate(TemplatesEnum.exportModel, allTemplates), + schema: getTemplate(TemplatesEnum.exportSchema, allTemplates), + service: getTemplate(TemplatesEnum.exportService, allTemplates), }, core: { - settings: Handlebars.template(templateCoreSettings), - apiError: Handlebars.template(templateCoreApiError), - apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), - apiResult: Handlebars.template(templateCoreApiResult), - cancelablePromise: Handlebars.template(templateCancelablePromise), - request: Handlebars.template(templateCoreRequest), - baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), - httpRequest: Handlebars.template(templateCoreHttpRequest), + settings: getTemplate(TemplatesEnum.coreSettings, allTemplates), + apiError: getTemplate(TemplatesEnum.coreApiError, allTemplates), + apiRequestOptions: getTemplate(TemplatesEnum.coreApiRequestOptions, allTemplates), + + apiResult: getTemplate(TemplatesEnum.coreApiResult, allTemplates), + cancelablePromise: getTemplate(TemplatesEnum.coreCancelablePromise, allTemplates), + request: getTemplate(TemplatesEnum.coreRequest, allTemplates), + baseHttpRequest: getTemplate(TemplatesEnum.coreBaseHttpRequest, allTemplates), + httpRequest: getTemplate(TemplatesEnum.coreHttpRequest, allTemplates), }, }; - // Partials for the generations of the models, services, etc. - Handlebars.registerPartial('exportEnum', Handlebars.template(partialExportEnum)); - Handlebars.registerPartial('exportInterface', Handlebars.template(partialExportInterface)); - Handlebars.registerPartial('exportComposition', Handlebars.template(partialExportComposition)); - Handlebars.registerPartial('exportType', Handlebars.template(partialExportType)); - Handlebars.registerPartial('header', Handlebars.template(partialHeader)); - Handlebars.registerPartial('isNullable', Handlebars.template(partialIsNullable)); - Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); - Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); - Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); - Handlebars.registerPartial('result', Handlebars.template(partialResult)); - Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); - Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); - Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); - Handlebars.registerPartial('schemaEnum', Handlebars.template(partialSchemaEnum)); - Handlebars.registerPartial('schemaGeneric', Handlebars.template(partialSchemaGeneric)); - Handlebars.registerPartial('schemaInterface', Handlebars.template(partialSchemaInterface)); - Handlebars.registerPartial('schemaComposition', Handlebars.template(partialSchemaComposition)); - Handlebars.registerPartial('type', Handlebars.template(partialType)); - Handlebars.registerPartial('typeArray', Handlebars.template(partialTypeArray)); - Handlebars.registerPartial('typeDictionary', Handlebars.template(partialTypeDictionary)); - Handlebars.registerPartial('typeEnum', Handlebars.template(partialTypeEnum)); - Handlebars.registerPartial('typeGeneric', Handlebars.template(partialTypeGeneric)); - Handlebars.registerPartial('typeInterface', Handlebars.template(partialTypeInterface)); - Handlebars.registerPartial('typeReference', Handlebars.template(partialTypeReference)); - Handlebars.registerPartial('typeUnion', Handlebars.template(partialTypeUnion)); - Handlebars.registerPartial('typeIntersection', Handlebars.template(partialTypeIntersection)); - Handlebars.registerPartial('base', Handlebars.template(partialBase)); - - // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info - Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); - Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); - Handlebars.registerPartial('functions/getQueryString', Handlebars.template(functionGetQueryString)); - Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); - Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob)); - Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined)); - Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData)); - Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString)); - Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue)); - Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess)); - Handlebars.registerPartial('functions/base64', Handlebars.template(functionBase64)); - Handlebars.registerPartial('functions/resolve', Handlebars.template(functionResolve)); - - // Specific files for the fetch client implementation - Handlebars.registerPartial('fetch/getHeaders', Handlebars.template(fetchGetHeaders)); - Handlebars.registerPartial('fetch/getRequestBody', Handlebars.template(fetchGetRequestBody)); - Handlebars.registerPartial('fetch/getResponseBody', Handlebars.template(fetchGetResponseBody)); - Handlebars.registerPartial('fetch/getResponseHeader', Handlebars.template(fetchGetResponseHeader)); - Handlebars.registerPartial('fetch/sendRequest', Handlebars.template(fetchSendRequest)); - Handlebars.registerPartial('fetch/request', Handlebars.template(fetchRequest)); - - // Specific files for the xhr client implementation - Handlebars.registerPartial('xhr/getHeaders', Handlebars.template(xhrGetHeaders)); - Handlebars.registerPartial('xhr/getRequestBody', Handlebars.template(xhrGetRequestBody)); - Handlebars.registerPartial('xhr/getResponseBody', Handlebars.template(xhrGetResponseBody)); - Handlebars.registerPartial('xhr/getResponseHeader', Handlebars.template(xhrGetResponseHeader)); - Handlebars.registerPartial('xhr/sendRequest', Handlebars.template(xhrSendRequest)); - Handlebars.registerPartial('xhr/request', Handlebars.template(xhrRequest)); - - // Specific files for the node client implementation - Handlebars.registerPartial('node/getHeaders', Handlebars.template(nodeGetHeaders)); - Handlebars.registerPartial('node/getRequestBody', Handlebars.template(nodeGetRequestBody)); - Handlebars.registerPartial('node/getResponseBody', Handlebars.template(nodeGetResponseBody)); - Handlebars.registerPartial('node/getResponseHeader', Handlebars.template(nodeGetResponseHeader)); - Handlebars.registerPartial('node/sendRequest', Handlebars.template(nodeSendRequest)); - Handlebars.registerPartial('node/request', Handlebars.template(nodeRequest)); - - // Specific files for the axios client implementation - Handlebars.registerPartial('axios/getHeaders', Handlebars.template(axiosGetHeaders)); - Handlebars.registerPartial('axios/getRequestBody', Handlebars.template(axiosGetRequestBody)); - Handlebars.registerPartial('axios/getResponseBody', Handlebars.template(axiosGetResponseBody)); - Handlebars.registerPartial('axios/getResponseHeader', Handlebars.template(axiosGetResponseHeader)); - Handlebars.registerPartial('axios/sendRequest', Handlebars.template(axiosSendRequest)); - Handlebars.registerPartial('axios/request', Handlebars.template(axiosRequest)); - - // Specific files for the angular client implementation - Handlebars.registerPartial('angular/getHeaders', Handlebars.template(angularGetHeaders)); - Handlebars.registerPartial('angular/getRequestBody', Handlebars.template(angularGetRequestBody)); - Handlebars.registerPartial('angular/getResponseBody', Handlebars.template(angularGetResponseBody)); - Handlebars.registerPartial('angular/getResponseHeader', Handlebars.template(angularGetResponseHeader)); - Handlebars.registerPartial('angular/sendRequest', Handlebars.template(angularSendRequest)); - Handlebars.registerPartial('angular/request', Handlebars.template(angularRequest)); + const keys: Set = new Set([ + ...Object.keys(partialsOverride), + ...Object.keys(partialsOverride), + ]); + keys.forEach(key => { + Handlebars.registerPartial(key, getTemplate(key, allPartials)); + }); return templates; }; + +const evalPrecompiledTemplate = (specification: TemplateSpecification) => { + return eval('(' + specification + ');'); +}; diff --git a/tsconfig.json b/tsconfig.json index 8d27e49a8..1084aff86 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,7 @@ }, "files": [ - "./src/typings/hbs.d.ts" + "./src/typings/hbs.d.ts", "./src/utils/TemplatesEnum.ts", "./src/utils/PartialsEnum.ts", "./src/utils/defaultPartials.ts" ], "include": [