1
1
import type { ScriptSetupRanges } from '../../parsers/scriptSetupRanges' ;
2
- import type { Code , Sfc } from '../../types' ;
2
+ import type { Code , Sfc , TextRange } from '../../types' ;
3
3
import { endOfLine , generateSfcBlockSection , newLine } from '../common' ;
4
4
import { generateComponent , generateEmitsOption } from './component' ;
5
5
import type { ScriptCodegenContext } from './context' ;
@@ -88,16 +88,16 @@ export function* generateScriptSetup(
88
88
89
89
if ( ctx . scriptSetupGeneratedOffset !== undefined ) {
90
90
for ( const defineProp of scriptSetupRanges . defineProp ) {
91
- if ( ! defineProp . name ) {
91
+ if ( ! defineProp . localName ) {
92
92
continue ;
93
93
}
94
- const propName = scriptSetup . content . substring ( defineProp . name . start , defineProp . name . end ) ;
95
- const propMirror = definePropMirrors . get ( propName ) ;
94
+ const [ _ , localName ] = getPropAndLocalName ( scriptSetup , defineProp ) ;
95
+ const propMirror = definePropMirrors . get ( localName ! ) ;
96
96
if ( propMirror !== undefined ) {
97
97
options . linkedCodeMappings . push ( {
98
- sourceOffsets : [ defineProp . name . start + ctx . scriptSetupGeneratedOffset ] ,
98
+ sourceOffsets : [ defineProp . localName . start + ctx . scriptSetupGeneratedOffset ] ,
99
99
generatedOffsets : [ propMirror ] ,
100
- lengths : [ defineProp . name . end - defineProp . name . start ] ,
100
+ lengths : [ defineProp . localName . end - defineProp . localName . start ] ,
101
101
data : undefined ,
102
102
} ) ;
103
103
}
@@ -302,14 +302,19 @@ function* generateComponentProps(
302
302
yield `const __VLS_defaults = {${ newLine } ` ;
303
303
for ( const defineProp of scriptSetupRanges . defineProp ) {
304
304
if ( defineProp . defaultValue ) {
305
- if ( defineProp . name ) {
306
- yield scriptSetup . content . substring ( defineProp . name . start , defineProp . name . end ) ;
305
+ const [ propName , localName ] = getPropAndLocalName ( scriptSetup , defineProp ) ;
306
+
307
+ if ( defineProp . name || defineProp . isModel ) {
308
+ yield propName ! ;
309
+ }
310
+ else if ( defineProp . localName ) {
311
+ yield localName ! ;
307
312
}
308
313
else {
309
- yield `modelValue` ;
314
+ continue ;
310
315
}
311
316
yield `: ` ;
312
- yield scriptSetup . content . substring ( defineProp . defaultValue . start , defineProp . defaultValue . end ) ;
317
+ yield getRangeName ( scriptSetup , defineProp . defaultValue ) ;
313
318
yield `,${ newLine } ` ;
314
319
}
315
320
}
@@ -331,33 +336,35 @@ function* generateComponentProps(
331
336
ctx . generatedPropsType = true ;
332
337
yield `{${ newLine } ` ;
333
338
for ( const defineProp of scriptSetupRanges . defineProp ) {
334
- let propName = 'modelValue' ;
335
- if ( defineProp . name && defineProp . nameIsString ) {
339
+ const [ propName , localName ] = getPropAndLocalName ( scriptSetup , defineProp ) ;
340
+
341
+ if ( defineProp . isModel && ! defineProp . name ) {
342
+ yield propName ! ;
343
+ }
344
+ else if ( defineProp . name ) {
336
345
// renaming support
337
346
yield generateSfcBlockSection ( scriptSetup , defineProp . name . start , defineProp . name . end , codeFeatures . navigation ) ;
338
- propName = scriptSetup . content . substring ( defineProp . name . start , defineProp . name . end ) ;
339
- propName = propName . replace ( / [ ' " ] + / g, '' ) ;
340
347
}
341
- else if ( defineProp . name ) {
342
- propName = scriptSetup . content . substring ( defineProp . name . start , defineProp . name . end ) ;
343
- definePropMirrors . set ( propName , options . getGeneratedLength ( ) ) ;
344
- yield propName ;
348
+ else if ( defineProp . localName ) {
349
+ definePropMirrors . set ( localName ! , options . getGeneratedLength ( ) ) ;
350
+ yield localName ! ;
345
351
}
346
352
else {
347
- yield propName ;
353
+ continue ;
348
354
}
355
+
349
356
yield defineProp . required
350
357
? `: `
351
358
: `?: ` ;
352
- yield * generateDefinePropType ( scriptSetup , propName , defineProp ) ;
359
+ yield * generateDefinePropType ( scriptSetup , propName , localName , defineProp ) ;
353
360
yield `,${ newLine } ` ;
354
361
355
362
if ( defineProp . modifierType ) {
356
363
let propModifierName = 'modelModifiers' ;
357
364
if ( defineProp . name ) {
358
- propModifierName = `${ scriptSetup . content . substring ( defineProp . name . start + 1 , defineProp . name . end - 1 ) } Modifiers` ;
365
+ propModifierName = `${ getRangeName ( scriptSetup , defineProp . name , true ) } Modifiers` ;
359
366
}
360
- const modifierType = scriptSetup . content . substring ( defineProp . modifierType . start , defineProp . modifierType . end ) ;
367
+ const modifierType = getRangeName ( scriptSetup , defineProp . modifierType ) ;
361
368
definePropMirrors . set ( propModifierName , options . getGeneratedLength ( ) ) ;
362
369
yield `${ propModifierName } ?: Record<${ modifierType } , true>,${ endOfLine } ` ;
363
370
}
@@ -394,13 +401,10 @@ function* generateModelEmits(
394
401
continue ;
395
402
}
396
403
397
- let propName = 'modelValue' ;
398
- if ( defineProp . name ) {
399
- propName = scriptSetup . content . substring ( defineProp . name . start , defineProp . name . end ) ;
400
- propName = propName . replace ( / [ ' " ] + / g, '' ) ;
401
- }
404
+ const [ propName , localName ] = getPropAndLocalName ( scriptSetup , defineProp ) ;
405
+
402
406
yield `'update:${ propName } ': [${ propName } :` ;
403
- yield * generateDefinePropType ( scriptSetup , propName , defineProp ) ;
407
+ yield * generateDefinePropType ( scriptSetup , propName , localName , defineProp ) ;
404
408
yield `]${ endOfLine } ` ;
405
409
}
406
410
yield `}` ;
@@ -413,20 +417,52 @@ function* generateModelEmits(
413
417
yield endOfLine ;
414
418
}
415
419
416
- function * generateDefinePropType ( scriptSetup : NonNullable < Sfc [ 'scriptSetup' ] > , propName : string , defineProp : ScriptSetupRanges [ 'defineProp' ] [ number ] ) {
420
+ function * generateDefinePropType (
421
+ scriptSetup : NonNullable < Sfc [ 'scriptSetup' ] > ,
422
+ propName : string | undefined ,
423
+ localName : string | undefined ,
424
+ defineProp : ScriptSetupRanges [ 'defineProp' ] [ number ]
425
+ ) {
417
426
if ( defineProp . type ) {
418
427
// Infer from defineProp<T>
419
- yield scriptSetup . content . substring ( defineProp . type . start , defineProp . type . end ) ;
428
+ yield getRangeName ( scriptSetup , defineProp . type ) ;
420
429
}
421
- else if ( ( defineProp . name && defineProp . nameIsString ) || ! defineProp . nameIsString ) {
430
+ else if ( defineProp . runtimeType && localName ) {
422
431
// Infer from actual prop declaration code
423
- yield `typeof ${ propName } ['value']` ;
432
+ yield `typeof ${ localName } ['value']` ;
424
433
}
425
- else if ( defineProp . defaultValue ) {
434
+ else if ( defineProp . defaultValue && propName ) {
426
435
// Infer from defineProp({default: T})
427
436
yield `typeof __VLS_defaults['${ propName } ']` ;
428
437
}
429
438
else {
430
439
yield `any` ;
431
440
}
432
441
}
442
+
443
+ function getPropAndLocalName (
444
+ scriptSetup : NonNullable < Sfc [ 'scriptSetup' ] > ,
445
+ defineProp : ScriptSetupRanges [ 'defineProp' ] [ number ]
446
+ ) {
447
+ const localName = defineProp . localName
448
+ ? getRangeName ( scriptSetup , defineProp . localName )
449
+ : undefined ;
450
+ let propName = defineProp . name
451
+ ? getRangeName ( scriptSetup , defineProp . name )
452
+ : defineProp . isModel
453
+ ? 'modelValue'
454
+ : localName ;
455
+ if ( defineProp . name ) {
456
+ propName = propName ! . replace ( / [ ' " ] + / g, '' )
457
+ }
458
+ return [ propName , localName ] ;
459
+ }
460
+
461
+ function getRangeName (
462
+ scriptSetup : NonNullable < Sfc [ 'scriptSetup' ] > ,
463
+ range : TextRange ,
464
+ unwrap = false
465
+ ) {
466
+ const offset = unwrap ? 1 : 0 ;
467
+ return scriptSetup . content . substring ( range . start + offset , range . end - offset ) ;
468
+ }
0 commit comments