From 00f06e838de8107e4a9e220566ca5aac4129ec0a Mon Sep 17 00:00:00 2001 From: Patrick Wilkes Date: Wed, 12 Mar 2025 20:47:46 +0100 Subject: [PATCH] feat: Add opeanapi-info plugin --- packages/openapi-ts/src/plugins/index.ts | 8 +++++-- .../openapi-ts/src/plugins/metadata/config.ts | 18 ++++++++++++++ .../openapi-ts/src/plugins/metadata/index.ts | 2 ++ .../openapi-ts/src/plugins/metadata/plugin.ts | 24 +++++++++++++++++++ .../src/plugins/metadata/types.d.ts | 10 ++++++++ packages/openapi-ts/src/plugins/types.d.ts | 1 + packages/openapi-ts/test/plugins.test.ts | 6 +++++ 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 packages/openapi-ts/src/plugins/metadata/config.ts create mode 100644 packages/openapi-ts/src/plugins/metadata/index.ts create mode 100644 packages/openapi-ts/src/plugins/metadata/plugin.ts create mode 100644 packages/openapi-ts/src/plugins/metadata/types.d.ts diff --git a/packages/openapi-ts/src/plugins/index.ts b/packages/openapi-ts/src/plugins/index.ts index d194d87c9..a6d9d9d8c 100644 --- a/packages/openapi-ts/src/plugins/index.ts +++ b/packages/openapi-ts/src/plugins/index.ts @@ -73,6 +73,7 @@ import { import { type Config as Fastify, defaultConfig as fastify } from './fastify'; import type { DefaultPluginConfigs, Plugin } from './types'; import { type Config as Zod, defaultConfig as zod } from './zod'; +import {type Config as OpenApiInfo, defaultConfig as openApiInfo} from './metadata' /** * User-facing plugin types. @@ -97,7 +98,8 @@ export type UserPlugins = | Plugin.UserConfig | Plugin.UserConfig | Plugin.UserConfig - | Plugin.UserConfig; + | Plugin.UserConfig + | Plugin.UserConfig; /** * Internal plugin types. @@ -122,7 +124,8 @@ export type ClientPlugins = | Plugin.Config | Plugin.Config | Plugin.Config - | Plugin.Config; + | Plugin.Config + | Plugin.Config; export const defaultPluginConfigs: DefaultPluginConfigs = { '@hey-api/client-axios': heyApiClientAxios, @@ -145,4 +148,5 @@ export const defaultPluginConfigs: DefaultPluginConfigs = { 'legacy/node': heyApiLegacyNode, 'legacy/xhr': heyApiLegacyXhr, zod, + 'openapi-info': openApiInfo, }; diff --git a/packages/openapi-ts/src/plugins/metadata/config.ts b/packages/openapi-ts/src/plugins/metadata/config.ts new file mode 100644 index 000000000..ed428c59a --- /dev/null +++ b/packages/openapi-ts/src/plugins/metadata/config.ts @@ -0,0 +1,18 @@ +import type { Plugin } from '../types'; +import { handler } from './plugin' +import type { Config } from './types'; + +export const defaultConfig: Plugin.Config = { + _handler: handler, + _handlerLegacy: () => {}, + name: 'openapi-info', + output: 'opeapi-info', +}; + +/** + * Type helper for `metadata` plugin, returns {@link Plugin.Config} object + */ +export const defineConfig: Plugin.DefineConfig = (config) => ({ + ...defaultConfig, + ...config, +}); diff --git a/packages/openapi-ts/src/plugins/metadata/index.ts b/packages/openapi-ts/src/plugins/metadata/index.ts new file mode 100644 index 000000000..3a85a1be8 --- /dev/null +++ b/packages/openapi-ts/src/plugins/metadata/index.ts @@ -0,0 +1,2 @@ +export { defaultConfig, defineConfig } from './config'; +export type { Config } from './types'; diff --git a/packages/openapi-ts/src/plugins/metadata/plugin.ts b/packages/openapi-ts/src/plugins/metadata/plugin.ts new file mode 100644 index 000000000..484387312 --- /dev/null +++ b/packages/openapi-ts/src/plugins/metadata/plugin.ts @@ -0,0 +1,24 @@ +import ts from 'typescript'; + +import type { Plugin } from '../types'; +import type { Config } from './types'; + +export const handler: Plugin.Handler = ({ context, plugin }) => { + const file = context.createFile({ + id: plugin.name, + path: plugin.output, + }); + + // Create const for every set info value + const { info } = context.spec; + Object.entries(info).forEach(([key, value]) => { + const stringLiteral = ts.factory.createStringLiteral(value); + const variableDeclaration = ts.factory.createVariableDeclaration(key, undefined, undefined, stringLiteral); + const node = ts.factory.createVariableStatement( + [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)], + ts.factory.createVariableDeclarationList([variableDeclaration], ts.NodeFlags.Const), + ); + // add node to file + file.add(node); + }); +}; diff --git a/packages/openapi-ts/src/plugins/metadata/types.d.ts b/packages/openapi-ts/src/plugins/metadata/types.d.ts new file mode 100644 index 000000000..71e58484e --- /dev/null +++ b/packages/openapi-ts/src/plugins/metadata/types.d.ts @@ -0,0 +1,10 @@ +import type { Plugin } from '../types'; + +export interface Config extends Plugin.Name<'openapi-info'> { + /** + * Name of the generated file. + * + * @default 'openapi-info' + */ + output?: string; +} diff --git a/packages/openapi-ts/src/plugins/types.d.ts b/packages/openapi-ts/src/plugins/types.d.ts index 4301b7f49..b2b232291 100644 --- a/packages/openapi-ts/src/plugins/types.d.ts +++ b/packages/openapi-ts/src/plugins/types.d.ts @@ -33,6 +33,7 @@ export type PluginNames = | '@tanstack/svelte-query' | '@tanstack/vue-query' | 'fastify' + | 'openapi-info' | PluginValidatorNames; export type AnyPluginName = PluginNames | (string & {}); diff --git a/packages/openapi-ts/test/plugins.test.ts b/packages/openapi-ts/test/plugins.test.ts index 45f1aa774..dc50800c7 100644 --- a/packages/openapi-ts/test/plugins.test.ts +++ b/packages/openapi-ts/test/plugins.test.ts @@ -243,6 +243,12 @@ for (const version of versions) { }), description: 'generate Zod schemas with Zod plugin', }, + { + config: createConfig({ + output: 'default', + plugins: ['openapi-info'] + }) + }, { config: createConfig({ input: 'type-format.yaml',