Skip to content

Commit 1878c69

Browse files
committed
test: add tests for operationToId method
1 parent 1de7641 commit 1878c69

File tree

236 files changed

+5627
-475
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

236 files changed

+5627
-475
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"test:coverage": "turbo run test:coverage",
3333
"test:e2e": "turbo run test:e2e",
3434
"test:update": "turbo run test:update",
35+
"test:watch": "turbo run test:watch",
3536
"test": "turbo run test",
3637
"typecheck": "turbo run typecheck --filter=\"!@example/openapi-ts-sample\"",
3738
"vitepress": "turbo run $1 --filter=\"@docs/openapi-ts\""

packages/openapi-ts/src/getSpec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export const getSpec = async ({
3737
let hasChanged: boolean | undefined;
3838
let response: Response | undefined;
3939

40-
// no support for watching files and objects for now
4140
if (resolvedInput.type === 'url') {
4241
// do NOT send HEAD request on first run or if unsupported
4342
if (watch.lastValue && watch.isHeadMethodSupported !== false) {
@@ -129,6 +128,13 @@ export const getSpec = async ({
129128
hasChanged = content !== watch.lastValue;
130129
watch.lastValue = content;
131130
}
131+
} else {
132+
// we do not support watch mode for files or raw spec data
133+
if (!watch.lastValue) {
134+
watch.lastValue = resolvedInput.type;
135+
} else {
136+
hasChanged = false;
137+
}
132138
}
133139

134140
if (hasChanged === false) {

packages/openapi-ts/src/openApi/common/parser/operation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ export const operationNameFn = ({
208208
urlWithoutPlaceholders = urlWithoutPlaceholders
209209
.replace(/{(.*?)}/g, 'by-$1')
210210
// replace slashes with hyphens for camelcase method at the end
211-
.replace(/[/:]/g, '-');
211+
.replace(/[/:+]/g, '-');
212212

213213
return stringCase({
214214
case: 'camelCase',
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { describe, expect, it } from 'vitest';
2+
3+
import type { IR } from '../../../../ir/types';
4+
import { operationToId } from '../operation';
5+
6+
describe('operationToId', () => {
7+
const scenarios: Array<{
8+
id?: string;
9+
method: string;
10+
output: string;
11+
path: string;
12+
}> = [
13+
{
14+
method: 'post',
15+
output: 'postFoo',
16+
path: '/foo',
17+
},
18+
{
19+
id: 'Post-foo',
20+
method: 'post',
21+
output: 'postFoo',
22+
path: '/foo',
23+
},
24+
{
25+
method: 'post',
26+
output: 'postFooByFooId',
27+
path: '/foo/{foo_id}',
28+
},
29+
{
30+
method: 'post',
31+
output: 'postFooByFooIdBarBazQux',
32+
path: '/foo/{foo_id}/bar+baz:qux',
33+
},
34+
];
35+
36+
it.each(scenarios)(
37+
'transforms $method $path ($id) -> $output',
38+
async ({ id, method, output, path }) => {
39+
const context: Partial<IR.Context> = {
40+
config: {
41+
plugins: {
42+
// @ts-expect-error
43+
'@hey-api/sdk': {
44+
operationId: true,
45+
},
46+
},
47+
},
48+
};
49+
expect(
50+
operationToId({
51+
context: context as IR.Context,
52+
id,
53+
method,
54+
path,
55+
}),
56+
).toEqual(output);
57+
},
58+
);
59+
});

packages/openapi-ts/src/openApi/shared/utils/operation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const operationToId = ({
6868
const urlWithoutPlaceholders = path
6969
.replace(/{(.*?)}/g, 'by-$1')
7070
// replace slashes with hyphens for camelcase method at the end
71-
.replace(/[/:]/g, '-');
71+
.replace(/[/:+]/g, '-');
7272

7373
return stringCase({
7474
case: 'camelCase',

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

33
import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch';
4-
import type { ServiceWithEmptyTagData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, HeadCallWithoutParametersAndResponseData, OptionsCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, CallWithResponseAndNoContentResponseResponse, DummyAData, DummyBData, CallWithResponseData, CallWithResponseResponse, CallWithDuplicateResponsesData, CallWithDuplicateResponsesResponse, CallWithDuplicateResponsesError, CallWithResponsesData, CallWithResponsesResponse, CallWithResponsesError, CollectionFormatData, TypesData, TypesResponse, ComplexTypesData, ComplexTypesResponse, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyResponse, PostApiVbyApiVersionBodyError } from './types.gen';
4+
import type { ServiceWithEmptyTagData, PatchApiVbyApiVersionNoTagData, FooWowData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, HeadCallWithoutParametersAndResponseData, OptionsCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, CallWithResponseAndNoContentResponseResponse, DummyAData, DummyBData, CallWithResponseData, CallWithResponseResponse, CallWithDuplicateResponsesData, CallWithDuplicateResponsesResponse, CallWithDuplicateResponsesError, CallWithResponsesData, CallWithResponsesResponse, CallWithResponsesError, CollectionFormatData, TypesData, TypesResponse, ComplexTypesData, ComplexTypesResponse, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyResponse, PostApiVbyApiVersionBodyError } from './types.gen';
55
import { client as _heyApiClient } from './client.gen';
66

77
export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
@@ -15,7 +15,21 @@ export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends
1515

1616
export const serviceWithEmptyTag = <ThrowOnError extends boolean = false>(options?: Options<ServiceWithEmptyTagData, ThrowOnError>) => {
1717
return (options?.client ?? _heyApiClient).get<unknown, unknown, ThrowOnError>({
18-
url: '/api/v{api-version}/no-tag',
18+
url: '/api/v{api-version}/no+tag',
19+
...options
20+
});
21+
};
22+
23+
export const patchApiVbyApiVersionNoTag = <ThrowOnError extends boolean = false>(options?: Options<PatchApiVbyApiVersionNoTagData, ThrowOnError>) => {
24+
return (options?.client ?? _heyApiClient).patch<unknown, unknown, ThrowOnError>({
25+
url: '/api/v{api-version}/no+tag',
26+
...options
27+
});
28+
};
29+
30+
export const fooWow = <ThrowOnError extends boolean = false>(options?: Options<FooWowData, ThrowOnError>) => {
31+
return (options?.client ?? _heyApiClient).put<unknown, unknown, ThrowOnError>({
32+
url: '/api/v{api-version}/no+tag',
1933
...options
2034
});
2135
};

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/types.gen.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,35 @@ export type ServiceWithEmptyTagData = {
410410
body?: never;
411411
path?: never;
412412
query?: never;
413-
url: '/api/v{api-version}/no-tag';
413+
url: '/api/v{api-version}/no+tag';
414+
};
415+
416+
export type PatchApiVbyApiVersionNoTagData = {
417+
body?: never;
418+
path?: never;
419+
query?: never;
420+
url: '/api/v{api-version}/no+tag';
421+
};
422+
423+
export type PatchApiVbyApiVersionNoTagResponses = {
424+
/**
425+
* OK
426+
*/
427+
default: unknown;
428+
};
429+
430+
export type FooWowData = {
431+
body?: never;
432+
path?: never;
433+
query?: never;
434+
url: '/api/v{api-version}/no+tag';
435+
};
436+
437+
export type FooWowResponses = {
438+
/**
439+
* OK
440+
*/
441+
default: unknown;
414442
};
415443

416444
export type DeleteCallWithoutParametersAndResponseData = {

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/sdk.gen.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

33
import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch';
4-
import type { ServiceWithEmptyTagData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, HeadCallWithoutParametersAndResponseData, OptionsCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, CallWithResponseAndNoContentResponseResponse, DummyAData, DummyBData, CallWithResponseData, CallWithResponseResponse, CallWithDuplicateResponsesData, CallWithDuplicateResponsesResponse, CallWithDuplicateResponsesError, CallWithResponsesData, CallWithResponsesResponse, CallWithResponsesError, CollectionFormatData, TypesData, TypesResponse, ComplexTypesData, ComplexTypesResponse, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyResponse, PostApiVbyApiVersionBodyError } from './types.gen';
4+
import type { ServiceWithEmptyTagData, PatchApiVbyApiVersionNoTagData, FooWowData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, HeadCallWithoutParametersAndResponseData, OptionsCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, CallWithResponseAndNoContentResponseResponse, DummyAData, DummyBData, CallWithResponseData, CallWithResponseResponse, CallWithDuplicateResponsesData, CallWithDuplicateResponsesResponse, CallWithDuplicateResponsesError, CallWithResponsesData, CallWithResponsesResponse, CallWithResponsesError, CollectionFormatData, TypesData, TypesResponse, ComplexTypesData, ComplexTypesResponse, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyResponse, PostApiVbyApiVersionBodyError } from './types.gen';
55
import { client as _heyApiClient } from './client.gen';
66

77
export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
@@ -15,7 +15,21 @@ export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends
1515

1616
export const serviceWithEmptyTag = <ThrowOnError extends boolean = true>(options?: Options<ServiceWithEmptyTagData, ThrowOnError>) => {
1717
return (options?.client ?? _heyApiClient).get<unknown, unknown, ThrowOnError>({
18-
url: '/api/v{api-version}/no-tag',
18+
url: '/api/v{api-version}/no+tag',
19+
...options
20+
});
21+
};
22+
23+
export const patchApiVbyApiVersionNoTag = <ThrowOnError extends boolean = true>(options?: Options<PatchApiVbyApiVersionNoTagData, ThrowOnError>) => {
24+
return (options?.client ?? _heyApiClient).patch<unknown, unknown, ThrowOnError>({
25+
url: '/api/v{api-version}/no+tag',
26+
...options
27+
});
28+
};
29+
30+
export const fooWow = <ThrowOnError extends boolean = true>(options?: Options<FooWowData, ThrowOnError>) => {
31+
return (options?.client ?? _heyApiClient).put<unknown, unknown, ThrowOnError>({
32+
url: '/api/v{api-version}/no+tag',
1933
...options
2034
});
2135
};

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/types.gen.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,35 @@ export type ServiceWithEmptyTagData = {
410410
body?: never;
411411
path?: never;
412412
query?: never;
413-
url: '/api/v{api-version}/no-tag';
413+
url: '/api/v{api-version}/no+tag';
414+
};
415+
416+
export type PatchApiVbyApiVersionNoTagData = {
417+
body?: never;
418+
path?: never;
419+
query?: never;
420+
url: '/api/v{api-version}/no+tag';
421+
};
422+
423+
export type PatchApiVbyApiVersionNoTagResponses = {
424+
/**
425+
* OK
426+
*/
427+
default: unknown;
428+
};
429+
430+
export type FooWowData = {
431+
body?: never;
432+
path?: never;
433+
query?: never;
434+
url: '/api/v{api-version}/no+tag';
435+
};
436+
437+
export type FooWowResponses = {
438+
/**
439+
* OK
440+
*/
441+
default: unknown;
414442
};
415443

416444
export type DeleteCallWithoutParametersAndResponseData = {

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/asClass/@tanstack/angular-query-experimental.gen.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { type Options, DefaultService, SimpleService, DescriptionsService, ParametersService, DefaultsService, DuplicateService, NoContentService, ResponseService, MultipleTags1Service, CollectionFormatService, TypesService, ComplexService, HeaderService, ErrorService, NonAsciiÆøåÆøÅöôêÊService } from '../sdk.gen';
44
import { queryOptions, type MutationOptions, type DefaultError } from '@tanstack/angular-query-experimental';
5-
import type { ServiceWithEmptyTagData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, DummyAData, DummyBData, CallWithResponseData, CallWithDuplicateResponsesData, CallWithDuplicateResponsesError, CallWithDuplicateResponsesResponse, CallWithResponsesData, CallWithResponsesError, CallWithResponsesResponse, CollectionFormatData, TypesData, ComplexTypesData, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyError, PostApiVbyApiVersionBodyResponse } from '../types.gen';
5+
import type { ServiceWithEmptyTagData, PatchApiVbyApiVersionNoTagData, FooWowData, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithResponseAndNoContentResponseData, DummyAData, DummyBData, CallWithResponseData, CallWithDuplicateResponsesData, CallWithDuplicateResponsesError, CallWithDuplicateResponsesResponse, CallWithResponsesData, CallWithResponsesError, CallWithResponsesResponse, CollectionFormatData, TypesData, ComplexTypesData, CallWithResultFromHeaderData, TestErrorCodeData, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyError, PostApiVbyApiVersionBodyResponse } from '../types.gen';
66
import { client as _heyApiClient } from '../client.gen';
77

88
type QueryKey<TOptions extends Options> = [
@@ -51,6 +51,34 @@ export const serviceWithEmptyTagOptions = (options?: Options<ServiceWithEmptyTag
5151
});
5252
};
5353

54+
export const patchApiVbyApiVersionNoTagMutation = (options?: Partial<Options<PatchApiVbyApiVersionNoTagData>>) => {
55+
const mutationOptions: MutationOptions<unknown, DefaultError, Options<PatchApiVbyApiVersionNoTagData>> = {
56+
mutationFn: async (localOptions) => {
57+
const { data } = await DefaultService.patchApiVbyApiVersionNoTag({
58+
...options,
59+
...localOptions,
60+
throwOnError: true
61+
});
62+
return data;
63+
}
64+
};
65+
return mutationOptions;
66+
};
67+
68+
export const fooWowMutation = (options?: Partial<Options<FooWowData>>) => {
69+
const mutationOptions: MutationOptions<unknown, DefaultError, Options<FooWowData>> = {
70+
mutationFn: async (localOptions) => {
71+
const { data } = await DefaultService.fooWow({
72+
...options,
73+
...localOptions,
74+
throwOnError: true
75+
});
76+
return data;
77+
}
78+
};
79+
return mutationOptions;
80+
};
81+
5482
export const deleteCallWithoutParametersAndResponseMutation = (options?: Partial<Options<DeleteCallWithoutParametersAndResponseData>>) => {
5583
const mutationOptions: MutationOptions<unknown, DefaultError, Options<DeleteCallWithoutParametersAndResponseData>> = {
5684
mutationFn: async (localOptions) => {

0 commit comments

Comments
 (0)