Skip to content
Draft
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/early-knives-kneel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hey-api/openapi-ts": patch
---

**client**: use `getBaseUrl()` function to determine default value
5 changes: 5 additions & 0 deletions .changeset/five-pianos-jump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hey-api/openapi-ts": patch
---

**plugin(@hey-api/examples)**: initial release
5 changes: 5 additions & 0 deletions .changeset/nasty-planes-cry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hey-api/shared": patch
---

**utils**: export `getBaseUrl()` function
3 changes: 3 additions & 0 deletions dev/inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@ const specsPath = path.join(__dirname, '..', 'specs');
export const inputs = {
circular: path.resolve(specsPath, '3.0.x', 'circular.yaml'),
full: path.resolve(specsPath, '3.1.x', 'full.yaml'),
heyapi: 'hey-api/backend',
local: 'http://localhost:8000/openapi.json',
mockers: path.resolve(specsPath, '3.1.x', 'mockers.yaml'),
opencode: path.resolve(specsPath, '3.1.x', 'opencode.yaml'),
petstore:
'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml',
redfish:
'https://raw.githubusercontent.com/DMTF/Redfish-Publications/refs/heads/main/openapi/openapi.yaml',
rpc: path.resolve(specsPath, '3.1.x', 'rpc.yaml'),
scalar: 'scalar:@scalar/access-service',
transformers: path.resolve(specsPath, '3.1.x', 'transformers.json'),
validators: path.resolve(specsPath, '3.1.x', 'validators.yaml'),
Expand Down
2 changes: 1 addition & 1 deletion packages/openapi-python/src/plugins/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export type PluginClientNames =
| '@hey-api/client-requests'
| '@hey-api/client-urllib3';

export type PluginMockNames = 'factory_boy' | 'faker' | 'mimesis';
export type PluginSourceNames = 'factory_boy' | 'faker' | 'mimesis';

export type PluginTransformerNames = never;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ import type { ClientOptions as ClientOptions2 } from './types.gen';
*/
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;

export const client = createClient(createConfig<ClientOptions2>());
export const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'api.postmarkapp.com/' }));
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ import type { ClientOptions as ClientOptions2 } from './types.gen';
*/
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;

export const client = createClient(createConfig<ClientOptions2>());
export const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'foo.com' }));
4 changes: 2 additions & 2 deletions packages/openapi-ts-tests/orpc/v1/test/3.0.x.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ describe(`OpenAPI ${version}`, () => {
const scenarios = [
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'default',
plugins: ['orpc', 'zod'],
}),
description: 'generate oRPC contracts with Zod schemas',
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'custom-names',
plugins: [
'valibot',
Expand Down
12 changes: 6 additions & 6 deletions packages/openapi-ts-tests/orpc/v1/test/3.1.x.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ describe(`OpenAPI ${version}`, () => {
const scenarios = [
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'default',
plugins: ['orpc', 'zod'],
}),
description: 'generate oRPC contracts with Zod schemas',
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'custom-names',
plugins: [
'valibot',
Expand All @@ -42,7 +42,7 @@ describe(`OpenAPI ${version}`, () => {
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'contracts-strategy-by-tags',
plugins: [
'zod',
Expand All @@ -58,7 +58,7 @@ describe(`OpenAPI ${version}`, () => {
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'contracts-strategy-single',
plugins: [
'zod',
Expand All @@ -75,7 +75,7 @@ describe(`OpenAPI ${version}`, () => {
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'contracts-nesting-id',
plugins: [
'zod',
Expand All @@ -92,7 +92,7 @@ describe(`OpenAPI ${version}`, () => {
},
{
config: createConfig({
input: 'orpc.yaml',
input: 'rpc.yaml',
output: 'contracts-custom-naming',
plugins: [
'zod',
Expand Down
7 changes: 7 additions & 0 deletions packages/openapi-ts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ declare module '@hey-api/codegen-core' {
| 'arktype'
| 'fastify'
| 'json-schema'
| 'msw'
| 'sdk'
| 'typescript'
| 'valibot'
Expand All @@ -67,6 +68,7 @@ declare module '@hey-api/shared' {
'@hey-api/client-next': Plugins.HeyApiClientNext.Types['Types'];
'@hey-api/client-nuxt': Plugins.HeyApiClientNuxt.Types['Types'];
'@hey-api/client-ofetch': Plugins.HeyApiClientOfetch.Types['Types'];
'@hey-api/examples': Plugins.HeyApiExamples.Types['Types'];
'@hey-api/schemas': Plugins.HeyApiSchemas.Types['Types'];
'@hey-api/sdk': Plugins.HeyApiSdk.Types['Types'];
'@hey-api/transformers': Plugins.HeyApiTransformers.Types['Types'];
Expand Down Expand Up @@ -126,6 +128,7 @@ import type {
HeyApiClientOfetchPlugin,
OfetchClient as OfetchClientImp,
} from './plugins/@hey-api/client-ofetch';
import type { HeyApiExamplesPlugin } from './plugins/@hey-api/examples';
import type { HeyApiSchemasPlugin } from './plugins/@hey-api/schemas';
import type { HeyApiSdkPlugin } from './plugins/@hey-api/sdk';
import type { HeyApiTransformersPlugin } from './plugins/@hey-api/transformers';
Expand Down Expand Up @@ -247,6 +250,10 @@ export namespace Plugins {
export type Types = HeyApiClientOfetchPlugin;
}

export namespace HeyApiExamples {
export type Types = HeyApiExamplesPlugin;
}

export namespace HeyApiSchemas {
export type Types = HeyApiSchemasPlugin;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/openapi-ts/src/plugins/@faker-js/faker/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const defaultConfig: FakerJsFakerPlugin['Config'] = {
value: plugin.config.definitions,
});
},
tags: ['mocker'],
tags: ['source'],
};

/**
Expand Down
47 changes: 7 additions & 40 deletions packages/openapi-ts/src/plugins/@hey-api/client-core/client.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,11 @@
import { parseUrl } from '@hey-api/shared';
import { getBaseUrl } from '@hey-api/shared';

import { getTypedConfig } from '../../../config/utils';
import { clientFolderAbsolutePath } from '../../../generate/client';
import { $ } from '../../../ts-dsl';
import type { PluginHandler } from './types';
import { getClientBaseUrlKey } from './utils';

const resolveBaseUrlString = ({ plugin }: Parameters<PluginHandler>[0]): string | undefined => {
const { baseUrl } = plugin.config;

if (baseUrl === false) {
return;
}

if (typeof baseUrl === 'string') {
return baseUrl;
}

const { servers } = plugin.context.ir;

if (!servers) {
return;
}

return servers[typeof baseUrl === 'number' ? baseUrl : 0]?.url;
};

export const createClient: PluginHandler = ({ plugin }) => {
const clientModule = clientFolderAbsolutePath(getTypedConfig(plugin));
const symbolCreateClient = plugin.symbol('createClient', {
Expand All @@ -47,26 +27,13 @@ export const createClient: PluginHandler = ({ plugin }) => {
})
: undefined;

const defaultVals = $.object();
const baseUrl = getBaseUrl(plugin.config.baseUrl ?? true, plugin.context.ir);

const resolvedBaseUrl = resolveBaseUrlString({
plugin: plugin as any,
});
if (resolvedBaseUrl) {
const url = parseUrl(resolvedBaseUrl);
if (url.protocol && url.host && !resolvedBaseUrl.includes('{')) {
defaultVals.prop(getClientBaseUrlKey(getTypedConfig(plugin)), $.literal(resolvedBaseUrl));
} else if (resolvedBaseUrl !== '/' && resolvedBaseUrl.startsWith('/')) {
const baseUrl = resolvedBaseUrl.endsWith('/')
? resolvedBaseUrl.slice(0, -1)
: resolvedBaseUrl;
defaultVals.prop(getClientBaseUrlKey(getTypedConfig(plugin)), $.literal(baseUrl));
}
}

if ('throwOnError' in plugin.config && plugin.config.throwOnError) {
defaultVals.prop('throwOnError', $.literal(true));
}
const defaultVals = $.object()
.$if(baseUrl, (o, v) => o.prop(getClientBaseUrlKey(getTypedConfig(plugin)), $.literal(v)))
.$if('throwOnError' in plugin.config && plugin.config.throwOnError, (o) =>
o.prop('throwOnError', $.literal(true)),
);

const createConfigParameters = [
$(symbolCreateConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { clientFolderAbsolutePath } from '../../../generate/client';
import { $ } from '../../../ts-dsl';
import type { PluginHandler } from './types';

export const createClientConfigType = ({ plugin }: Parameters<PluginHandler>[0]) => {
export function createClientConfigType({ plugin }: Parameters<PluginHandler>[0]) {
const clientModule = clientFolderAbsolutePath(getTypedConfig(plugin));
const symbolClientOptions = plugin.referenceSymbol({
category: 'type',
Expand Down Expand Up @@ -47,4 +47,4 @@ export const createClientConfigType = ({ plugin }: Parameters<PluginHandler>[0])
),
);
plugin.node(typeCreateClientConfig);
};
}
25 changes: 25 additions & 0 deletions packages/openapi-ts/src/plugins/@hey-api/examples/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { definePluginConfig } from '@hey-api/shared';

import { handler } from './plugin';
import type { HeyApiExamplesPlugin } from './types';

export const defaultConfig: HeyApiExamplesPlugin['Config'] = {
config: {
case: 'camelCase',
includeInEntry: false,
},
handler,
name: '@hey-api/examples',
resolveConfig: (plugin, context) => {
plugin.config.case = context.valueToObject({
defaultValue: 'camelCase' as const,
value: plugin.config.case,
});
},
tags: ['source'],
};

/**
* Type helper for `@hey-api/examples` plugin, returns {@link Plugin.Config} object
*/
export const defineConfig = definePluginConfig(defaultConfig);
2 changes: 2 additions & 0 deletions packages/openapi-ts/src/plugins/@hey-api/examples/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { defaultConfig, defineConfig } from './config';
export type { HeyApiExamplesPlugin } from './types';
Loading
Loading