From 719a7def84a59533d5602d64f287b78d0d25fece Mon Sep 17 00:00:00 2001 From: zeriong Date: Wed, 20 May 2026 22:06:16 +0900 Subject: [PATCH 1/5] refactor(core,query): relocate makeRouteSafe to @orval/core Move makeRouteSafe and wrapRouteParameters from @orval/query/utils into @orval/core/getters/route so non-query packages can reuse them without introducing a reverse dependency on @orval/query. Update query/src/client.ts to import makeRouteSafe from @orval/core and move the related unit tests to core/getters/route.test.ts. Behavior is unchanged. This prepares for the follow-up fix that restores urlEncodeParameters support in @orval/fetch (#3343). Signed-off-by: zeriong --- packages/core/src/getters/route.test.ts | 56 +++++++++++++++++++++++++ packages/core/src/getters/route.ts | 12 ++++++ packages/query/src/client.ts | 8 +--- packages/query/src/utils.test.ts | 46 +------------------- packages/query/src/utils.ts | 10 ----- 5 files changed, 71 insertions(+), 61 deletions(-) diff --git a/packages/core/src/getters/route.test.ts b/packages/core/src/getters/route.test.ts index 0b90e2a517..b77054134c 100644 --- a/packages/core/src/getters/route.test.ts +++ b/packages/core/src/getters/route.test.ts @@ -11,6 +11,8 @@ import { getFullRoute, getRoute, getRouteAsArray, + makeRouteSafe, + wrapRouteParameters, } from './route'; describe('getRoute getter', () => { @@ -267,3 +269,57 @@ describe('getRouteAsArray getter', () => { expect(getRouteAsArray(input)).toEqual(output); }); }); + +describe('wrapRouteParameters', () => { + it('wraps parameters correctly', () => { + const result = wrapRouteParameters( + '/user/${id}/profile', + 'prefix-', + '-suffix', + ); + expect(result).toBe('/user/${prefix-id-suffix}/profile'); + }); + + it('handles no parameters gracefully', () => { + const result = wrapRouteParameters('/user/profile', 'prefix-', '-suffix'); + expect(result).toBe('/user/profile'); + }); + + it('handles empty route', () => { + const result = wrapRouteParameters('', 'prefix-', '-suffix'); + expect(result).toBe(''); + }); +}); + +describe('makeRouteSafe', () => { + it('encodes URI components in parameters', () => { + const result = makeRouteSafe('/search/${query}/bla/${something}'); + expect(result).toBe( + '/search/${encodeURIComponent(String(query))}/bla/${encodeURIComponent(String(something))}', + ); + }); + + it('encodes adjacent parameters separately', () => { + const result = makeRouteSafe('/x/${a}${b}'); + expect(result).toBe( + '/x/${encodeURIComponent(String(a))}${encodeURIComponent(String(b))}', + ); + }); + + it('encodes parameters mixed with literal separators', () => { + const result = makeRouteSafe('/files/${name}.${ext}'); + expect(result).toBe( + '/files/${encodeURIComponent(String(name))}.${encodeURIComponent(String(ext))}', + ); + }); + + it('handles no special characters gracefully', () => { + const result = makeRouteSafe('/search/query'); + expect(result).toBe('/search/query'); + }); + + it('handles empty route', () => { + const result = makeRouteSafe(''); + expect(result).toBe(''); + }); +}); diff --git a/packages/core/src/getters/route.ts b/packages/core/src/getters/route.ts index aefa61ac7d..3652039d2e 100644 --- a/packages/core/src/getters/route.ts +++ b/packages/core/src/getters/route.ts @@ -1,3 +1,4 @@ +import { TEMPLATE_TAG_REGEX } from '../constants'; import type { BaseUrlFromConstant, BaseUrlFromSpec, @@ -145,6 +146,17 @@ export function getBaseUrlRuntimeImports( })); } +// Emits a codegen string: wraps each `${param}` segment of a template-literal +// route so the generated client encodes path parameters at request time. +export const wrapRouteParameters = ( + route: string, + prepend: string, + append: string, +): string => route.replaceAll(TEMPLATE_TAG_REGEX, `\${${prepend}$1${append}}`); + +export const makeRouteSafe = (route: string): string => + wrapRouteParameters(route, 'encodeURIComponent(String(', '))'); + // Creates a mixed use array with path variables and string from template string route export function getRouteAsArray(route: string): string { return route diff --git a/packages/query/src/client.ts b/packages/query/src/client.ts index a418da50fd..ebcb5f3956 100644 --- a/packages/query/src/client.ts +++ b/packages/query/src/client.ts @@ -15,6 +15,7 @@ import { isObject, isSyntheticDefaultImportsAllow, kebab, + makeRouteSafe, OutputHttpClient, pascal, toObjectString, @@ -24,12 +25,7 @@ import { generateRequestFunction as generateFetchRequestFunction, } from '@orval/fetch'; -import { - getHasSignal, - makeRouteSafe, - vueUnRefParams, - vueWrapTypeWithMaybeRef, -} from './utils'; +import { getHasSignal, vueUnRefParams, vueWrapTypeWithMaybeRef } from './utils'; export const AXIOS_DEPENDENCIES = [ { diff --git a/packages/query/src/utils.test.ts b/packages/query/src/utils.test.ts index 082ea7784d..3f62942f48 100644 --- a/packages/query/src/utils.test.ts +++ b/packages/query/src/utils.test.ts @@ -1,50 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { - makeRouteSafe, - normalizeQueryOptions, - wrapRouteParameters, -} from './utils'; - -describe('wrapRouteParameters', () => { - it('wraps parameters correctly', () => { - const result = wrapRouteParameters( - '/user/${id}/profile', - 'prefix-', - '-suffix', - ); - expect(result).toBe('/user/${prefix-id-suffix}/profile'); - }); - - it('handles no parameters gracefully', () => { - const result = wrapRouteParameters('/user/profile', 'prefix-', '-suffix'); - expect(result).toBe('/user/profile'); - }); - - it('handles empty route', () => { - const result = wrapRouteParameters('', 'prefix-', '-suffix'); - expect(result).toBe(''); - }); -}); - -describe('makeRouteSafe', () => { - it('encodes URI components in parameters', () => { - const result = makeRouteSafe('/search/${query}/bla/${something}'); - expect(result).toBe( - '/search/${encodeURIComponent(String(query))}/bla/${encodeURIComponent(String(something))}', - ); - }); - - it('handles no special characters gracefully', () => { - const result = makeRouteSafe('/search/query'); - expect(result).toBe('/search/query'); - }); - - it('handles empty route', () => { - const result = makeRouteSafe(''); - expect(result).toBe(''); - }); -}); +import { normalizeQueryOptions } from './utils'; describe('normalizeQueryOptions', () => { it('should include useOperationIdAsQueryKey when provided', () => { diff --git a/packages/query/src/utils.ts b/packages/query/src/utils.ts index 31efee65ad..e1cb1a27d6 100644 --- a/packages/query/src/utils.ts +++ b/packages/query/src/utils.ts @@ -12,7 +12,6 @@ import { OutputClient, type OutputClientFunc, type QueryOptions, - TEMPLATE_TAG_REGEX, } from '@orval/core'; export const normalizeQueryOptions = ( @@ -137,15 +136,6 @@ export const vueUnRefParams = (props: GetterProps): string => { .join('\n'); }; -export const wrapRouteParameters = ( - route: string, - prepend: string, - append: string, -): string => route.replaceAll(TEMPLATE_TAG_REGEX, `\${${prepend}$1${append}}`); - -export const makeRouteSafe = (route: string): string => - wrapRouteParameters(route, 'encodeURIComponent(String(', '))'); - export const isVue = (client: OutputClient | OutputClientFunc) => OutputClient.VUE_QUERY === client; From 972bd15dd2ed0cec4c12d176c5ff8daa2242326a Mon Sep 17 00:00:00 2001 From: zeriong Date: Wed, 20 May 2026 22:07:50 +0900 Subject: [PATCH 2/5] fix(fetch): restore urlEncodeParameters support (#3343) The fetch client generator stopped honoring the `urlEncodeParameters` output option after commit cb0613961 (#2168) accidentally dropped the guard introduced by #2292. Generated URL helpers interpolated path parameters as-is, so values containing reserved characters (`/`, `#`, `?`, ...) leaked into the request URL. Re-apply `makeRouteSafe(route)` at the top of `generateRequestFunction` in `@orval/fetch`, mirroring the axios path in `@orval/query`. This wraps each `\${param}` segment with `encodeURIComponent(String(...))`. Query parameters remain handled by `URLSearchParams` as before; this option only affects path parameters. Add a dedicated fetch + `urlEncodeParameters` snapshot fixture so a future regression in the fetch path won't be silently absorbed by the `dateParams` fixture. --- packages/fetch/src/index.ts | 9 +- .../fetch/dateParams/pets/pets.ts | 8 +- .../fetch/url-encode-parameters/endpoints.ts | 825 ++++++++++++++++++ .../fetch/url-encode-parameters/model/cat.ts | 12 + .../url-encode-parameters/model/catType.ts | 12 + .../model/createPetsBody.ts | 11 + .../model/createPetsParams.ts | 20 + .../model/createPetsSort.ts | 16 + .../url-encode-parameters/model/dachshund.ts | 12 + .../model/dachshundBreed.ts | 13 + .../fetch/url-encode-parameters/model/dog.ts | 19 + .../url-encode-parameters/model/dogType.ts | 12 + .../url-encode-parameters/model/error.ts | 11 + .../url-encode-parameters/model/index.ts | 26 + .../model/labradoodle.ts | 12 + .../model/labradoodleBreed.ts | 13 + .../model/listPetsParams.ts | 20 + .../model/listPetsSort.ts | 15 + .../fetch/url-encode-parameters/model/pet.ts | 30 + .../model/petCallingCode.ts | 14 + .../url-encode-parameters/model/petCountry.ts | 13 + .../url-encode-parameters/model/petWithTag.ts | 12 + .../fetch/url-encode-parameters/model/pets.ts | 9 + .../endpoints.ts | 6 +- .../url-encode-parameters/endpoints.ts | 6 +- tests/configs/fetch.config.ts | 14 + 26 files changed, 1159 insertions(+), 11 deletions(-) create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/error.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/index.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts create mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts diff --git a/packages/fetch/src/index.ts b/packages/fetch/src/index.ts index c1d637b10a..2bcfb08209 100644 --- a/packages/fetch/src/index.ts +++ b/packages/fetch/src/index.ts @@ -11,6 +11,7 @@ import { type GeneratorVerbOptions, GetterPropType, isObject, + makeRouteSafe, type OpenApiParameterObject, type OpenApiReferenceObject, type OpenApiSchemaObject, @@ -68,8 +69,14 @@ export const generateRequestFunction = ( override, doc, }: GeneratorVerbOptions, - { route, context, pathRoute }: GeneratorOptions, + { route: _route, context, pathRoute }: GeneratorOptions, ) => { + let route = _route; + + if (context.output.urlEncodeParameters) { + route = makeRouteSafe(route); + } + const isRequestOptions = override.requestOptions !== false; const isFormData = !override.formData.disabled; const isFormUrlEncoded = override.formUrlEncoded !== false; diff --git a/tests/__snapshots__/fetch/dateParams/pets/pets.ts b/tests/__snapshots__/fetch/dateParams/pets/pets.ts index 36f61329ed..f6223893d0 100644 --- a/tests/__snapshots__/fetch/dateParams/pets/pets.ts +++ b/tests/__snapshots__/fetch/dateParams/pets/pets.ts @@ -100,8 +100,8 @@ export const getListPetsByCountryUrl = ( const stringifiedParams = normalizedParams.toString(); return stringifiedParams.length > 0 - ? `/pets-by-country/${country}?${stringifiedParams}` - : `/pets-by-country/${country}`; + ? `/pets-by-country/${encodeURIComponent(String(country))}?${stringifiedParams}` + : `/pets-by-country/${encodeURIComponent(String(country))}`; }; /** @@ -170,8 +170,8 @@ export const getListPetsByAgeUrl = ( const stringifiedParams = normalizedParams.toString(); return stringifiedParams.length > 0 - ? `/pets-by-age/${age}?${stringifiedParams}` - : `/pets-by-age/${age}`; + ? `/pets-by-age/${encodeURIComponent(String(age))}?${stringifiedParams}` + : `/pets-by-age/${encodeURIComponent(String(age))}`; }; /** diff --git a/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts new file mode 100644 index 0000000000..d2835298f6 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts @@ -0,0 +1,825 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { + CreatePetsBody, + CreatePetsParams, + Error, + ListPetsParams, + Pet, + PetWithTag, + Pets, +} from './model'; + +import { faker } from '@faker-js/faker'; + +import { HttpResponse, http } from 'msw'; +import type { RequestHandlerOptions } from 'msw'; + +import type { Cat, Dachshund, Dog, Labradoodle } from './model'; + +export type HTTPStatusCode1xx = 100 | 101 | 102 | 103; +export type HTTPStatusCode2xx = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207; +export type HTTPStatusCode3xx = 300 | 301 | 302 | 303 | 304 | 305 | 307 | 308; +export type HTTPStatusCode4xx = + | 400 + | 401 + | 402 + | 403 + | 404 + | 405 + | 406 + | 407 + | 408 + | 409 + | 410 + | 411 + | 412 + | 413 + | 414 + | 415 + | 416 + | 417 + | 418 + | 419 + | 420 + | 421 + | 422 + | 423 + | 424 + | 426 + | 428 + | 429 + | 431 + | 451; +export type HTTPStatusCode5xx = 500 | 501 | 502 | 503 | 504 | 505 | 507 | 511; +export type HTTPStatusCodes = + | HTTPStatusCode1xx + | HTTPStatusCode2xx + | HTTPStatusCode3xx + | HTTPStatusCode4xx + | HTTPStatusCode5xx; + +export type listPetsResponse200 = { + data: Pets; + status: 200; +}; + +export type listPetsResponseDefault = { + data: Error; + status: Exclude; +}; + +export type listPetsResponseSuccess = listPetsResponse200 & { + headers: Headers; +}; +export type listPetsResponseError = listPetsResponseDefault & { + headers: Headers; +}; + +export type listPetsResponse = listPetsResponseSuccess | listPetsResponseError; + +export const getListPetsUrl = (params: ListPetsParams) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 ? `/pets?${stringifiedParams}` : `/pets`; +}; + +/** + * @summary List all pets + */ +export const listPets = async ( + params: ListPetsParams, + options?: RequestInit, +): Promise => { + const res = await fetch(getListPetsUrl(params), { + ...options, + method: 'GET', + }); + + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: listPetsResponse['data'] = body ? JSON.parse(body) : {}; + return { data, status: res.status, headers: res.headers } as listPetsResponse; +}; + +export type createPetsResponse200 = { + data: Pet; + status: 200; +}; + +export type createPetsResponseDefault = { + data: Error; + status: Exclude; +}; + +export type createPetsResponseSuccess = createPetsResponse200 & { + headers: Headers; +}; +export type createPetsResponseError = createPetsResponseDefault & { + headers: Headers; +}; + +export type createPetsResponse = + | createPetsResponseSuccess + | createPetsResponseError; + +export const getCreatePetsUrl = (params: CreatePetsParams) => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)); + } + }); + + const stringifiedParams = normalizedParams.toString(); + + return stringifiedParams.length > 0 ? `/pets?${stringifiedParams}` : `/pets`; +}; + +/** + * @summary Create a pet + */ +export const createPets = async ( + createPetsBody: CreatePetsBody, + params: CreatePetsParams, + options?: RequestInit, +): Promise => { + const res = await fetch(getCreatePetsUrl(params), { + ...options, + method: 'POST', + headers: { 'Content-Type': 'application/json', ...options?.headers }, + body: JSON.stringify(createPetsBody), + }); + + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: createPetsResponse['data'] = body ? JSON.parse(body) : {}; + return { + data, + status: res.status, + headers: res.headers, + } as createPetsResponse; +}; + +export type showPetByIdResponse200 = { + data: Pet; + status: 200; +}; + +export type showPetByIdResponseDefault = { + data: Error; + status: Exclude; +}; + +export type showPetByIdResponseSuccess = showPetByIdResponse200 & { + headers: Headers; +}; +export type showPetByIdResponseError = showPetByIdResponseDefault & { + headers: Headers; +}; + +export type showPetByIdResponse = + | showPetByIdResponseSuccess + | showPetByIdResponseError; + +export const getShowPetByIdUrl = (petId: string) => { + return `/pets/${encodeURIComponent(String(petId))}`; +}; + +/** + * @summary Info for a specific pet + */ +export const showPetById = async ( + petId: string, + options?: RequestInit, +): Promise => { + const res = await fetch(getShowPetByIdUrl(petId), { + ...options, + method: 'GET', + }); + + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: showPetByIdResponse['data'] = body ? JSON.parse(body) : {}; + return { + data, + status: res.status, + headers: res.headers, + } as showPetByIdResponse; +}; + +export type deletePetByIdResponse204 = { + data: void; + status: 204; +}; + +export type deletePetByIdResponseDefault = { + data: Error; + status: Exclude; +}; + +export type deletePetByIdResponseSuccess = deletePetByIdResponse204 & { + headers: Headers; +}; +export type deletePetByIdResponseError = deletePetByIdResponseDefault & { + headers: Headers; +}; + +export type deletePetByIdResponse = + | deletePetByIdResponseSuccess + | deletePetByIdResponseError; + +export const getDeletePetByIdUrl = (petId: string) => { + return `/pets/${encodeURIComponent(String(petId))}`; +}; + +/** + * @summary Deletes a specific pet + */ +export const deletePetById = async ( + petId: string, + options?: RequestInit, +): Promise => { + const res = await fetch(getDeletePetByIdUrl(petId), { + ...options, + method: 'DELETE', + }); + + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: deletePetByIdResponse['data'] = body + ? JSON.parse(body) + : undefined; + return { + data, + status: res.status, + headers: res.headers, + } as deletePetByIdResponse; +}; + +export type healthCheckResponse200 = { + data: string; + status: 200; +}; + +export type healthCheckResponseDefault = { + data: Error; + status: Exclude; +}; + +export type healthCheckResponseSuccess = healthCheckResponse200 & { + headers: Headers; +}; +export type healthCheckResponseError = healthCheckResponseDefault & { + headers: Headers; +}; + +export type healthCheckResponse = + | healthCheckResponseSuccess + | healthCheckResponseError; + +export const getHealthCheckUrl = () => { + return `/health`; +}; + +/** + * @summary health check + */ +export const healthCheck = async ( + options?: RequestInit, +): Promise => { + const res = await fetch(getHealthCheckUrl(), { + ...options, + method: 'GET', + }); + + const contentType = (res.headers.get('content-type') ?? '').toLowerCase(); + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: healthCheckResponse['data'] = body + ? contentType.includes('json') + ? JSON.parse(body) + : body + : {}; + return { + data, + status: res.status, + headers: res.headers, + } as healthCheckResponse; +}; + +export type showPetWithOwnerResponse200 = { + data: PetWithTag; + status: 200; +}; + +export type showPetWithOwnerResponseDefault = { + data: Error; + status: Exclude; +}; + +export type showPetWithOwnerResponseSuccess = showPetWithOwnerResponse200 & { + headers: Headers; +}; +export type showPetWithOwnerResponseError = showPetWithOwnerResponseDefault & { + headers: Headers; +}; + +export type showPetWithOwnerResponse = + | showPetWithOwnerResponseSuccess + | showPetWithOwnerResponseError; + +export const getShowPetWithOwnerUrl = (petId: string) => { + return `/pets/${encodeURIComponent(String(petId))}/owner`; +}; + +/** + * @summary combinate nullable and $ref + */ +export const showPetWithOwner = async ( + petId: string, + options?: RequestInit, +): Promise => { + const res = await fetch(getShowPetWithOwnerUrl(petId), { + ...options, + method: 'GET', + }); + + const body = [204, 205, 304].includes(res.status) ? null : await res.text(); + + const data: showPetWithOwnerResponse['data'] = body ? JSON.parse(body) : {}; + return { + data, + status: res.status, + headers: res.headers, + } as showPetWithOwnerResponse; +}; + +export const getListPetsResponseLabradoodleMock = ( + overrideResponse: Partial = {}, +): Labradoodle => ({ + ...{ + cuteness: faker.number.int(), + breed: faker.helpers.arrayElement(['Labradoodle'] as const), + }, + ...overrideResponse, +}); + +export const getListPetsResponseDachshundMock = ( + overrideResponse: Partial = {}, +): Dachshund => ({ + ...{ + length: faker.number.int(), + breed: faker.helpers.arrayElement(['Dachshund'] as const), + }, + ...overrideResponse, +}); + +export const getListPetsResponseDogMock = ( + overrideResponse: Omit, 'breed'> = {}, +): Dog => ({ + ...{ + ...faker.helpers.arrayElement([ + { ...getListPetsResponseLabradoodleMock() }, + { ...getListPetsResponseDachshundMock() }, + ]), + barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['dog'] as const), + }, + ...overrideResponse, +}); + +export const getListPetsResponseCatMock = ( + overrideResponse: Partial = {}, +): Cat => ({ + ...{ + petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['cat'] as const), + }, + ...overrideResponse, +}); + +export const getListPetsResponseMock = (): Pets => + Array.from( + { length: faker.number.int({ min: 1, max: 10 }) }, + (_, i) => i + 1, + ).map(() => ({ + ...faker.helpers.arrayElement([ + { ...getListPetsResponseDogMock() }, + { ...getListPetsResponseCatMock() }, + ]), + '@id': faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + id: faker.number.int(), + name: faker.string.alpha({ length: { min: 10, max: 20 } }), + tag: faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + email: faker.helpers.arrayElement([faker.internet.email(), undefined]), + callingCode: faker.helpers.arrayElement([ + faker.helpers.arrayElement(['+33', '+420', '+33'] as const), + undefined, + ]), + country: faker.helpers.arrayElement([ + faker.helpers.arrayElement([ + "People's Republic of China", + 'Uruguay', + ] as const), + undefined, + ]), + })); + +export const getCreatePetsResponseLabradoodleMock = ( + overrideResponse: Partial = {}, +): Labradoodle => ({ + ...{ + cuteness: faker.number.int(), + breed: faker.helpers.arrayElement(['Labradoodle'] as const), + }, + ...overrideResponse, +}); + +export const getCreatePetsResponseDachshundMock = ( + overrideResponse: Partial = {}, +): Dachshund => ({ + ...{ + length: faker.number.int(), + breed: faker.helpers.arrayElement(['Dachshund'] as const), + }, + ...overrideResponse, +}); + +export const getCreatePetsResponseDogMock = ( + overrideResponse: Omit, 'breed'> = {}, +): Dog => ({ + ...{ + ...faker.helpers.arrayElement([ + { ...getCreatePetsResponseLabradoodleMock() }, + { ...getCreatePetsResponseDachshundMock() }, + ]), + barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['dog'] as const), + }, + ...overrideResponse, +}); + +export const getCreatePetsResponseCatMock = ( + overrideResponse: Partial = {}, +): Cat => ({ + ...{ + petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['cat'] as const), + }, + ...overrideResponse, +}); + +export const getCreatePetsResponseMock = (): Pet => ({ + ...faker.helpers.arrayElement([ + { ...getCreatePetsResponseDogMock() }, + { ...getCreatePetsResponseCatMock() }, + ]), + '@id': faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + id: faker.number.int(), + name: faker.string.alpha({ length: { min: 10, max: 20 } }), + tag: faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + email: faker.helpers.arrayElement([faker.internet.email(), undefined]), + callingCode: faker.helpers.arrayElement([ + faker.helpers.arrayElement(['+33', '+420', '+33'] as const), + undefined, + ]), + country: faker.helpers.arrayElement([ + faker.helpers.arrayElement([ + "People's Republic of China", + 'Uruguay', + ] as const), + undefined, + ]), +}); + +export const getShowPetByIdResponseLabradoodleMock = ( + overrideResponse: Partial = {}, +): Labradoodle => ({ + ...{ + cuteness: faker.number.int(), + breed: faker.helpers.arrayElement(['Labradoodle'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetByIdResponseDachshundMock = ( + overrideResponse: Partial = {}, +): Dachshund => ({ + ...{ + length: faker.number.int(), + breed: faker.helpers.arrayElement(['Dachshund'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetByIdResponseDogMock = ( + overrideResponse: Omit, 'breed'> = {}, +): Dog => ({ + ...{ + ...faker.helpers.arrayElement([ + { ...getShowPetByIdResponseLabradoodleMock() }, + { ...getShowPetByIdResponseDachshundMock() }, + ]), + barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['dog'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetByIdResponseCatMock = ( + overrideResponse: Partial = {}, +): Cat => ({ + ...{ + petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['cat'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetByIdResponseMock = (): Pet => ({ + ...faker.helpers.arrayElement([ + { ...getShowPetByIdResponseDogMock() }, + { ...getShowPetByIdResponseCatMock() }, + ]), + '@id': faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + id: faker.number.int(), + name: faker.string.alpha({ length: { min: 10, max: 20 } }), + tag: faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + email: faker.helpers.arrayElement([faker.internet.email(), undefined]), + callingCode: faker.helpers.arrayElement([ + faker.helpers.arrayElement(['+33', '+420', '+33'] as const), + undefined, + ]), + country: faker.helpers.arrayElement([ + faker.helpers.arrayElement([ + "People's Republic of China", + 'Uruguay', + ] as const), + undefined, + ]), +}); + +export const getHealthCheckResponseMock = (): string => faker.word.sample(); + +export const getShowPetWithOwnerResponseLabradoodleMock = ( + overrideResponse: Partial = {}, +): Labradoodle => ({ + ...{ + cuteness: faker.number.int(), + breed: faker.helpers.arrayElement(['Labradoodle'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetWithOwnerResponseDachshundMock = ( + overrideResponse: Partial = {}, +): Dachshund => ({ + ...{ + length: faker.number.int(), + breed: faker.helpers.arrayElement(['Dachshund'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetWithOwnerResponseDogMock = ( + overrideResponse: Omit, 'breed'> = {}, +): Dog => ({ + ...{ + ...faker.helpers.arrayElement([ + { ...getShowPetWithOwnerResponseLabradoodleMock() }, + { ...getShowPetWithOwnerResponseDachshundMock() }, + ]), + barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['dog'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetWithOwnerResponseCatMock = ( + overrideResponse: Partial = {}, +): Cat => ({ + ...{ + petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), + type: faker.helpers.arrayElement(['cat'] as const), + }, + ...overrideResponse, +}); + +export const getShowPetWithOwnerResponseMock = ( + overrideResponse: Partial> = {}, +): PetWithTag => ({ + tag: faker.string.alpha({ length: { min: 10, max: 20 } }), + pet: { + ...faker.helpers.arrayElement([ + { ...getShowPetWithOwnerResponseDogMock() }, + { ...getShowPetWithOwnerResponseCatMock() }, + ]), + '@id': faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + id: faker.number.int(), + name: faker.string.alpha({ length: { min: 10, max: 20 } }), + tag: faker.helpers.arrayElement([ + faker.string.alpha({ length: { min: 10, max: 20 } }), + undefined, + ]), + email: faker.helpers.arrayElement([faker.internet.email(), undefined]), + callingCode: faker.helpers.arrayElement([ + faker.helpers.arrayElement(['+33', '+420', '+33'] as const), + undefined, + ]), + country: faker.helpers.arrayElement([ + faker.helpers.arrayElement([ + "People's Republic of China", + 'Uruguay', + ] as const), + undefined, + ]), + }, + ...overrideResponse, +}); + +export const getListPetsMockHandler = ( + overrideResponse?: + | Pets + | (( + info: Parameters[1]>[0], + ) => Promise | Pets), + options?: RequestHandlerOptions, +) => { + return http.get( + '*/pets', + async (info: Parameters[1]>[0]) => { + return HttpResponse.json( + overrideResponse !== undefined + ? typeof overrideResponse === 'function' + ? await overrideResponse(info) + : overrideResponse + : getListPetsResponseMock(), + { status: 200 }, + ); + }, + options, + ); +}; + +export const getCreatePetsMockHandler = ( + overrideResponse?: + | Pet + | (( + info: Parameters[1]>[0], + ) => Promise | Pet), + options?: RequestHandlerOptions, +) => { + return http.post( + '*/pets', + async (info: Parameters[1]>[0]) => { + return HttpResponse.json( + overrideResponse !== undefined + ? typeof overrideResponse === 'function' + ? await overrideResponse(info) + : overrideResponse + : getCreatePetsResponseMock(), + { status: 200 }, + ); + }, + options, + ); +}; + +export const getShowPetByIdMockHandler = ( + overrideResponse?: + | Pet + | (( + info: Parameters[1]>[0], + ) => Promise | Pet), + options?: RequestHandlerOptions, +) => { + return http.get( + '*/pets/:petId', + async (info: Parameters[1]>[0]) => { + return HttpResponse.json( + overrideResponse !== undefined + ? typeof overrideResponse === 'function' + ? await overrideResponse(info) + : overrideResponse + : getShowPetByIdResponseMock(), + { status: 200 }, + ); + }, + options, + ); +}; + +export const getDeletePetByIdMockHandler = ( + overrideResponse?: + | void + | (( + info: Parameters[1]>[0], + ) => Promise | void), + options?: RequestHandlerOptions, +) => { + return http.delete( + '*/pets/:petId', + async (info: Parameters[1]>[0]) => { + if (typeof overrideResponse === 'function') { + await overrideResponse(info); + } + + return new HttpResponse(null, { status: 204 }); + }, + options, + ); +}; + +export const getHealthCheckMockHandler = ( + overrideResponse?: + | string + | (( + info: Parameters[1]>[0], + ) => Promise | string), + options?: RequestHandlerOptions, +) => { + return http.get( + '*/health', + async (info: Parameters[1]>[0]) => { + const resolvedBody = + overrideResponse !== undefined + ? typeof overrideResponse === 'function' + ? await overrideResponse(info) + : overrideResponse + : getHealthCheckResponseMock(); + const textBody = + typeof resolvedBody === 'string' + ? resolvedBody + : JSON.stringify(resolvedBody ?? null); + return HttpResponse.text(textBody, { status: 200 }); + }, + options, + ); +}; + +export const getShowPetWithOwnerMockHandler = ( + overrideResponse?: + | PetWithTag + | (( + info: Parameters[1]>[0], + ) => Promise | PetWithTag), + options?: RequestHandlerOptions, +) => { + return http.get( + '*/pets/:petId/owner', + async (info: Parameters[1]>[0]) => { + return HttpResponse.json( + overrideResponse !== undefined + ? typeof overrideResponse === 'function' + ? await overrideResponse(info) + : overrideResponse + : getShowPetWithOwnerResponseMock(), + { status: 200 }, + ); + }, + options, + ); +}; +export const getSwaggerPetstoreMock = () => [ + getListPetsMockHandler(), + getCreatePetsMockHandler(), + getShowPetByIdMockHandler(), + getDeletePetByIdMockHandler(), + getHealthCheckMockHandler(), + getShowPetWithOwnerMockHandler(), +]; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts new file mode 100644 index 0000000000..15f6290f8c --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { CatType } from './catType'; + +export interface Cat { + petsRequested?: number; + type: CatType; +} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts new file mode 100644 index 0000000000..44e478aabf --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type CatType = (typeof CatType)[keyof typeof CatType]; + +export const CatType = { + cat: 'cat', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts new file mode 100644 index 0000000000..13a59e2eb2 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type CreatePetsBody = { + name: string; + tag: string; +}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts new file mode 100644 index 0000000000..d0d0431a0c --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts @@ -0,0 +1,20 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { CreatePetsSort } from './createPetsSort'; + +export type CreatePetsParams = { + /** + * How many items to return at one time (max 100) + */ + limit?: string; + /** + * Which property to sort by? +Example: name sorts ASC while -name sorts DESC. + + */ + sort: CreatePetsSort; +}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts new file mode 100644 index 0000000000..a03f424b2e --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts @@ -0,0 +1,16 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type CreatePetsSort = + (typeof CreatePetsSort)[keyof typeof CreatePetsSort]; + +export const CreatePetsSort = { + name: 'name', + '-name': '-name', + email: 'email', + '-email': '-email', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts new file mode 100644 index 0000000000..bc42f0c75d --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { DachshundBreed } from './dachshundBreed'; + +export interface Dachshund { + length: number; + breed: DachshundBreed; +} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts new file mode 100644 index 0000000000..db2de3a460 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type DachshundBreed = + (typeof DachshundBreed)[keyof typeof DachshundBreed]; + +export const DachshundBreed = { + Dachshund: 'Dachshund', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts new file mode 100644 index 0000000000..a1fcf8c8af --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts @@ -0,0 +1,19 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { Dachshund } from './dachshund'; +import type { DogType } from './dogType'; +import type { Labradoodle } from './labradoodle'; + +export type Dog = + | (Labradoodle & { + barksPerMinute?: number; + type: DogType; + }) + | (Dachshund & { + barksPerMinute?: number; + type: DogType; + }); diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts new file mode 100644 index 0000000000..f10e924f2d --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type DogType = (typeof DogType)[keyof typeof DogType]; + +export const DogType = { + dog: 'dog', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts new file mode 100644 index 0000000000..dfef282f93 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export interface Error { + code: number; + message: string; +} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts new file mode 100644 index 0000000000..3a779d3ad8 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts @@ -0,0 +1,26 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export * from './cat'; +export * from './catType'; +export * from './createPetsBody'; +export * from './createPetsParams'; +export * from './createPetsSort'; +export * from './dachshund'; +export * from './dachshundBreed'; +export * from './dog'; +export * from './dogType'; +export * from './error'; +export * from './labradoodle'; +export * from './labradoodleBreed'; +export * from './listPetsParams'; +export * from './listPetsSort'; +export * from './pet'; +export * from './petCallingCode'; +export * from './petCountry'; +export * from './pets'; +export * from './petWithTag'; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts new file mode 100644 index 0000000000..fc59343a94 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { LabradoodleBreed } from './labradoodleBreed'; + +export interface Labradoodle { + cuteness: number; + breed: LabradoodleBreed; +} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts new file mode 100644 index 0000000000..4bc1bd43e3 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type LabradoodleBreed = + (typeof LabradoodleBreed)[keyof typeof LabradoodleBreed]; + +export const LabradoodleBreed = { + Labradoodle: 'Labradoodle', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts new file mode 100644 index 0000000000..f03f7e5753 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts @@ -0,0 +1,20 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { ListPetsSort } from './listPetsSort'; + +export type ListPetsParams = { + /** + * How many items to return at one time (max 100) + */ + limit?: string; + /** + * Which property to sort by? +Example: name sorts ASC while -name sorts DESC. + + */ + sort: ListPetsSort; +}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts new file mode 100644 index 0000000000..2ba7a791c5 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type ListPetsSort = (typeof ListPetsSort)[keyof typeof ListPetsSort]; + +export const ListPetsSort = { + name: 'name', + '-name': '-name', + email: 'email', + '-email': '-email', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts new file mode 100644 index 0000000000..4ebb45c01f --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts @@ -0,0 +1,30 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { Cat } from './cat'; +import type { Dog } from './dog'; +import type { PetCallingCode } from './petCallingCode'; +import type { PetCountry } from './petCountry'; + +export type Pet = + | (Dog & { + '@id'?: string; + id: number; + name: string; + tag?: string; + email?: string; + callingCode?: PetCallingCode; + country?: PetCountry; + }) + | (Cat & { + '@id'?: string; + id: number; + name: string; + tag?: string; + email?: string; + callingCode?: PetCallingCode; + country?: PetCountry; + }); diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts new file mode 100644 index 0000000000..531bb18dcc --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type PetCallingCode = + (typeof PetCallingCode)[keyof typeof PetCallingCode]; + +export const PetCallingCode = { + '+33': '+33', + '+420': '+420', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts new file mode 100644 index 0000000000..bf0fd6b5e0 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ + +export type PetCountry = (typeof PetCountry)[keyof typeof PetCountry]; + +export const PetCountry = { + "People's_Republic_of_China": "People's Republic of China", + Uruguay: 'Uruguay', +} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts new file mode 100644 index 0000000000..b7c93d0ba3 --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { Pet } from './pet'; + +export interface PetWithTag { + tag: string; + pet: Pet | null; +} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts new file mode 100644 index 0000000000..25ee7a25eb --- /dev/null +++ b/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts @@ -0,0 +1,9 @@ +/** + * Generated by orval v8.11.0 🍺 + * Do not edit manually. + * Swagger Petstore + * OpenAPI spec version: 1.0.0 + */ +import type { Pet } from './pet'; + +export type Pets = Pet[]; diff --git a/tests/__snapshots__/vue-query/combination-used-by-maxim-mazurok/endpoints.ts b/tests/__snapshots__/vue-query/combination-used-by-maxim-mazurok/endpoints.ts index 0f834108ec..91e6973ec3 100644 --- a/tests/__snapshots__/vue-query/combination-used-by-maxim-mazurok/endpoints.ts +++ b/tests/__snapshots__/vue-query/combination-used-by-maxim-mazurok/endpoints.ts @@ -350,7 +350,7 @@ export type showPetByIdResponse = | showPetByIdResponseError; export const getShowPetByIdUrl = (petId: string | undefined | null) => { - return `/pets/${petId}`; + return `/pets/${encodeURIComponent(String(petId))}`; }; /** @@ -473,7 +473,7 @@ export type deletePetByIdResponse = | deletePetByIdResponseError; export const getDeletePetByIdUrl = (petId: string | undefined | null) => { - return `/pets/${petId}`; + return `/pets/${encodeURIComponent(String(petId))}`; }; /** @@ -707,7 +707,7 @@ export type showPetWithOwnerResponse = | showPetWithOwnerResponseError; export const getShowPetWithOwnerUrl = (petId: string | undefined | null) => { - return `/pets/${petId}/owner`; + return `/pets/${encodeURIComponent(String(petId))}/owner`; }; /** diff --git a/tests/__snapshots__/vue-query/url-encode-parameters/endpoints.ts b/tests/__snapshots__/vue-query/url-encode-parameters/endpoints.ts index 17febb345f..454b27e735 100644 --- a/tests/__snapshots__/vue-query/url-encode-parameters/endpoints.ts +++ b/tests/__snapshots__/vue-query/url-encode-parameters/endpoints.ts @@ -350,7 +350,7 @@ export type showPetByIdResponse = | showPetByIdResponseError; export const getShowPetByIdUrl = (petId: string) => { - return `/pets/${petId}`; + return `/pets/${encodeURIComponent(String(petId))}`; }; /** @@ -471,7 +471,7 @@ export type deletePetByIdResponse = | deletePetByIdResponseError; export const getDeletePetByIdUrl = (petId: string) => { - return `/pets/${petId}`; + return `/pets/${encodeURIComponent(String(petId))}`; }; /** @@ -705,7 +705,7 @@ export type showPetWithOwnerResponse = | showPetWithOwnerResponseError; export const getShowPetWithOwnerUrl = (petId: string) => { - return `/pets/${petId}/owner`; + return `/pets/${encodeURIComponent(String(petId))}/owner`; }; /** diff --git a/tests/configs/fetch.config.ts b/tests/configs/fetch.config.ts index 2f4f950d43..8c17dd1dc2 100644 --- a/tests/configs/fetch.config.ts +++ b/tests/configs/fetch.config.ts @@ -301,6 +301,20 @@ export default defineConfig({ target: '../specifications/parameters.yaml', }, }, + urlEncodeParameters: { + output: { + target: '../generated/fetch/url-encode-parameters/endpoints.ts', + schemas: '../generated/fetch/url-encode-parameters/model', + client: 'fetch', + mock: true, + urlEncodeParameters: true, + clean: true, + formatter: 'prettier', + }, + input: { + target: '../specifications/petstore.yaml', + }, + }, usedatesOnlyDateParams: { output: { target: '../generated/fetch/usedates-only-date-params/endpoints.ts', From 3027328bb2d6b5e9a4ae52beb12f776523749e25 Mon Sep 17 00:00:00 2001 From: zeriong Date: Wed, 20 May 2026 22:10:00 +0900 Subject: [PATCH 3/5] docs(output): clarify urlEncodeParameters scope and limitations State explicitly that the option wraps only path parameters (query parameters are already encoded by the underlying client) and note that array/object path parameters fall back to `String(value)` instead of following their OpenAPI `style` serialization, since orval does not generate `style: simple|matrix|label` for path parameters. --- docs/content/docs/reference/configuration/output.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/content/docs/reference/configuration/output.mdx b/docs/content/docs/reference/configuration/output.mdx index a4677f3465..a0b260268c 100644 --- a/docs/content/docs/reference/configuration/output.mdx +++ b/docs/content/docs/reference/configuration/output.mdx @@ -1693,7 +1693,9 @@ Make all parameters optional except path parameters. **Type:** `Boolean` **Default:** `false` -Enable URL encoding of path/query parameters. +Wrap each path parameter with `encodeURIComponent(String(...))` in generated URL helpers. This option only affects path parameters; query parameters are typically encoded by the underlying client (`URLSearchParams`, `axios`, etc.). + +Path parameters are stringified via `String(value)` before encoding, so array (`style: simple|matrix|label`) and object path parameters are not serialized according to their OpenAPI `style` — they fall back to the default `String(value)` representation. ### optionsParamRequired From 4a2b268db4cee0c4d29025e290a2c395bab7eed3 Mon Sep 17 00:00:00 2001 From: zeriong Date: Wed, 20 May 2026 22:47:49 +0900 Subject: [PATCH 4/5] test(fetch): simplify urlEncodeParameters fixture to avoid CI snapshot drift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The model files generated by this fixture exhibited a JSDoc reflow only on CI (Ubuntu) that didn't reproduce locally, while the same petstore spec under other fixtures stayed stable. Drop `schemas` and `mock` from the fixture so it only emits `endpoints.ts`; that single file still exercises the regression covered by #3343 — `${encodeURIComponent( String(petId))}` is asserted in the URL helper output. --- .../fetch/url-encode-parameters/endpoints.ts | 613 ++++-------------- .../fetch/url-encode-parameters/model/cat.ts | 12 - .../url-encode-parameters/model/catType.ts | 12 - .../model/createPetsBody.ts | 11 - .../model/createPetsParams.ts | 20 - .../model/createPetsSort.ts | 16 - .../url-encode-parameters/model/dachshund.ts | 12 - .../model/dachshundBreed.ts | 13 - .../fetch/url-encode-parameters/model/dog.ts | 19 - .../url-encode-parameters/model/dogType.ts | 12 - .../url-encode-parameters/model/error.ts | 11 - .../url-encode-parameters/model/index.ts | 26 - .../model/labradoodle.ts | 12 - .../model/labradoodleBreed.ts | 13 - .../model/listPetsParams.ts | 20 - .../model/listPetsSort.ts | 15 - .../fetch/url-encode-parameters/model/pet.ts | 30 - .../model/petCallingCode.ts | 14 - .../url-encode-parameters/model/petCountry.ts | 13 - .../url-encode-parameters/model/petWithTag.ts | 12 - .../fetch/url-encode-parameters/model/pets.ts | 9 - tests/configs/fetch.config.ts | 2 - 22 files changed, 144 insertions(+), 773 deletions(-) delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/error.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/index.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts delete mode 100644 tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts diff --git a/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts index d2835298f6..008db4d0e8 100644 --- a/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts +++ b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts @@ -4,22 +4,153 @@ * Swagger Petstore * OpenAPI spec version: 1.0.0 */ -import type { - CreatePetsBody, - CreatePetsParams, - Error, - ListPetsParams, - Pet, - PetWithTag, - Pets, -} from './model'; +export type PetCallingCode = + (typeof PetCallingCode)[keyof typeof PetCallingCode]; + +export const PetCallingCode = { + '+33': '+33', + '+420': '+420', +} as const; + +export type PetCountry = (typeof PetCountry)[keyof typeof PetCountry]; + +export const PetCountry = { + "People's_Republic_of_China": "People's Republic of China", + Uruguay: 'Uruguay', +} as const; + +export type LabradoodleBreed = + (typeof LabradoodleBreed)[keyof typeof LabradoodleBreed]; + +export const LabradoodleBreed = { + Labradoodle: 'Labradoodle', +} as const; + +export interface Labradoodle { + cuteness: number; + breed: LabradoodleBreed; +} + +export type DachshundBreed = + (typeof DachshundBreed)[keyof typeof DachshundBreed]; + +export const DachshundBreed = { + Dachshund: 'Dachshund', +} as const; + +export interface Dachshund { + length: number; + breed: DachshundBreed; +} + +export type DogType = (typeof DogType)[keyof typeof DogType]; + +export const DogType = { + dog: 'dog', +} as const; + +export type Dog = + | (Labradoodle & { + barksPerMinute?: number; + type: DogType; + }) + | (Dachshund & { + barksPerMinute?: number; + type: DogType; + }); + +export type CatType = (typeof CatType)[keyof typeof CatType]; + +export const CatType = { + cat: 'cat', +} as const; + +export interface Cat { + petsRequested?: number; + type: CatType; +} + +export type Pet = + | (Dog & { + '@id'?: string; + id: number; + name: string; + tag?: string; + email?: string; + callingCode?: PetCallingCode; + country?: PetCountry; + }) + | (Cat & { + '@id'?: string; + id: number; + name: string; + tag?: string; + email?: string; + callingCode?: PetCallingCode; + country?: PetCountry; + }); + +export type Pets = Pet[]; + +export interface Error { + code: number; + message: string; +} + +export interface PetWithTag { + tag: string; + pet: Pet | null; +} + +export type ListPetsParams = { + /** + * How many items to return at one time (max 100) + */ + limit?: string; + /** + * Which property to sort by? +Example: name sorts ASC while -name sorts DESC. -import { faker } from '@faker-js/faker'; + */ + sort: ListPetsSort; +}; + +export type ListPetsSort = (typeof ListPetsSort)[keyof typeof ListPetsSort]; -import { HttpResponse, http } from 'msw'; -import type { RequestHandlerOptions } from 'msw'; +export const ListPetsSort = { + name: 'name', + '-name': '-name', + email: 'email', + '-email': '-email', +} as const; -import type { Cat, Dachshund, Dog, Labradoodle } from './model'; +export type CreatePetsParams = { + /** + * How many items to return at one time (max 100) + */ + limit?: string; + /** + * Which property to sort by? +Example: name sorts ASC while -name sorts DESC. + + */ + sort: CreatePetsSort; +}; + +export type CreatePetsSort = + (typeof CreatePetsSort)[keyof typeof CreatePetsSort]; + +export const CreatePetsSort = { + name: 'name', + '-name': '-name', + email: 'email', + '-email': '-email', +} as const; + +export type CreatePetsBody = { + name: string; + tag: string; +}; export type HTTPStatusCode1xx = 100 | 101 | 102 | 103; export type HTTPStatusCode2xx = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207; @@ -367,459 +498,3 @@ export const showPetWithOwner = async ( headers: res.headers, } as showPetWithOwnerResponse; }; - -export const getListPetsResponseLabradoodleMock = ( - overrideResponse: Partial = {}, -): Labradoodle => ({ - ...{ - cuteness: faker.number.int(), - breed: faker.helpers.arrayElement(['Labradoodle'] as const), - }, - ...overrideResponse, -}); - -export const getListPetsResponseDachshundMock = ( - overrideResponse: Partial = {}, -): Dachshund => ({ - ...{ - length: faker.number.int(), - breed: faker.helpers.arrayElement(['Dachshund'] as const), - }, - ...overrideResponse, -}); - -export const getListPetsResponseDogMock = ( - overrideResponse: Omit, 'breed'> = {}, -): Dog => ({ - ...{ - ...faker.helpers.arrayElement([ - { ...getListPetsResponseLabradoodleMock() }, - { ...getListPetsResponseDachshundMock() }, - ]), - barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['dog'] as const), - }, - ...overrideResponse, -}); - -export const getListPetsResponseCatMock = ( - overrideResponse: Partial = {}, -): Cat => ({ - ...{ - petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['cat'] as const), - }, - ...overrideResponse, -}); - -export const getListPetsResponseMock = (): Pets => - Array.from( - { length: faker.number.int({ min: 1, max: 10 }) }, - (_, i) => i + 1, - ).map(() => ({ - ...faker.helpers.arrayElement([ - { ...getListPetsResponseDogMock() }, - { ...getListPetsResponseCatMock() }, - ]), - '@id': faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - id: faker.number.int(), - name: faker.string.alpha({ length: { min: 10, max: 20 } }), - tag: faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - email: faker.helpers.arrayElement([faker.internet.email(), undefined]), - callingCode: faker.helpers.arrayElement([ - faker.helpers.arrayElement(['+33', '+420', '+33'] as const), - undefined, - ]), - country: faker.helpers.arrayElement([ - faker.helpers.arrayElement([ - "People's Republic of China", - 'Uruguay', - ] as const), - undefined, - ]), - })); - -export const getCreatePetsResponseLabradoodleMock = ( - overrideResponse: Partial = {}, -): Labradoodle => ({ - ...{ - cuteness: faker.number.int(), - breed: faker.helpers.arrayElement(['Labradoodle'] as const), - }, - ...overrideResponse, -}); - -export const getCreatePetsResponseDachshundMock = ( - overrideResponse: Partial = {}, -): Dachshund => ({ - ...{ - length: faker.number.int(), - breed: faker.helpers.arrayElement(['Dachshund'] as const), - }, - ...overrideResponse, -}); - -export const getCreatePetsResponseDogMock = ( - overrideResponse: Omit, 'breed'> = {}, -): Dog => ({ - ...{ - ...faker.helpers.arrayElement([ - { ...getCreatePetsResponseLabradoodleMock() }, - { ...getCreatePetsResponseDachshundMock() }, - ]), - barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['dog'] as const), - }, - ...overrideResponse, -}); - -export const getCreatePetsResponseCatMock = ( - overrideResponse: Partial = {}, -): Cat => ({ - ...{ - petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['cat'] as const), - }, - ...overrideResponse, -}); - -export const getCreatePetsResponseMock = (): Pet => ({ - ...faker.helpers.arrayElement([ - { ...getCreatePetsResponseDogMock() }, - { ...getCreatePetsResponseCatMock() }, - ]), - '@id': faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - id: faker.number.int(), - name: faker.string.alpha({ length: { min: 10, max: 20 } }), - tag: faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - email: faker.helpers.arrayElement([faker.internet.email(), undefined]), - callingCode: faker.helpers.arrayElement([ - faker.helpers.arrayElement(['+33', '+420', '+33'] as const), - undefined, - ]), - country: faker.helpers.arrayElement([ - faker.helpers.arrayElement([ - "People's Republic of China", - 'Uruguay', - ] as const), - undefined, - ]), -}); - -export const getShowPetByIdResponseLabradoodleMock = ( - overrideResponse: Partial = {}, -): Labradoodle => ({ - ...{ - cuteness: faker.number.int(), - breed: faker.helpers.arrayElement(['Labradoodle'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetByIdResponseDachshundMock = ( - overrideResponse: Partial = {}, -): Dachshund => ({ - ...{ - length: faker.number.int(), - breed: faker.helpers.arrayElement(['Dachshund'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetByIdResponseDogMock = ( - overrideResponse: Omit, 'breed'> = {}, -): Dog => ({ - ...{ - ...faker.helpers.arrayElement([ - { ...getShowPetByIdResponseLabradoodleMock() }, - { ...getShowPetByIdResponseDachshundMock() }, - ]), - barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['dog'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetByIdResponseCatMock = ( - overrideResponse: Partial = {}, -): Cat => ({ - ...{ - petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['cat'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetByIdResponseMock = (): Pet => ({ - ...faker.helpers.arrayElement([ - { ...getShowPetByIdResponseDogMock() }, - { ...getShowPetByIdResponseCatMock() }, - ]), - '@id': faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - id: faker.number.int(), - name: faker.string.alpha({ length: { min: 10, max: 20 } }), - tag: faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - email: faker.helpers.arrayElement([faker.internet.email(), undefined]), - callingCode: faker.helpers.arrayElement([ - faker.helpers.arrayElement(['+33', '+420', '+33'] as const), - undefined, - ]), - country: faker.helpers.arrayElement([ - faker.helpers.arrayElement([ - "People's Republic of China", - 'Uruguay', - ] as const), - undefined, - ]), -}); - -export const getHealthCheckResponseMock = (): string => faker.word.sample(); - -export const getShowPetWithOwnerResponseLabradoodleMock = ( - overrideResponse: Partial = {}, -): Labradoodle => ({ - ...{ - cuteness: faker.number.int(), - breed: faker.helpers.arrayElement(['Labradoodle'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetWithOwnerResponseDachshundMock = ( - overrideResponse: Partial = {}, -): Dachshund => ({ - ...{ - length: faker.number.int(), - breed: faker.helpers.arrayElement(['Dachshund'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetWithOwnerResponseDogMock = ( - overrideResponse: Omit, 'breed'> = {}, -): Dog => ({ - ...{ - ...faker.helpers.arrayElement([ - { ...getShowPetWithOwnerResponseLabradoodleMock() }, - { ...getShowPetWithOwnerResponseDachshundMock() }, - ]), - barksPerMinute: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['dog'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetWithOwnerResponseCatMock = ( - overrideResponse: Partial = {}, -): Cat => ({ - ...{ - petsRequested: faker.helpers.arrayElement([faker.number.int(), undefined]), - type: faker.helpers.arrayElement(['cat'] as const), - }, - ...overrideResponse, -}); - -export const getShowPetWithOwnerResponseMock = ( - overrideResponse: Partial> = {}, -): PetWithTag => ({ - tag: faker.string.alpha({ length: { min: 10, max: 20 } }), - pet: { - ...faker.helpers.arrayElement([ - { ...getShowPetWithOwnerResponseDogMock() }, - { ...getShowPetWithOwnerResponseCatMock() }, - ]), - '@id': faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - id: faker.number.int(), - name: faker.string.alpha({ length: { min: 10, max: 20 } }), - tag: faker.helpers.arrayElement([ - faker.string.alpha({ length: { min: 10, max: 20 } }), - undefined, - ]), - email: faker.helpers.arrayElement([faker.internet.email(), undefined]), - callingCode: faker.helpers.arrayElement([ - faker.helpers.arrayElement(['+33', '+420', '+33'] as const), - undefined, - ]), - country: faker.helpers.arrayElement([ - faker.helpers.arrayElement([ - "People's Republic of China", - 'Uruguay', - ] as const), - undefined, - ]), - }, - ...overrideResponse, -}); - -export const getListPetsMockHandler = ( - overrideResponse?: - | Pets - | (( - info: Parameters[1]>[0], - ) => Promise | Pets), - options?: RequestHandlerOptions, -) => { - return http.get( - '*/pets', - async (info: Parameters[1]>[0]) => { - return HttpResponse.json( - overrideResponse !== undefined - ? typeof overrideResponse === 'function' - ? await overrideResponse(info) - : overrideResponse - : getListPetsResponseMock(), - { status: 200 }, - ); - }, - options, - ); -}; - -export const getCreatePetsMockHandler = ( - overrideResponse?: - | Pet - | (( - info: Parameters[1]>[0], - ) => Promise | Pet), - options?: RequestHandlerOptions, -) => { - return http.post( - '*/pets', - async (info: Parameters[1]>[0]) => { - return HttpResponse.json( - overrideResponse !== undefined - ? typeof overrideResponse === 'function' - ? await overrideResponse(info) - : overrideResponse - : getCreatePetsResponseMock(), - { status: 200 }, - ); - }, - options, - ); -}; - -export const getShowPetByIdMockHandler = ( - overrideResponse?: - | Pet - | (( - info: Parameters[1]>[0], - ) => Promise | Pet), - options?: RequestHandlerOptions, -) => { - return http.get( - '*/pets/:petId', - async (info: Parameters[1]>[0]) => { - return HttpResponse.json( - overrideResponse !== undefined - ? typeof overrideResponse === 'function' - ? await overrideResponse(info) - : overrideResponse - : getShowPetByIdResponseMock(), - { status: 200 }, - ); - }, - options, - ); -}; - -export const getDeletePetByIdMockHandler = ( - overrideResponse?: - | void - | (( - info: Parameters[1]>[0], - ) => Promise | void), - options?: RequestHandlerOptions, -) => { - return http.delete( - '*/pets/:petId', - async (info: Parameters[1]>[0]) => { - if (typeof overrideResponse === 'function') { - await overrideResponse(info); - } - - return new HttpResponse(null, { status: 204 }); - }, - options, - ); -}; - -export const getHealthCheckMockHandler = ( - overrideResponse?: - | string - | (( - info: Parameters[1]>[0], - ) => Promise | string), - options?: RequestHandlerOptions, -) => { - return http.get( - '*/health', - async (info: Parameters[1]>[0]) => { - const resolvedBody = - overrideResponse !== undefined - ? typeof overrideResponse === 'function' - ? await overrideResponse(info) - : overrideResponse - : getHealthCheckResponseMock(); - const textBody = - typeof resolvedBody === 'string' - ? resolvedBody - : JSON.stringify(resolvedBody ?? null); - return HttpResponse.text(textBody, { status: 200 }); - }, - options, - ); -}; - -export const getShowPetWithOwnerMockHandler = ( - overrideResponse?: - | PetWithTag - | (( - info: Parameters[1]>[0], - ) => Promise | PetWithTag), - options?: RequestHandlerOptions, -) => { - return http.get( - '*/pets/:petId/owner', - async (info: Parameters[1]>[0]) => { - return HttpResponse.json( - overrideResponse !== undefined - ? typeof overrideResponse === 'function' - ? await overrideResponse(info) - : overrideResponse - : getShowPetWithOwnerResponseMock(), - { status: 200 }, - ); - }, - options, - ); -}; -export const getSwaggerPetstoreMock = () => [ - getListPetsMockHandler(), - getCreatePetsMockHandler(), - getShowPetByIdMockHandler(), - getDeletePetByIdMockHandler(), - getHealthCheckMockHandler(), - getShowPetWithOwnerMockHandler(), -]; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts deleted file mode 100644 index 15f6290f8c..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/cat.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { CatType } from './catType'; - -export interface Cat { - petsRequested?: number; - type: CatType; -} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts deleted file mode 100644 index 44e478aabf..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/catType.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type CatType = (typeof CatType)[keyof typeof CatType]; - -export const CatType = { - cat: 'cat', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts deleted file mode 100644 index 13a59e2eb2..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsBody.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type CreatePetsBody = { - name: string; - tag: string; -}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts deleted file mode 100644 index d0d0431a0c..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsParams.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { CreatePetsSort } from './createPetsSort'; - -export type CreatePetsParams = { - /** - * How many items to return at one time (max 100) - */ - limit?: string; - /** - * Which property to sort by? -Example: name sorts ASC while -name sorts DESC. - - */ - sort: CreatePetsSort; -}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts deleted file mode 100644 index a03f424b2e..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/createPetsSort.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type CreatePetsSort = - (typeof CreatePetsSort)[keyof typeof CreatePetsSort]; - -export const CreatePetsSort = { - name: 'name', - '-name': '-name', - email: 'email', - '-email': '-email', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts deleted file mode 100644 index bc42f0c75d..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshund.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { DachshundBreed } from './dachshundBreed'; - -export interface Dachshund { - length: number; - breed: DachshundBreed; -} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts deleted file mode 100644 index db2de3a460..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/dachshundBreed.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type DachshundBreed = - (typeof DachshundBreed)[keyof typeof DachshundBreed]; - -export const DachshundBreed = { - Dachshund: 'Dachshund', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts deleted file mode 100644 index a1fcf8c8af..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/dog.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { Dachshund } from './dachshund'; -import type { DogType } from './dogType'; -import type { Labradoodle } from './labradoodle'; - -export type Dog = - | (Labradoodle & { - barksPerMinute?: number; - type: DogType; - }) - | (Dachshund & { - barksPerMinute?: number; - type: DogType; - }); diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts deleted file mode 100644 index f10e924f2d..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/dogType.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type DogType = (typeof DogType)[keyof typeof DogType]; - -export const DogType = { - dog: 'dog', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts deleted file mode 100644 index dfef282f93..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/error.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export interface Error { - code: number; - message: string; -} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts deleted file mode 100644 index 3a779d3ad8..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export * from './cat'; -export * from './catType'; -export * from './createPetsBody'; -export * from './createPetsParams'; -export * from './createPetsSort'; -export * from './dachshund'; -export * from './dachshundBreed'; -export * from './dog'; -export * from './dogType'; -export * from './error'; -export * from './labradoodle'; -export * from './labradoodleBreed'; -export * from './listPetsParams'; -export * from './listPetsSort'; -export * from './pet'; -export * from './petCallingCode'; -export * from './petCountry'; -export * from './pets'; -export * from './petWithTag'; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts deleted file mode 100644 index fc59343a94..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodle.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { LabradoodleBreed } from './labradoodleBreed'; - -export interface Labradoodle { - cuteness: number; - breed: LabradoodleBreed; -} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts deleted file mode 100644 index 4bc1bd43e3..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/labradoodleBreed.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type LabradoodleBreed = - (typeof LabradoodleBreed)[keyof typeof LabradoodleBreed]; - -export const LabradoodleBreed = { - Labradoodle: 'Labradoodle', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts deleted file mode 100644 index f03f7e5753..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsParams.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { ListPetsSort } from './listPetsSort'; - -export type ListPetsParams = { - /** - * How many items to return at one time (max 100) - */ - limit?: string; - /** - * Which property to sort by? -Example: name sorts ASC while -name sorts DESC. - - */ - sort: ListPetsSort; -}; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts deleted file mode 100644 index 2ba7a791c5..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/listPetsSort.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type ListPetsSort = (typeof ListPetsSort)[keyof typeof ListPetsSort]; - -export const ListPetsSort = { - name: 'name', - '-name': '-name', - email: 'email', - '-email': '-email', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts deleted file mode 100644 index 4ebb45c01f..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/pet.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { Cat } from './cat'; -import type { Dog } from './dog'; -import type { PetCallingCode } from './petCallingCode'; -import type { PetCountry } from './petCountry'; - -export type Pet = - | (Dog & { - '@id'?: string; - id: number; - name: string; - tag?: string; - email?: string; - callingCode?: PetCallingCode; - country?: PetCountry; - }) - | (Cat & { - '@id'?: string; - id: number; - name: string; - tag?: string; - email?: string; - callingCode?: PetCallingCode; - country?: PetCountry; - }); diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts deleted file mode 100644 index 531bb18dcc..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/petCallingCode.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type PetCallingCode = - (typeof PetCallingCode)[keyof typeof PetCallingCode]; - -export const PetCallingCode = { - '+33': '+33', - '+420': '+420', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts deleted file mode 100644 index bf0fd6b5e0..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/petCountry.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ - -export type PetCountry = (typeof PetCountry)[keyof typeof PetCountry]; - -export const PetCountry = { - "People's_Republic_of_China": "People's Republic of China", - Uruguay: 'Uruguay', -} as const; diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts deleted file mode 100644 index b7c93d0ba3..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/petWithTag.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { Pet } from './pet'; - -export interface PetWithTag { - tag: string; - pet: Pet | null; -} diff --git a/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts b/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts deleted file mode 100644 index 25ee7a25eb..0000000000 --- a/tests/__snapshots__/fetch/url-encode-parameters/model/pets.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated by orval v8.11.0 🍺 - * Do not edit manually. - * Swagger Petstore - * OpenAPI spec version: 1.0.0 - */ -import type { Pet } from './pet'; - -export type Pets = Pet[]; diff --git a/tests/configs/fetch.config.ts b/tests/configs/fetch.config.ts index 8c17dd1dc2..f7541a25bb 100644 --- a/tests/configs/fetch.config.ts +++ b/tests/configs/fetch.config.ts @@ -304,9 +304,7 @@ export default defineConfig({ urlEncodeParameters: { output: { target: '../generated/fetch/url-encode-parameters/endpoints.ts', - schemas: '../generated/fetch/url-encode-parameters/model', client: 'fetch', - mock: true, urlEncodeParameters: true, clean: true, formatter: 'prettier', From 6f3339f569d5cea4c03f6b70c231e2177c343f6b Mon Sep 17 00:00:00 2001 From: zeriong Date: Wed, 20 May 2026 22:58:47 +0900 Subject: [PATCH 5/5] test(fetch): refresh urlEncodeParameters snapshot for new JSDoc reflow After the master merge of #3393 (`fix(core): handle multi-line descriptions in JSDoc generation`), the core now emits multi-line JSDoc with proper ` * ` line prefixes. Regenerate the snapshot for this PR's new fixture so it matches the post-#3393 output. The `encodeURIComponent(String(petId))` assertions covering #3343 are preserved. --- .../fetch/url-encode-parameters/endpoints.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts index 008db4d0e8..d04e5964a5 100644 --- a/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts +++ b/tests/__snapshots__/fetch/url-encode-parameters/endpoints.ts @@ -108,10 +108,10 @@ export type ListPetsParams = { */ limit?: string; /** - * Which property to sort by? -Example: name sorts ASC while -name sorts DESC. - - */ + * Which property to sort by? + * Example: name sorts ASC while -name sorts DESC. + * + */ sort: ListPetsSort; }; @@ -130,10 +130,10 @@ export type CreatePetsParams = { */ limit?: string; /** - * Which property to sort by? -Example: name sorts ASC while -name sorts DESC. - - */ + * Which property to sort by? + * Example: name sorts ASC while -name sorts DESC. + * + */ sort: CreatePetsSort; };