diff --git a/dev/openapi-ts.config.ts b/dev/openapi-ts.config.ts index 2bd71dca0..e391a6546 100644 --- a/dev/openapi-ts.config.ts +++ b/dev/openapi-ts.config.ts @@ -47,8 +47,8 @@ export default defineConfig(() => { // 'full.yaml', // 'sdk-method-class-conflict.yaml', // 'object-property-names.yaml', - // 'openai.yaml', - 'opencode.yaml', + 'openai.yaml', + // 'opencode.yaml', // 'pagination-ref.yaml', // 'sdk-instance.yaml', // 'sdk-nested-classes.yaml', @@ -106,6 +106,10 @@ export default defineConfig(() => { // importFileExtension: '.js', // indexFile: false, // lint: 'eslint', + nameConflictResolver({ attempt, baseName }) { + console.log('resolving conflict for:', { attempt, baseName }); + return attempt === 0 ? baseName : `${baseName}_N${attempt + 1}`; + }, path: path.resolve(__dirname, '.gen'), preferExportAll: true, resolveModuleName: (moduleName) => { diff --git a/packages/codegen-core/src/__tests__/exports.test.ts b/packages/codegen-core/src/__tests__/exports.test.ts index b8f54bbfc..94aa02c71 100644 --- a/packages/codegen-core/src/__tests__/exports.test.ts +++ b/packages/codegen-core/src/__tests__/exports.test.ts @@ -39,6 +39,7 @@ export type _TypeExports = [ index.ImportMember, index.ImportModule, index.Language, + index.NameConflictResolver, index.NameConflictResolvers, index.Node, index.Output, diff --git a/packages/codegen-core/src/index.ts b/packages/codegen-core/src/index.ts index f4a235156..307b70a74 100644 --- a/packages/codegen-core/src/index.ts +++ b/packages/codegen-core/src/index.ts @@ -26,7 +26,10 @@ export { simpleNameConflictResolver, underscoreNameConflictResolver, } from './planner/resolvers'; -export type { IAnalysisContext as AnalysisContext } from './planner/types'; +export type { + IAnalysisContext as AnalysisContext, + NameConflictResolver, +} from './planner/types'; export { Project } from './project/project'; export type { IProject } from './project/types'; export { fromRef, fromRefs, isRef, ref, refs } from './refs/refs'; diff --git a/packages/openapi-ts/src/ir/context.ts b/packages/openapi-ts/src/ir/context.ts index adcb261a6..416a10b93 100644 --- a/packages/openapi-ts/src/ir/context.ts +++ b/packages/openapi-ts/src/ir/context.ts @@ -1,4 +1,4 @@ -import { Project, simpleNameConflictResolver } from '@hey-api/codegen-core'; +import { Project } from '@hey-api/codegen-core'; import type { Package } from '~/config/utils/package'; import { packageFactory } from '~/config/utils/package'; @@ -68,11 +68,9 @@ export class Context = any> { spec: Spec; }) { this.config = config; + // TODO: allow overriding via config this.gen = new Project({ defaultFileName: 'index', - defaultNameConflictResolver(args) { - return simpleNameConflictResolver(args); - }, fileName: (base) => { const name = buildName({ config: config.output.fileName, @@ -86,10 +84,11 @@ export class Context = any> { ? name : `${name}${suffix}`; }, - nameConflictResolvers: { - // TODO: allow overriding via config - }, - // TODO: allow overriding via config + nameConflictResolvers: config.output.nameConflictResolver + ? { + typescript: config.output.nameConflictResolver, + } + : undefined, renderers: [ new TypeScriptRenderer({ preferExportAll: config.output.preferExportAll, diff --git a/packages/openapi-ts/src/types/output.d.ts b/packages/openapi-ts/src/types/output.d.ts index ee03a8f9d..471bda9ef 100644 --- a/packages/openapi-ts/src/types/output.d.ts +++ b/packages/openapi-ts/src/types/output.d.ts @@ -1,3 +1,4 @@ +import type { NameConflictResolver } from '@hey-api/codegen-core'; import type ts from 'typescript'; import type { StringCase, StringName } from './case'; @@ -89,6 +90,11 @@ export type UserOutput = { * @default null */ lint?: Linters | null; + /** + * Optional name conflict resolver to customize how naming conflicts + * are handled. + */ + nameConflictResolver?: NameConflictResolver; /** * The absolute path to the output folder. */ @@ -178,6 +184,11 @@ export type Output = { * Which linter to use to process output folder? */ lint: Linters | null; + /** + * Optional name conflict resolver to customize how naming conflicts + * are handled. + */ + nameConflictResolver: NameConflictResolver | undefined; /** * The absolute path to the output folder. */