Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/neat-pillows-speak.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@hey-api/openapi-ts': minor
---

fix(sdk): rename `serviceNameBuilder` to `classNameBuilder`
5 changes: 0 additions & 5 deletions .changeset/shaggy-beers-call.md

This file was deleted.

5 changes: 5 additions & 0 deletions .changeset/weak-ways-kiss.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@hey-api/openapi-ts': patch
---

fix(sdk): add `instance` option for instantiable SDKs
2 changes: 1 addition & 1 deletion docs/.vitepress/theme/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ h3#demo + button {
}

html.dark .authors-list li > a,
html.dark .sponsors-list li > a {
html.dark .sponsors-list li {
background-color: var(--vp-button-brand-bg);
}

Expand Down
19 changes: 19 additions & 0 deletions docs/openapi-ts/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,25 @@ Plugins are responsible for generating artifacts from your input. By default, He

You can learn more on the [Output](/openapi-ts/output) page.

## Validating

To validate your input, set `input.validate_EXPERIMENTAL` to `true`.

::: warning
The validator feature is very limited. You can help improve it by submitting more [use cases](https://github.com/hey-api/openapi-ts/issues/1970#issuecomment-2933189789).
:::

```js
export default {
input: {
path: 'https://get.heyapi.dev/hey-api/backend',
validate_EXPERIMENTAL: true, // [!code ++]
},
output: 'src/client',
plugins: ['@hey-api/client-fetch'],
};
```

## Formatting

To format your output folder contents, set `output.format` to a valid formatter.
Expand Down
23 changes: 23 additions & 0 deletions docs/openapi-ts/migrating.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,29 @@ This config option is deprecated and will be removed in favor of [clients](./cli

This config option is deprecated and will be removed.

## v0.71.0

### Renamed `sdk.serviceNameBuilder` option

This option has been renamed to `sdk.classNameBuilder` to better represent its functionality. Additionally, it's no longer set by default. To preserve the previous behavior, update your configuration.

```js
import { defaultPlugins } from '@hey-api/openapi-ts';

export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
...defaultPlugins,
{
classNameBuilder: '{{name}}Service', // [!code ++]
name: '@hey-api/sdk',
serviceNameBuilder: '{{name}}Service', // [!code --]
},
],
};
```

## v0.68.0

### Upgraded input filters
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// This file is auto-generated by @hey-api/openapi-ts

import type { ClientOptions } from './types.gen';
import { type Config, type ClientOptions as DefaultClientOptions, createClient, createConfig } from '@hey-api/client-fetch';

/**
* The `createClientConfig()` function will be called on client initialization
* and the returned object will become the client's initial configuration.
*
* You may want to initialize your client this way instead of calling
* `setConfig()`. This is useful for example if you're using Next.js
* to ensure your client always has the correct values.
*/
export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> = (override?: Config<DefaultClientOptions & T>) => Config<Required<DefaultClientOptions> & T>;

export const client = createClient(createConfig<ClientOptions>({
baseUrl: 'http://localhost:3000/base'
}));
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// This file is auto-generated by @hey-api/openapi-ts
export * from './types.gen';
export * from './sdk.gen';
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
// This file is auto-generated by @hey-api/openapi-ts

import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch';
import type { ServiceWithEmptyTagData, PatchApiVbyApiVersionNoTagData, PatchApiVbyApiVersionNoTagResponses, FooWowData, FooWowResponses, DeleteCallWithoutParametersAndResponseData, GetCallWithoutParametersAndResponseData, HeadCallWithoutParametersAndResponseData, OptionsCallWithoutParametersAndResponseData, PatchCallWithoutParametersAndResponseData, PostCallWithoutParametersAndResponseData, PutCallWithoutParametersAndResponseData, CallWithDescriptionsData, CallWithParametersData, CallWithWeirdParameterNamesData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, DuplicateNameData, DuplicateName2Data, DuplicateName3Data, DuplicateName4Data, CallWithNoContentResponseData, CallWithNoContentResponseResponses, CallWithResponseAndNoContentResponseData, CallWithResponseAndNoContentResponseResponses, DummyAData, DummyAResponses, DummyBData, DummyBResponses, CallWithResponseData, CallWithResponseResponses, CallWithDuplicateResponsesData, CallWithDuplicateResponsesResponses, CallWithDuplicateResponsesErrors, CallWithResponsesData, CallWithResponsesResponses, CallWithResponsesErrors, CollectionFormatData, TypesData, TypesResponses, ComplexTypesData, ComplexTypesResponses, ComplexTypesErrors, CallWithResultFromHeaderData, CallWithResultFromHeaderResponses, CallWithResultFromHeaderErrors, TestErrorCodeData, TestErrorCodeResponses, TestErrorCodeErrors, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Responses, PostApiVbyApiVersionBodyData, PostApiVbyApiVersionBodyResponses, PostApiVbyApiVersionBodyErrors } from './types.gen';
import { client as _heyApiClient } from './client.gen';

export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
/**
* You can provide a client instance returned by `createClient()` instead of
* individual options. This might be also useful if you want to implement a
* custom client.
*/
client?: Client;
/**
* You can pass arbitrary values through the `meta` object. This can be
* used to access values that aren't defined as part of the SDK function.
*/
meta?: Record<string, unknown>;
};

export class Sdk {
client: Client = _heyApiClient;

constructor({ client }: {
client?: Client;
}) {
if (client) {
this.client = client;
}
}

public serviceWithEmptyTag<ThrowOnError extends boolean = false>(options?: Options<ServiceWithEmptyTagData, ThrowOnError>) {
return (options?.client ?? this.client).get<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/no+tag',
...options
});
}

public patchApiVbyApiVersionNoTag<ThrowOnError extends boolean = false>(options?: Options<PatchApiVbyApiVersionNoTagData, ThrowOnError>) {
return (options?.client ?? this.client).patch<PatchApiVbyApiVersionNoTagResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/no+tag',
...options
});
}

public fooWow<ThrowOnError extends boolean = false>(options?: Options<FooWowData, ThrowOnError>) {
return (options?.client ?? this.client).put<FooWowResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/no+tag',
...options
});
}

public deleteCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<DeleteCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).delete<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public getCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<GetCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).get<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public headCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<HeadCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).head<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public optionsCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<OptionsCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).options<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public patchCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<PatchCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).patch<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public postCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<PostCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public putCallWithoutParametersAndResponse<ThrowOnError extends boolean = false>(options?: Options<PutCallWithoutParametersAndResponseData, ThrowOnError>) {
return (options?.client ?? this.client).put<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/simple',
...options
});
}

public callWithDescriptions<ThrowOnError extends boolean = false>(options?: Options<CallWithDescriptionsData, ThrowOnError>) {
return (options?.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/descriptions/',
...options
});
}

public callWithParameters<ThrowOnError extends boolean = false>(options: Options<CallWithParametersData, ThrowOnError>) {
return (options.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/parameters/{parameterPath}',
...options
});
}

public callWithWeirdParameterNames<ThrowOnError extends boolean = false>(options: Options<CallWithWeirdParameterNamesData, ThrowOnError>) {
return (options.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}',
...options
});
}

public callWithDefaultParameters<ThrowOnError extends boolean = false>(options: Options<CallWithDefaultParametersData, ThrowOnError>) {
return (options.client ?? this.client).get<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/defaults',
...options
});
}

public callWithDefaultOptionalParameters<ThrowOnError extends boolean = false>(options?: Options<CallWithDefaultOptionalParametersData, ThrowOnError>) {
return (options?.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/defaults',
...options
});
}

public callToTestOrderOfParams<ThrowOnError extends boolean = false>(options: Options<CallToTestOrderOfParamsData, ThrowOnError>) {
return (options.client ?? this.client).put<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/defaults',
...options
});
}

public duplicateName<ThrowOnError extends boolean = false>(options?: Options<DuplicateNameData, ThrowOnError>) {
return (options?.client ?? this.client).delete<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/duplicate',
...options
});
}

public duplicateName2<ThrowOnError extends boolean = false>(options?: Options<DuplicateName2Data, ThrowOnError>) {
return (options?.client ?? this.client).get<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/duplicate',
...options
});
}

public duplicateName3<ThrowOnError extends boolean = false>(options?: Options<DuplicateName3Data, ThrowOnError>) {
return (options?.client ?? this.client).post<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/duplicate',
...options
});
}

public duplicateName4<ThrowOnError extends boolean = false>(options?: Options<DuplicateName4Data, ThrowOnError>) {
return (options?.client ?? this.client).put<unknown, unknown, ThrowOnError>({
url: '/api/v{api-version}/duplicate',
...options
});
}

public callWithNoContentResponse<ThrowOnError extends boolean = false>(options?: Options<CallWithNoContentResponseData, ThrowOnError>) {
return (options?.client ?? this.client).get<CallWithNoContentResponseResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/no-content',
...options
});
}

public callWithResponseAndNoContentResponse<ThrowOnError extends boolean = false>(options?: Options<CallWithResponseAndNoContentResponseData, ThrowOnError>) {
return (options?.client ?? this.client).get<CallWithResponseAndNoContentResponseResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/multiple-tags/response-and-no-content',
...options
});
}

public dummyA<ThrowOnError extends boolean = false>(options?: Options<DummyAData, ThrowOnError>) {
return (options?.client ?? this.client).get<DummyAResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/multiple-tags/a',
...options
});
}

public dummyB<ThrowOnError extends boolean = false>(options?: Options<DummyBData, ThrowOnError>) {
return (options?.client ?? this.client).get<DummyBResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/multiple-tags/b',
...options
});
}

public callWithResponse<ThrowOnError extends boolean = false>(options?: Options<CallWithResponseData, ThrowOnError>) {
return (options?.client ?? this.client).get<CallWithResponseResponses, unknown, ThrowOnError>({
url: '/api/v{api-version}/response',
...options
});
}

public callWithDuplicateResponses<ThrowOnError extends boolean = false>(options?: Options<CallWithDuplicateResponsesData, ThrowOnError>) {
return (options?.client ?? this.client).post<CallWithDuplicateResponsesResponses, CallWithDuplicateResponsesErrors, ThrowOnError>({
url: '/api/v{api-version}/response',
...options
});
}

public callWithResponses<ThrowOnError extends boolean = false>(options?: Options<CallWithResponsesData, ThrowOnError>) {
return (options?.client ?? this.client).put<CallWithResponsesResponses, CallWithResponsesErrors, ThrowOnError>({
url: '/api/v{api-version}/response',
...options
});
}

public collectionFormat<ThrowOnError extends boolean = false>(options: Options<CollectionFormatData, ThrowOnError>) {
return (options.client ?? this.client).get<unknown, unknown, ThrowOnError>({
querySerializer: {
array: {
explode: false,
style: 'form'
}
},
url: '/api/v{api-version}/collectionFormat',
...options
});
}

public types<ThrowOnError extends boolean = false>(options: Options<TypesData, ThrowOnError>) {
return (options.client ?? this.client).get<TypesResponses, unknown, ThrowOnError>({
querySerializer: {
array: {
explode: false,
style: 'form'
}
},
url: '/api/v{api-version}/types',
...options
});
}

public complexTypes<ThrowOnError extends boolean = false>(options: Options<ComplexTypesData, ThrowOnError>) {
return (options.client ?? this.client).get<ComplexTypesResponses, ComplexTypesErrors, ThrowOnError>({
url: '/api/v{api-version}/complex',
...options
});
}

public callWithResultFromHeader<ThrowOnError extends boolean = false>(options?: Options<CallWithResultFromHeaderData, ThrowOnError>) {
return (options?.client ?? this.client).post<CallWithResultFromHeaderResponses, CallWithResultFromHeaderErrors, ThrowOnError>({
url: '/api/v{api-version}/header',
...options
});
}

public testErrorCode<ThrowOnError extends boolean = false>(options: Options<TestErrorCodeData, ThrowOnError>) {
return (options.client ?? this.client).post<TestErrorCodeResponses, TestErrorCodeErrors, ThrowOnError>({
url: '/api/v{api-version}/error',
...options
});
}

public nonAsciiæøåÆøÅöôêÊ字符串<ThrowOnError extends boolean = false>(options: Options<NonAsciiæøåÆøÅöôêÊ字符串Data, ThrowOnError>) {
return (options.client ?? this.client).post<NonAsciiæøåÆøÅöôêÊ字符串Responses, unknown, ThrowOnError>({
url: '/api/v{api-version}/non-ascii-æøåÆØÅöôêÊ字符串',
...options
});
}

/**
* Body should not be unknown
* Body should not be unknown
*/
public postApiVbyApiVersionBody<ThrowOnError extends boolean = false>(options: Options<PostApiVbyApiVersionBodyData, ThrowOnError>) {
return (options.client ?? this.client).post<PostApiVbyApiVersionBodyResponses, PostApiVbyApiVersionBodyErrors, ThrowOnError>({
url: '/api/v{api-version}/body',
...options,
headers: {
'Content-Type': 'application/json',
...options.headers
}
});
}
}
Loading