3232 <div
3333 class =" px-4 py-3 border-b border-[var(--ui-border)] bg-[var(--ui-bg-muted)] flex items-center font-medium text-sm flex-shrink-0" >
3434 <Tabs
35+ v-if =" tabs.length"
3536 v-model =" activeTab"
3637 :tabs =" tabs"
3738 />
@@ -100,8 +101,10 @@ const swaggerJson = ref(`{
100101
101102const selectedPreset = ref (' axios' )
102103const selectedMode = ref (' ts' )
103- const activeTab = ref <' main' | ' type' >(' main' )
104- const generatedCode = ref <{ main? : string ; type? : string }>({})
104+ /** 当前选中的文件名,如 index.ts */
105+ const activeTab = ref (' index.ts' )
106+ /** 接口返回的文件列表,main 为 index.ts,type 为 index.type.ts 等 */
107+ const generatedFiles = ref <{ filename: string ; code: string }[]>([])
105108const highlighter = ref <Highlighter | null >(null )
106109
107110const isTanstackPreset = computed (() => selectedPreset .value === ' tanstackQuery' )
@@ -136,23 +139,16 @@ const modeOptions = computed(() => {
136139 return options
137140})
138141
139- const tabs = computed (() => {
140- const items = [
141- { value: ' main' , label: ' index.ts' },
142- ]
143- if (generatedCode .value .type ) {
144- items .push ({ value: ' type' , label: ' index.type.ts' })
145- }
146- return items
147- })
142+ const tabs = computed (() =>
143+ generatedFiles .value .map (file => ({
144+ value: file .filename ,
145+ label: file .filename ,
146+ })),
147+ )
148148
149- const activeCode = computed (() => {
150- if (activeTab .value === ' main' ) {
151- return generatedCode .value .main || ' '
152- } else {
153- return generatedCode .value .type || ' '
154- }
155- })
149+ const activeCode = computed (() =>
150+ generatedFiles .value .find (f => f .filename === activeTab .value )?.code ?? ' ' ,
151+ )
156152
157153const jsonHighlighted = computed (() => {
158154 if (! highlighter .value || ! swaggerJson .value .trim ()) {
@@ -168,7 +164,8 @@ const codeHighlighted = computed(() => {
168164 if (! highlighter .value || ! activeCode .value )
169165 return ' '
170166 const isTsLike = [' ts' , ' react' , ' vue' ].includes (selectedMode .value )
171- const lang = activeTab .value === ' type' ? ' typescript' : (isTsLike ? ' typescript' : ' javascript' )
167+ const isTypeFile = activeTab .value .endsWith (' .type.ts' )
168+ const lang = isTypeFile ? ' typescript' : (isTsLike ? ' typescript' : ' javascript' )
172169 return highlighter .value .codeToHtml (activeCode .value , {
173170 lang ,
174171 theme: theme .value ,
@@ -203,7 +200,7 @@ async function generateCode() {
203200
204201 JSON .parse (swaggerJson .value ) // validate JSON
205202
206- const response = await $fetch <{ main ? : string ; type ? : string ; error? : string }>(' /api/generate' , {
203+ const response = await $fetch <{ files ? : { filename : string ; code : string }[] ; error? : string }>(' /api/generate' , {
207204 method: ' POST' ,
208205 body: {
209206 swagger: swaggerJson .value ,
@@ -212,25 +209,18 @@ async function generateCode() {
212209 },
213210 })
214211
215- if (response .error ) {
212+ if (response .error || ! response . files ?. length ) {
216213 return
217214 }
218215
219- generatedCode .value = {
220- main: response .main || ' ' ,
221- type: response .type || ' ' ,
222- }
223-
224- // If type file exists, show main file by default
225- if (generatedCode .value .main ) {
226- activeTab .value = ' main'
227- }
216+ generatedFiles .value = response .files
217+ activeTab .value = response .files [0 ].filename
228218}
229219
230220function handleJsonChange() {
231221 // Auto-generate code
232222 if (! swaggerJson .value .trim ()) {
233- generatedCode .value = {}
223+ generatedFiles .value = []
234224 return
235225 }
236226 debouncedGenerateCode ()
0 commit comments