From 9d8a30dbd4dfdd1daad2bfedcae17f7460f81458 Mon Sep 17 00:00:00 2001 From: Sachin Ranchod Date: Thu, 1 Dec 2022 14:05:13 -0800 Subject: [PATCH 1/4] add functionality to create samples alongside client --- bin/index.js | 2 + src/index.ts | 4 + src/utils/registerHandlebarTemplates.ts | 3 + src/utils/writeClient.spec.ts | 2 + src/utils/writeClient.ts | 20 + src/utils/writeClientClass.spec.ts | 1 + src/utils/writeClientCore.spec.ts | 1 + src/utils/writeClientIndex.spec.ts | 1 + src/utils/writeClientModels.spec.ts | 1 + src/utils/writeClientSchemas.spec.ts | 1 + src/utils/writeClientServices.spec.ts | 1 + test/__snapshots__/index.spec.ts.snap | 1032 +++++++++++++++++++++++ 12 files changed, 1069 insertions(+) diff --git a/bin/index.js b/bin/index.js index ed8b0889b..5e4b29a22 100755 --- a/bin/index.js +++ b/bin/index.js @@ -17,6 +17,7 @@ const params = program .option('--useOptions', 'Use options instead of arguments') .option('--useUnionTypes', 'Use union types instead of enums') .option('--exportCore ', 'Write core files to disk', true) + .option('--exportSamples ', 'Write samples to disk', true) .option('--exportServices ', 'Write services to disk', true) .option('--exportModels ', 'Write models to disk', true) .option('--exportSchemas ', 'Write schemas to disk', false) @@ -39,6 +40,7 @@ if (OpenAPI) { useOptions: params.useOptions, useUnionTypes: params.useUnionTypes, exportCore: JSON.parse(params.exportCore) === true, + exportSamples: JSON.parse(params.exportSamples) === true, exportServices: JSON.parse(params.exportServices) === true, exportModels: JSON.parse(params.exportModels) === true, exportSchemas: JSON.parse(params.exportSchemas) === true, diff --git a/src/index.ts b/src/index.ts index e63919085..89ab903b8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ export type Options = { useOptions?: boolean; useUnionTypes?: boolean; exportCore?: boolean; + exportSamples?: boolean; exportServices?: boolean; exportModels?: boolean; exportSchemas?: boolean; @@ -58,6 +59,7 @@ export const generate = async ({ useOptions = false, useUnionTypes = false, exportCore = true, + exportSamples = true, exportServices = true, exportModels = true, exportSchemas = false, @@ -88,6 +90,7 @@ export const generate = async ({ useOptions, useUnionTypes, exportCore, + exportSamples, exportServices, exportModels, exportSchemas, @@ -112,6 +115,7 @@ export const generate = async ({ useOptions, useUnionTypes, exportCore, + exportSamples, exportServices, exportModels, exportSchemas, diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..7ba1ce83e 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -53,6 +53,7 @@ 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 templateExportSample from '../templates/exportSample.hbs'; import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; import templateIndex from '../templates/index.hbs'; @@ -92,6 +93,7 @@ export interface Templates { model: Handlebars.TemplateDelegate; schema: Handlebars.TemplateDelegate; service: Handlebars.TemplateDelegate; + sample: HandlebarsTemplateDelegate; }; core: { settings: Handlebars.TemplateDelegate; @@ -124,6 +126,7 @@ export const registerHandlebarTemplates = (root: { model: Handlebars.template(templateExportModel), schema: Handlebars.template(templateExportSchema), service: Handlebars.template(templateExportService), + sample: Handlebars.template(templateExportSample), }, core: { settings: Handlebars.template(templateCoreSettings), diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 3c06a95a5..5d16abec3 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -22,6 +22,7 @@ describe('writeClient', () => { exports: { model: () => 'model', schema: () => 'schema', + sample: () => 'sample', service: () => 'service', }, core: { @@ -47,6 +48,7 @@ describe('writeClient', () => { true, true, true, + true, Indent.SPACE_4, 'Service', 'AppClient' diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index cea2f3d88..a1549fa59 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -11,6 +11,7 @@ import { writeClientClass } from './writeClientClass'; import { writeClientCore } from './writeClientCore'; import { writeClientIndex } from './writeClientIndex'; import { writeClientModels } from './writeClientModels'; +import { writeClientSamples } from './writeClientSamples'; import { writeClientSchemas } from './writeClientSchemas'; import { writeClientServices } from './writeClientServices'; @@ -24,6 +25,7 @@ import { writeClientServices } from './writeClientServices'; * @param useUnionTypes Use union types instead of enums * @param exportCore Generate core client classes * @param exportServices Generate services + * @param exportSamples Generate samples * @param exportModels Generate models * @param exportSchemas Generate schemas * @param exportSchemas Generate schemas @@ -41,6 +43,7 @@ export const writeClient = async ( useOptions: boolean, useUnionTypes: boolean, exportCore: boolean, + exportSamples: boolean, exportServices: boolean, exportModels: boolean, exportSchemas: boolean, @@ -55,6 +58,7 @@ export const writeClient = async ( const outputPathModels = resolve(outputPath, 'models'); const outputPathSchemas = resolve(outputPath, 'schemas'); const outputPathServices = resolve(outputPath, 'services'); + const outputPathSamples = resolve(outputPath, 'samples'); if (!isSubDirectory(process.cwd(), output)) { throw new Error(`Output folder is not a subdirectory of the current working directory`); @@ -82,6 +86,22 @@ export const writeClient = async ( ); } + if (exportSamples) { + await rmdir(outputPathSamples); + await mkdir(outputPathSamples); + await writeClientSamples( + client.services, + templates, + outputPathSamples, + httpClient, + useUnionTypes, + useOptions, + indent, + '', + clientName + ); + } + if (exportSchemas) { await rmdir(outputPathSchemas); await mkdir(outputPathSchemas); diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 102f2eb57..f429dbb1d 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -21,6 +21,7 @@ describe('writeClientClass', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 36990054e..6fadff913 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -23,6 +23,7 @@ describe('writeClientCore', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index a74421115..4bdc03e30 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -19,6 +19,7 @@ describe('writeClientIndex', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index e147c8e73..c01a1a7b6 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -36,6 +36,7 @@ describe('writeClientModels', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index f71286232..ce4774e3a 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -36,6 +36,7 @@ describe('writeClientSchemas', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index b7ebbfe6c..18bb050c0 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -24,6 +24,7 @@ describe('writeClientServices', () => { client: () => 'client', exports: { model: () => 'model', + sample: () => 'sample', schema: () => 'schema', service: () => 'service', }, diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index eefa4ffe0..080e4c339 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -1455,6 +1455,453 @@ export type SimpleStringWithPattern = string; " `; +exports[`v2 should generate: ./test/generated/v2/samples/CollectionFormat/collectionFormatService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterArrayCsv: Array; + parameterArraySsv: Array; + parameterArrayTsv: Array; + parameterArrayPipes: Array; + parameterArrayMulti: Array; +}) { + const res = await client.collectionFormat.collectionFormat(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Complex/complexTypesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterObject: { + first?: { + second?: { + third?: string; + }; + }; + }; + parameterReference: ModelWithString; +}) { + const res = await client.complex.complexTypes(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Default/serviceWithEmptyTagService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.default.serviceWithEmptyTag(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Defaults/callToTestOrderOfParamsService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterStringWithNoDefault: string; + parameterOptionalStringWithDefault: string = 'Hello World!'; + parameterOptionalStringWithEmptyDefault: string = ''; + parameterOptionalStringWithNoDefault?: string; + parameterStringWithDefault: string = 'Hello World!'; + parameterStringWithEmptyDefault: string = ''; + parameterStringNullableWithNoDefault?: string | null; + parameterStringNullableWithDefault: string | null = null; +}) { + const res = await client.defaults.callToTestOrderOfParams(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Defaults/callWithDefaultOptionalParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterString: string = 'Hello World!'; + parameterNumber: number = 123; + parameterBoolean: boolean = true; + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success'; + parameterModel: ModelWithString = { + "prop": "Hello World!" + }; +}) { + const res = await client.defaults.callWithDefaultOptionalParameters(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Defaults/callWithDefaultParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterString: string = 'Hello World!'; + parameterNumber: number = 123; + parameterBoolean: boolean = true; + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success'; + parameterModel: ModelWithString = { + "prop": "Hello World!" + }; +}) { + const res = await client.defaults.callWithDefaultParameters(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Descriptions/callWithDescriptionsService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterWithBreaks?: string; + parameterWithBackticks?: string; + parameterWithSlashes?: string; + parameterWithExpressionPlaceholders?: string; + parameterWithQuotes?: string; + parameterWithReservedCharacters?: string; +}) { + const res = await client.descriptions.callWithDescriptions(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Duplicate/duplicateName1Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName1(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Duplicate/duplicateName2Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName2(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Duplicate/duplicateName3Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName3(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Duplicate/duplicateNameService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Error/testErrorCodeService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + status: string; +}) { + const res = await client.error.testErrorCode(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Header/callWithResultFromHeaderService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.header.callWithResultFromHeader(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/MultipleTags1/dummyAService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags1.dummyA(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/MultipleTags1/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags1.dummyB(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/MultipleTags2/dummyAService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags2.dummyA(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/MultipleTags2/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags2.dummyB(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/MultipleTags3/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags3.dummyB(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/NoContent/callWithNoContentResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.noContent.callWithNoContentResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Parameters/callWithParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterHeader: string; + parameterQuery: string; + parameterForm: string; + parameterBody: string; + parameterPath: string; +}) { + const res = await client.parameters.callWithParameters(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Parameters/callWithWeirdParameterNamesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterHeader: string; + parameterQuery: string; + parameterForm: string; + parameterBody: string; + parameterPath1?: string; + parameterPath2?: string; + parameterPath3?: string; + _default?: string; +}) { + const res = await client.parameters.callWithWeirdParameterNames(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Response/callWithDuplicateResponsesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithDuplicateResponses(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Response/callWithResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Response/callWithResponsesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithResponses(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/deleteCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.deleteCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/getCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.getCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/headCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.headCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/optionsCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.optionsCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/patchCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.patchCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/postCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.postCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Simple/putCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.putCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v2 should generate: ./test/generated/v2/samples/Types/typesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterArray: Array; + parameterDictionary: Record; + parameterEnum: 'Success' | 'Warning' | 'Error'; + parameterNumber: number = 123; + parameterString: string = 'default'; + parameterBoolean: boolean = true; + parameterObject: any = null; + id?: number; +}) { + const res = await client.types.types(args); + + return res; +} +" +`; + exports[`v2 should generate: ./test/generated/v2/schemas/$_default.ts 1`] = ` "/* istanbul ignore file */ /* tslint:disable */ @@ -4941,6 +5388,591 @@ export type SimpleStringWithPattern = string | null; " `; +exports[`v3 should generate: ./test/generated/v3/samples/CollectionFormat/collectionFormatService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterArrayCsv: Array | null; + parameterArraySsv: Array | null; + parameterArrayTsv: Array | null; + parameterArrayPipes: Array | null; + parameterArrayMulti: Array | null; +}) { + const res = await client.collectionFormat.collectionFormat(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Complex/complexParamsService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + id: number; + requestBody?: { + readonly key: string | null; + name: string | null; + enabled?: boolean; + readonly type: 'Monkey' | 'Horse' | 'Bird'; + listOfModels?: Array | null; + listOfStrings?: Array | null; + parameters: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); + readonly user?: { + readonly id?: number; + readonly name?: string | null; + }; + }; +}) { + const res = await client.complex.complexParams(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Complex/complexTypesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterObject: { + first?: { + second?: { + third?: string; + }; + }; + }; + parameterReference: ModelWithString; +}) { + const res = await client.complex.complexTypes(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Default/serviceWithEmptyTagService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.default.serviceWithEmptyTag(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Defaults/callToTestOrderOfParamsService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterStringWithNoDefault: string; + parameterOptionalStringWithDefault: string = 'Hello World!'; + parameterOptionalStringWithEmptyDefault: string = ''; + parameterOptionalStringWithNoDefault?: string; + parameterStringWithDefault: string = 'Hello World!'; + parameterStringWithEmptyDefault: string = ''; + parameterStringNullableWithNoDefault?: string | null; + parameterStringNullableWithDefault: string | null = null; +}) { + const res = await client.defaults.callToTestOrderOfParams(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Defaults/callWithDefaultOptionalParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterString: string = 'Hello World!'; + parameterNumber: number = 123; + parameterBoolean: boolean = true; + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success'; + parameterModel: ModelWithString = { + "prop": "Hello World!" + }; +}) { + const res = await client.defaults.callWithDefaultOptionalParameters(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Defaults/callWithDefaultParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterString: string | null = 'Hello World!'; + parameterNumber: number | null = 123; + parameterBoolean: boolean | null = true; + parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success'; + parameterModel: ModelWithString | null = { + "prop": "Hello World!" + }; +}) { + const res = await client.defaults.callWithDefaultParameters(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Deprecated/deprecatedCallService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameter: DeprecatedModel | null; +}) { + const res = await client.deprecated.deprecatedCall(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Descriptions/callWithDescriptionsService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterWithBreaks?: any; + parameterWithBackticks?: any; + parameterWithSlashes?: any; + parameterWithExpressionPlaceholders?: any; + parameterWithQuotes?: any; + parameterWithReservedCharacters?: any; +}) { + const res = await client.descriptions.callWithDescriptions(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Duplicate/duplicateName1Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName1(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Duplicate/duplicateName2Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName2(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Duplicate/duplicateName3Service.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName3(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Duplicate/duplicateNameService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.duplicate.duplicateName(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Error/testErrorCodeService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + status: number; +}) { + const res = await client.error.testErrorCode(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/FormData/postApiFormDataService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameter?: string; + formData?: ModelWithString; +}) { + const res = await client.formData.postApiFormData(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Header/callWithResultFromHeaderService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.header.callWithResultFromHeader(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Multipart/multipartRequestService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + formData?: { + content?: Blob; + data?: ModelWithString | null; + }; +}) { + const res = await client.multipart.multipartRequest(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Multipart/multipartResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipart.multipartResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/MultipleTags1/dummyAService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags1.dummyA(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/MultipleTags1/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags1.dummyB(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/MultipleTags2/dummyAService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags2.dummyA(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/MultipleTags2/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags2.dummyB(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/MultipleTags3/dummyBService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.multipleTags3.dummyB(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/NoContent/callWithNoContentResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.noContent.callWithNoContentResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Parameters/callWithParametersService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterHeader: string | null; + parameterQuery: string | null; + parameterForm: string | null; + parameterCookie: string | null; + parameterPath: string | null; + requestBody: ModelWithString | null; +}) { + const res = await client.parameters.callWithParameters(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Parameters/callWithWeirdParameterNamesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterHeader: string | null; + parameterQuery: string | null; + parameterForm: string | null; + parameterCookie: string | null; + requestBody: ModelWithString | null; + parameterPath1?: string; + parameterPath2?: string; + parameterPath3?: string; + _default?: string; +}) { + const res = await client.parameters.callWithWeirdParameterNames(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Parameters/getCallWithOptionalParamService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + requestBody: ModelWithString; + parameter?: string; +}) { + const res = await client.parameters.getCallWithOptionalParam(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Parameters/postCallWithOptionalParamService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameter: Pageable; + requestBody?: ModelWithString; +}) { + const res = await client.parameters.postCallWithOptionalParam(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/RequestBody/postApiRequestBodyService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameter?: string; + requestBody?: ModelWithString; +}) { + const res = await client.requestBody.postApiRequestBody(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Response/callWithDuplicateResponsesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithDuplicateResponses(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Response/callWithResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Response/callWithResponsesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.response.callWithResponses(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/deleteCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.deleteCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/getCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.getCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/headCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.headCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/optionsCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.optionsCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/patchCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.patchCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/postCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.postCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Simple/putCallWithoutParametersAndResponseService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { +}) { + const res = await client.simple.putCallWithoutParametersAndResponse(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Types/typesService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + parameterArray: Array | null; + parameterDictionary: Record | null; + parameterEnum: 'Success' | 'Warning' | 'Error' | null; + parameterNumber: number = 123; + parameterString: string | null = 'default'; + parameterBoolean: boolean | null = true; + parameterObject: Record | null = null; + id?: number; +}) { + const res = await client.types.types(args); + + return res; +} +" +`; + +exports[`v3 should generate: ./test/generated/v3/samples/Upload/uploadFileService.ts 1`] = ` +"import client from 'github-connector'; + +export default async function main(args: { + file: Blob; +}) { + const res = await client.upload.uploadFile(args); + + return res; +} +" +`; + exports[`v3 should generate: ./test/generated/v3/schemas/$_default.ts 1`] = ` "/* istanbul ignore file */ /* tslint:disable */ From c6ca5f18c251601ee1c02a2733d21e08e59b091f Mon Sep 17 00:00:00 2001 From: Sachin Ranchod Date: Thu, 1 Dec 2022 14:05:27 -0800 Subject: [PATCH 2/4] add missing files --- src/templates/exportSample.hbs | 11 +++++++ src/utils/writeClientSamples.ts | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/templates/exportSample.hbs create mode 100644 src/utils/writeClientSamples.ts diff --git a/src/templates/exportSample.hbs b/src/templates/exportSample.hbs new file mode 100644 index 000000000..11c6cb1e2 --- /dev/null +++ b/src/templates/exportSample.hbs @@ -0,0 +1,11 @@ +import client from 'github-connector'; + +export default async function main(args: { +{{#each parameters}} + {{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}}; +{{/each}} +}) { + const res = await client.{{{camelCase serviceName}}}.{{name}}(args); + + return res; +} \ No newline at end of file diff --git a/src/utils/writeClientSamples.ts b/src/utils/writeClientSamples.ts new file mode 100644 index 000000000..37a7ff13c --- /dev/null +++ b/src/utils/writeClientSamples.ts @@ -0,0 +1,51 @@ +import { join, resolve } from 'path'; + +import type { Service } from '../client/interfaces/Service'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { mkdir, writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import { isDefined } from './isDefined'; +import type { Templates } from './registerHandlebarTemplates'; + +/** + * Generate Services using the Handlebar template and write to disk. + * @param services Array of Services to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param useOptions Use options or arguments functions + * @param indent Indentation options (4, 2 or tab) + * @param postfix Service name postfix + * @param clientName Custom client class name + */ +export const writeClientSamples = async ( + services: Service[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + useOptions: boolean, + indent: Indent, + postfix: string, + clientName?: string +): Promise => { + for (const service of services) { + await mkdir(join(outputPath, service.name)); + for (const operation of service.operations) { + const file = resolve(outputPath, service.name, `${operation.name}${postfix}.ts`); + const templateResult = templates.exports.sample({ + ...operation, + serviceName: service.name, + httpClient, + useUnionTypes, + useOptions, + postfix, + exportClient: isDefined(clientName), + }); + await writeFile(file, i(f(templateResult), indent)); + } + } +}; From 53a812d4f0c6914cf2784d34632fb5f7ba9d1798 Mon Sep 17 00:00:00 2001 From: Sachin Ranchod Date: Thu, 1 Dec 2022 15:00:17 -0800 Subject: [PATCH 3/4] fix arg defs in sample functions --- src/templates/exportSample.hbs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/templates/exportSample.hbs b/src/templates/exportSample.hbs index 11c6cb1e2..e10e5caed 100644 --- a/src/templates/exportSample.hbs +++ b/src/templates/exportSample.hbs @@ -1,8 +1,10 @@ -import client from 'github-connector'; - -export default async function main(args: { +export default async function main({ +{{#each parameters}} + {{{name}}}{{#if default}} = {{{default}}}{{/if}}, +{{/each}} +}: { {{#each parameters}} - {{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}}; + {{{name}}}{{>isRequired}}: {{>type}}, {{/each}} }) { const res = await client.{{{camelCase serviceName}}}.{{name}}(args); From e081468db18c53ad58b8baea9c76b14cce3378ca Mon Sep 17 00:00:00 2001 From: Sachin Ranchod Date: Tue, 13 Dec 2022 12:36:13 -0800 Subject: [PATCH 4/4] don't create sample code by default --- bin/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/index.js b/bin/index.js index 5e4b29a22..6a10dbc39 100755 --- a/bin/index.js +++ b/bin/index.js @@ -40,7 +40,7 @@ if (OpenAPI) { useOptions: params.useOptions, useUnionTypes: params.useUnionTypes, exportCore: JSON.parse(params.exportCore) === true, - exportSamples: JSON.parse(params.exportSamples) === true, + exportSamples: JSON.parse(params.exportSamples) === false, exportServices: JSON.parse(params.exportServices) === true, exportModels: JSON.parse(params.exportModels) === true, exportSchemas: JSON.parse(params.exportSchemas) === true,