Skip to content

Commit 7fa76bb

Browse files
authored
Merge pull request #32 from poviolabs/feature/request-params-parse
Add optional request params parsing
2 parents fd8ada7 + 5e8a156 commit 7fa76bb

File tree

13 files changed

+45
-28
lines changed

13 files changed

+45
-28
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ yarn openapi-codegen generate --input http://localhost:3001/docs-json --standalo
5050
--axiosRequestConfig Include Axios request config parameters in query hooks (default: false)
5151
--infiniteQueries Generate infinite queries for paginated API endpoints (default: false)
5252
--mutationEffects Add mutation effects options to mutation hooks (default: true)
53+
--parseRequestParams Add Zod parsing to API endpoints (default: false)
5354
5455
--standalone Generate any missing supporting classes/types, e.g., REST client class, React Query type extensions, etc. (default: false)
5556
--baseUrl (Requires `--standalone`) Base URL for the REST client; falls back to the OpenAPI spec if not provided

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@povio/openapi-codegen-cli",
3-
"version": "0.11.1",
3+
"version": "0.12.0",
44
"main": "./dist/index.js",
55
"bin": {
66
"openapi-codegen": "./dist/sh.js"

src/commands/generate.command.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ class GenerateOptions implements GenerateParams {
6969
})
7070
mutationEffects!: boolean;
7171

72+
@YargOption({
73+
envAlias: "parseRequestParams",
74+
default: DEFAULT_GENERATE_OPTIONS.parseRequestParams,
75+
type: "boolean",
76+
})
77+
parseRequestParams!: boolean;
78+
7279
@YargOption({ envAlias: "axiosRequestConfig", default: DEFAULT_GENERATE_OPTIONS.axiosRequestConfig, type: "boolean" })
7380
axiosRequestConfig!: boolean;
7481

src/commands/generate.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export type GenerateParams = {
2828
| "infiniteQueries"
2929
| "axiosRequestConfig"
3030
| "mutationEffects"
31+
| "parseRequestParams"
3132
>;
3233

3334
export async function generate({ input, excludeTags, monorepo, prettier, verbose, ...params }: GenerateParams) {

src/generators/const/options.const.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = {
4444
restClientImportPath: TEMPLATE_IMPORTS.appRestClient.template,
4545
errorHandlingImportPath: TEMPLATE_IMPORTS.errorHandling.template,
4646
removeOperationPrefixEndingWith: "Controller_",
47+
parseRequestParams: false,
4748
// Queries options
4849
queryTypesImportPath: TEMPLATE_IMPORTS.queryTypes.template,
4950
axiosRequestConfig: false,

src/generators/generate/generateEndpoints.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
getZodExtendedImportPath,
1212
} from "../utils/generate/generate.utils";
1313
import { getHbsTemplateDelegate } from "../utils/hbs/hbs-template.utils";
14-
import { isString } from "../utils/string.utils";
1514
import { isNamedZodSchema } from "../utils/zod-schema.utils";
1615

1716
export function generateEndpoints({ resolver, data, tag = "" }: GenerateTypeParams) {
@@ -25,32 +24,34 @@ export function generateEndpoints({ resolver, data, tag = "" }: GenerateTypePara
2524
from: getAppRestClientImportPath(resolver.options),
2625
};
2726

28-
const hasZodExtendedImport = endpoints.some((endpoint) =>
29-
endpoint.parameters.some((param) => param.parameterSortingEnumSchemaName),
30-
);
31-
const zodExtendedImport: Import = {
32-
bindings: [ZOD_EXTENDED.name],
33-
from: getZodExtendedImportPath(resolver.options),
34-
};
35-
3627
const hasAxiosRequestConfig = resolver.options.axiosRequestConfig;
3728
const hasAxiosImport = hasAxiosRequestConfig;
3829
const axiosImport: Import = {
3930
bindings: hasAxiosRequestConfig ? [AXIOS_REQUEST_CONFIG_TYPE] : [],
4031
from: AXIOS_IMPORT.from,
4132
};
4233

43-
const endpointResponseSchemas = endpoints.map((endpoint) => endpoint.response);
44-
const hasZodImport = endpointResponseSchemas.some((response) => !isNamedZodSchema(response));
34+
const generateParse = resolver.options.parseRequestParams;
4535

4636
const endpointParams = endpoints.reduce((prev, curr) => [...prev, ...curr.parameters], [] as EndpointParameter[]);
37+
const endpointParamsParseSchemas = endpointParams
38+
.filter((param) => !["Path", "Header"].includes(param.type))
39+
.map((param) => param.parameterSortingEnumSchemaName ?? param.zodSchema);
40+
const endpointResponseSchemas = endpoints.map((endpoint) => endpoint.response);
41+
const zodSchemas = getUniqueArray([...endpointResponseSchemas, ...(generateParse ? endpointParamsParseSchemas : [])]);
42+
43+
const hasZodImport = zodSchemas.some((schema) => !isNamedZodSchema(schema));
44+
45+
const hasZodExtendedImport = resolver.options.parseRequestParams && endpointParamsParseSchemas.length > 0;
46+
const zodExtendedImport: Import = {
47+
bindings: [ZOD_EXTENDED.name],
48+
from: getZodExtendedImportPath(resolver.options),
49+
};
50+
4751
const modelsImports = getModelsImports({
4852
resolver,
4953
tag,
50-
zodSchemas: getUniqueArray([
51-
...endpointResponseSchemas.filter(isNamedZodSchema),
52-
...endpointParams.map((param) => param.parameterSortingEnumSchemaName).filter(isString),
53-
]),
54+
zodSchemas: zodSchemas.filter(isNamedZodSchema),
5455
zodSchemasAsTypes: getUniqueArray(endpointParams.map((param) => param.zodSchema).filter(isNamedZodSchema)),
5556
});
5657

@@ -72,5 +73,6 @@ export function generateEndpoints({ resolver, data, tag = "" }: GenerateTypePara
7273
axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME,
7374
axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE,
7475
endpoints,
76+
generateParse,
7577
});
7678
}

src/generators/templates/endpoints.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const {{endpointName endpoint}} = ({{{genEndpointParams endpoint}}}{{#if
3030
`{{endpointPath endpoint}}`,
3131
{{! Body }}
3232
{{#with (endpointBody endpoint) as | endpointBody |}}
33-
{{#if endpointBody}}{{endpointBody.name}}, {{/if}}
33+
{{#if endpointBody}}{{#if ../../generateParse}}{{{genEndpointParamParse endpointBody endpointBody.name}}}{{else}}{{endpointBody.name}}{{/if}}, {{/if}}
3434
{{/with}}
3535
{{! Config }}
3636
{{{genEndpointConfig endpoint}}}

src/generators/templates/partials/endpoint-config.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
params: {
88
{{#each endpointConfig.params as | param |}}
99
{{#if (isEqual param.name param.value) }}
10-
{{{param.name}}}{{#if param.parameterSortingEnumSchemaName}}: {{{genEndpointParamSorting param.parameterSortingEnumSchemaName param.name}}}{{/if}},
10+
{{{param.name}}}{{#if ../generateParse}}: {{{genEndpointParamParse param param.name}}}{{/if}},
1111
{{else}}
12-
{{{param.name}}}: {{#if param.parameterSortingEnumSchemaName}}{{{genEndpointParamSorting param.parameterSortingEnumSchemaName param.value}}}{{else}}{{param.value}}{{/if}},
12+
{{{param.name}}}: {{#if ../generateParse}}{{{genEndpointParamParse param param.value}}}{{else}}{{param.value}}{{/if}},
1313
{{/if}}
1414
{{/each}}
1515
},
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{zodExtended}}.{{parse}}({{#if param.parameterSortingEnumSchemaName}}{{zodExtended}}.{{sortingString}}({{importedZodSchemaName param.parameterSortingEnumSchemaName}}){{#if addOptional}}.optional(){{/if}}{{else}}{{importedZodSchemaName param.zodSchema}}{{#if addOptional}}.optional(){{/if}}{{/if}}, {{paramName}})

src/generators/templates/partials/endpoint-param-sorting.hbs

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)