fork of hey-api/openapi-ts because I need some additional things

chore: expose name conflict resolver

Lubos b6afac90 3fc12399

+29 -11
+6 -2
dev/openapi-ts.config.ts
··· 47 47 // 'full.yaml', 48 48 // 'sdk-method-class-conflict.yaml', 49 49 // 'object-property-names.yaml', 50 - // 'openai.yaml', 51 - 'opencode.yaml', 50 + 'openai.yaml', 51 + // 'opencode.yaml', 52 52 // 'pagination-ref.yaml', 53 53 // 'sdk-instance.yaml', 54 54 // 'sdk-nested-classes.yaml', ··· 106 106 // importFileExtension: '.js', 107 107 // indexFile: false, 108 108 // lint: 'eslint', 109 + nameConflictResolver({ attempt, baseName }) { 110 + console.log('resolving conflict for:', { attempt, baseName }); 111 + return attempt === 0 ? baseName : `${baseName}_N${attempt + 1}`; 112 + }, 109 113 path: path.resolve(__dirname, '.gen'), 110 114 preferExportAll: true, 111 115 resolveModuleName: (moduleName) => {
+1
packages/codegen-core/src/__tests__/exports.test.ts
··· 39 39 index.ImportMember, 40 40 index.ImportModule, 41 41 index.Language, 42 + index.NameConflictResolver, 42 43 index.NameConflictResolvers, 43 44 index.Node, 44 45 index.Output,
+4 -1
packages/codegen-core/src/index.ts
··· 26 26 simpleNameConflictResolver, 27 27 underscoreNameConflictResolver, 28 28 } from './planner/resolvers'; 29 - export type { IAnalysisContext as AnalysisContext } from './planner/types'; 29 + export type { 30 + IAnalysisContext as AnalysisContext, 31 + NameConflictResolver, 32 + } from './planner/types'; 30 33 export { Project } from './project/project'; 31 34 export type { IProject } from './project/types'; 32 35 export { fromRef, fromRefs, isRef, ref, refs } from './refs/refs';
+7 -8
packages/openapi-ts/src/ir/context.ts
··· 1 - import { Project, simpleNameConflictResolver } from '@hey-api/codegen-core'; 1 + import { Project } from '@hey-api/codegen-core'; 2 2 3 3 import type { Package } from '~/config/utils/package'; 4 4 import { packageFactory } from '~/config/utils/package'; ··· 68 68 spec: Spec; 69 69 }) { 70 70 this.config = config; 71 + // TODO: allow overriding via config 71 72 this.gen = new Project({ 72 73 defaultFileName: 'index', 73 - defaultNameConflictResolver(args) { 74 - return simpleNameConflictResolver(args); 75 - }, 76 74 fileName: (base) => { 77 75 const name = buildName({ 78 76 config: config.output.fileName, ··· 86 84 ? name 87 85 : `${name}${suffix}`; 88 86 }, 89 - nameConflictResolvers: { 90 - // TODO: allow overriding via config 91 - }, 92 - // TODO: allow overriding via config 87 + nameConflictResolvers: config.output.nameConflictResolver 88 + ? { 89 + typescript: config.output.nameConflictResolver, 90 + } 91 + : undefined, 93 92 renderers: [ 94 93 new TypeScriptRenderer({ 95 94 preferExportAll: config.output.preferExportAll,
+11
packages/openapi-ts/src/types/output.d.ts
··· 1 + import type { NameConflictResolver } from '@hey-api/codegen-core'; 1 2 import type ts from 'typescript'; 2 3 3 4 import type { StringCase, StringName } from './case'; ··· 89 90 * @default null 90 91 */ 91 92 lint?: Linters | null; 93 + /** 94 + * Optional name conflict resolver to customize how naming conflicts 95 + * are handled. 96 + */ 97 + nameConflictResolver?: NameConflictResolver; 92 98 /** 93 99 * The absolute path to the output folder. 94 100 */ ··· 178 184 * Which linter to use to process output folder? 179 185 */ 180 186 lint: Linters | null; 187 + /** 188 + * Optional name conflict resolver to customize how naming conflicts 189 + * are handled. 190 + */ 191 + nameConflictResolver: NameConflictResolver | undefined; 181 192 /** 182 193 * The absolute path to the output folder. 183 194 */