diff --git a/docs/public/sitemap.xml b/docs/public/sitemap.xml index b36d4f0d7..e3d62144c 100644 --- a/docs/public/sitemap.xml +++ b/docs/public/sitemap.xml @@ -4,99 +4,134 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"> - https://orval.dev/guides/angular - - - - 2023-11-14 - https://orval.dev/guides/basics - - - - 2023-11-14 - https://orval.dev/guides/custom-axios - - - - 2023-11-14 - https://orval.dev/guides/custom-client - - - - 2023-11-14 - https://orval.dev/guides/react-query - - - - 2023-11-14 - https://orval.dev/guides/set-base-url - - - - 2023-11-14 - https://orval.dev/guides/svelte-query - - - - 2023-11-14 - https://orval.dev/guides/swr - - - - 2023-11-14 - https://orval.dev/guides/vue-query - - - - 2023-11-14 - https://orval.dev/installation - - - - 2023-11-14 - https://orval.dev/overview - - - - 2023-11-14 - https://orval.dev/quick-start - - - - 2023-11-14 - https://orval.dev/reference/cli - - - - 2023-11-14 - https://orval.dev/reference/configuration/full-example - - - - 2023-11-14 - https://orval.dev/reference/configuration/hooks - - - - 2023-11-14 - https://orval.dev/reference/configuration/input - - - - 2023-11-14 - https://orval.dev/reference/configuration/output - - - - 2023-11-14 - https://orval.dev/reference/configuration/overview - - - - 2023-11-14 - https://orval.dev/reference/integration - - - - 2023-11-14 - \ No newline at end of file + + + https://orval.dev/guides/angular + 2025-04-02 + + + + https://orval.dev/guides/basics + 2025-04-02 + + + + https://orval.dev/guides/client-with-zod + 2025-04-02 + + + + https://orval.dev/guides/custom-axios + 2025-04-02 + + + + https://orval.dev/guides/custom-client + 2025-04-02 + + + + https://orval.dev/guides/enums + 2025-04-02 + + + + https://orval.dev/guides/fetch-client + 2025-04-02 + + + + https://orval.dev/guides/fetch + 2025-04-02 + + + + https://orval.dev/guides/hono + 2025-04-02 + + + + https://orval.dev/guides/msw + 2025-04-02 + + + + https://orval.dev/guides/react-query + 2025-04-02 + + + + https://orval.dev/guides/set-base-url + 2025-04-02 + + + + https://orval.dev/guides/svelte-query + 2025-04-02 + + + + https://orval.dev/guides/swr + 2025-04-02 + + + + https://orval.dev/guides/vue-query + 2025-04-02 + + + + https://orval.dev/guides/zod + 2025-04-02 + + + + https://orval.dev/installation + 2025-04-02 + + + + https://orval.dev/overview + 2025-04-02 + + + + https://orval.dev/quick-start + 2025-04-02 + + + + https://orval.dev/reference/cli + 2025-04-02 + + + + https://orval.dev/reference/configuration/full-example + 2025-04-02 + + + + https://orval.dev/reference/configuration/hooks + 2025-04-02 + + + + https://orval.dev/reference/configuration/input + 2025-04-02 + + + + https://orval.dev/reference/configuration/output + 2025-04-02 + + + + https://orval.dev/reference/configuration/overview + 2025-04-02 + + + + https://orval.dev/reference/integration + 2025-04-02 + + \ No newline at end of file diff --git a/docs/src/manifests/manifest.json b/docs/src/manifests/manifest.json index 6fc531692..b190ab3a6 100644 --- a/docs/src/manifests/manifest.json +++ b/docs/src/manifests/manifest.json @@ -99,6 +99,11 @@ "title": "Hono", "path": "/guides/hono", "editUrl": "/guides/hono.md" + }, + { + "title": "Enum names", + "path": "/guides/enums", + "editUrl": "/guides/enums.md" } ] }, diff --git a/docs/src/pages/guides/enums.md b/docs/src/pages/guides/enums.md new file mode 100644 index 000000000..2e19b34f9 --- /dev/null +++ b/docs/src/pages/guides/enums.md @@ -0,0 +1,53 @@ +--- +id: enums +title: Enum Names +--- + +You can extend your OpenAPI schema to include enum names for your enum values. This will let Orval generate your enums with the correct names. + +#### Example of OpenAPI schema + +```yaml +openapi: '3.1.0' +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +components: + schemas: + MyObject: + type: object + properties: + myEnum: + type: number + enum: + - 1 + - 2 + - 3 + - 4 + x-enumNames: + - One + - Two + - Three + - Four +``` + +The enum generated by Orval will be + +```ts +export const MyEnum { + One: 1, + Two: 2, + Three: 3, + Four: 4 +} as const; +``` + +#### Valid enum name extensions + +Orval recognizes the following extensions: + +- x-enumNames +- x-enumnames +- x-enum-varnames diff --git a/packages/core/src/generators/schema-definition.ts b/packages/core/src/generators/schema-definition.ts index 5c3237fa1..1e101120c 100644 --- a/packages/core/src/generators/schema-definition.ts +++ b/packages/core/src/generators/schema-definition.ts @@ -1,6 +1,6 @@ import isEmpty from 'lodash.isempty'; import type { SchemaObject, SchemasObject } from 'openapi3-ts/oas30'; -import { getEnum, resolveDiscriminators } from '../getters'; +import { getEnum, getEnumNames, resolveDiscriminators } from '../getters'; import { resolveRef, resolveValue } from '../resolvers'; import type { ContextSpecs, @@ -84,7 +84,7 @@ export const generateSchemasDefinition = ( output += getEnum( resolvedValue.value, schemaName, - resolvedValue.originalSchema?.['x-enumNames'], + getEnumNames(resolvedValue.originalSchema), context.output.override.useNativeEnums, ); } else if (schemaName === resolvedValue.value && resolvedValue.isRef) { diff --git a/packages/core/src/getters/combine.ts b/packages/core/src/getters/combine.ts index 3b60f2cef..6907019de 100644 --- a/packages/core/src/getters/combine.ts +++ b/packages/core/src/getters/combine.ts @@ -8,7 +8,7 @@ import { SchemaType, } from '../types'; import { getNumberWord, pascal, isSchema } from '../utils'; -import { getEnumImplementation } from './enum'; +import { getEnumImplementation, getEnumNames } from './enum'; import { getScalar } from './scalar'; import uniq from 'lodash.uniq'; @@ -282,7 +282,7 @@ const getCombineEnumValue = ({ return `...${e},`; } - const names = originalSchema[i]?.['x-enumNames'] as string[]; + const names = getEnumNames(originalSchema[i]); return getEnumImplementation(e, names); }) diff --git a/packages/core/src/getters/enum.ts b/packages/core/src/getters/enum.ts index 01b06d0a8..7405cda58 100644 --- a/packages/core/src/getters/enum.ts +++ b/packages/core/src/getters/enum.ts @@ -1,6 +1,15 @@ import { keyword } from 'esutils'; +import { SchemaObject } from 'openapi3-ts/dist/model/openapi30'; import { isNumeric, sanitize } from '../utils'; +export const getEnumNames = (schemaObject: SchemaObject | undefined) => { + return ( + schemaObject?.['x-enumNames'] || + schemaObject?.['x-enumnames'] || + schemaObject?.['x-enum-varnames'] + ); +}; + export const getEnum = ( value: string, enumName: string, diff --git a/packages/core/src/getters/query-params.ts b/packages/core/src/getters/query-params.ts index 446a9f870..84c7d28ee 100644 --- a/packages/core/src/getters/query-params.ts +++ b/packages/core/src/getters/query-params.ts @@ -8,7 +8,7 @@ import { GetterQueryParam, } from '../types'; import { jsDoc, pascal, sanitize } from '../utils'; -import { getEnum } from './enum'; +import { getEnum, getEnumNames } from './enum'; import { getKey } from './keys'; type QueryParamsType = { @@ -71,7 +71,7 @@ const getQueryParamsTypes = ( const enumValue = getEnum( resolvedValue.value, enumName, - resolvedValue.originalSchema?.['x-enumNames'], + getEnumNames(resolvedValue.originalSchema), context.output.override.useNativeEnums, ); diff --git a/packages/core/src/resolvers/object.ts b/packages/core/src/resolvers/object.ts index 28cea3ac8..df5575700 100644 --- a/packages/core/src/resolvers/object.ts +++ b/packages/core/src/resolvers/object.ts @@ -1,5 +1,5 @@ import { ReferenceObject, SchemaObject } from 'openapi3-ts/oas30'; -import { getEnum } from '../getters/enum'; +import { getEnum, getEnumNames } from '../getters/enum'; import { ContextSpecs, ResolverValue } from '../types'; import { jsDoc } from '../utils'; import { resolveValue } from './value'; @@ -64,7 +64,7 @@ const resolveObjectOriginal = ({ const enumValue = getEnum( resolvedValue.value, propName, - resolvedValue.originalSchema?.['x-enumNames'], + getEnumNames(resolvedValue.originalSchema), context.output.override.useNativeEnums, );