@@ -9,21 +9,33 @@ import {
99} from './helpers' ;
1010import { createSchemaResolvers } from './schemaResolvers' ;
1111import { getDefaultsFromScriptSetup } from './scriptSetup' ;
12- import type { ComponentMeta , MetaCheckerOptions , PropertyMeta } from './types' ;
13-
14- const vnodeEventRegex = / ^ o n V n o d e [ A - Z ] / ;
12+ import type { ComponentMeta , MetaCheckerSchemaOptions , PropertyMeta } from './types' ;
1513
1614export function getComponentMeta (
1715 ts : typeof import ( 'typescript' ) ,
18- program : ts . Program ,
16+ typeChecker : ts . TypeChecker ,
1917 printer : ts . Printer ,
20- vueOptions : core . VueCompilerOptions ,
2118 language : core . Language < string > ,
22- sourceFile : ts . SourceFile ,
23- componentNode : ts . Expression ,
24- checkerOptions : MetaCheckerOptions ,
19+ componentNode : ts . Node ,
20+ componentType : ts . Type ,
21+ options : MetaCheckerSchemaOptions ,
22+ deprecatedOptions : { noDeclarations : boolean ; rawType : boolean } = { noDeclarations : true , rawType : false } ,
2523) : ComponentMeta {
26- const typeChecker = program . getTypeChecker ( ) ;
24+ const componentSymbol = typeChecker . getSymbolAtLocation ( componentNode ) ;
25+
26+ let componentFile = componentNode . getSourceFile ( ) ;
27+
28+ if ( componentSymbol ) {
29+ const symbol = componentSymbol . flags & ts . SymbolFlags . Alias
30+ ? typeChecker . getAliasedSymbol ( componentSymbol )
31+ : componentType . symbol ;
32+ const declaration = symbol ?. valueDeclaration ?? symbol ?. declarations ?. [ 0 ] ;
33+
34+ if ( declaration ) {
35+ componentFile = declaration . getSourceFile ( ) ;
36+ componentNode = declaration ;
37+ }
38+ }
2739
2840 let name : string | undefined ;
2941 let description : string | undefined ;
@@ -60,11 +72,11 @@ export function getComponentMeta(
6072 return meta ;
6173
6274 function getType ( ) {
63- return inferComponentType ( typeChecker , componentNode ) ?? 0 ;
75+ return inferComponentType ( componentType ) ?? 0 ;
6476 }
6577
6678 function getProps ( ) {
67- const propsType = inferComponentProps ( typeChecker , componentNode ) ;
79+ const propsType = inferComponentProps ( typeChecker , componentType ) ;
6880 if ( ! propsType ) {
6981 return [ ] ;
7082 }
@@ -79,36 +91,34 @@ export function getComponentMeta(
7991 . map ( prop => {
8092 const {
8193 resolveNestedProperties,
82- } = createSchemaResolvers ( ts , typeChecker , printer , language , componentNode , checkerOptions ) ;
94+ } = createSchemaResolvers ( ts , typeChecker , printer , language , options , deprecatedOptions ) ;
8395
8496 return resolveNestedProperties ( prop ) ;
8597 } )
86- . filter ( prop => ! vnodeEventRegex . test ( prop . name ) && ! eventProps . has ( prop . name ) ) ;
98+ . filter ( ( prop ) : prop is PropertyMeta => ! ! prop && ! eventProps . has ( prop . name ) ) ;
8799
88- // Merge default props from script setup
89- const defaults = getDefaultsFromScriptSetup ( ts , printer , language , sourceFile . fileName , vueOptions ) ;
100+ const defaults = getDefaultsFromScriptSetup ( ts , printer , language , componentFile . fileName ) ;
90101
91- if ( defaults ?. size ) {
92- for ( const prop of result ) {
93- if ( defaults . has ( prop . name ) ) {
94- prop . default = defaults . get ( prop . name ) ;
95- }
102+ for ( const prop of result ) {
103+ if ( prop . name . match ( / ^ o n V n o d e [ A - Z ] / ) ) {
104+ prop . name = 'onVue:' + prop . name [ 'onVnode' . length ] ?. toLowerCase ( ) + prop . name . slice ( 'onVnode' . length + 1 ) ;
96105 }
106+ prop . default ??= defaults ?. get ( prop . name ) ;
97107 }
98108
99109 return result ;
100110 }
101111
102112 function getEvents ( ) {
103- const emitType = inferComponentEmit ( typeChecker , componentNode ) ;
113+ const emitType = inferComponentEmit ( typeChecker , componentType ) ;
104114
105115 if ( emitType ) {
106116 const calls = emitType . getCallSignatures ( ) ;
107117
108118 return calls . map ( call => {
109119 const {
110120 resolveEventSignature,
111- } = createSchemaResolvers ( ts , typeChecker , printer , language , componentNode , checkerOptions ) ;
121+ } = createSchemaResolvers ( ts , typeChecker , printer , language , options , deprecatedOptions ) ;
112122
113123 return resolveEventSignature ( call ) ;
114124 } ) . filter ( event => event . name ) ;
@@ -118,15 +128,15 @@ export function getComponentMeta(
118128 }
119129
120130 function getSlots ( ) {
121- const slotsType = inferComponentSlots ( typeChecker , componentNode ) ;
131+ const slotsType = inferComponentSlots ( typeChecker , componentType ) ;
122132
123133 if ( slotsType ) {
124134 const properties = slotsType . getProperties ( ) ;
125135
126136 return properties . map ( prop => {
127137 const {
128138 resolveSlotProperties,
129- } = createSchemaResolvers ( ts , typeChecker , printer , language , componentNode , checkerOptions ) ;
139+ } = createSchemaResolvers ( ts , typeChecker , printer , language , options , deprecatedOptions ) ;
130140
131141 return resolveSlotProperties ( prop ) ;
132142 } ) ;
@@ -136,10 +146,10 @@ export function getComponentMeta(
136146 }
137147
138148 function getExposed ( ) {
139- const exposedType = inferComponentExposed ( typeChecker , componentNode ) ;
149+ const exposedType = inferComponentExposed ( typeChecker , componentType ) ;
140150
141151 if ( exposedType ) {
142- const propsType = inferComponentProps ( typeChecker , componentNode ) ;
152+ const propsType = inferComponentProps ( typeChecker , componentType ) ;
143153 const propsProperties = propsType ?. getProperties ( ) ?? [ ] ;
144154 const properties = exposedType . getProperties ( ) . filter ( prop =>
145155 // only exposed props will have at least one declaration and no valueDeclaration
@@ -154,7 +164,7 @@ export function getComponentMeta(
154164 return properties . map ( prop => {
155165 const {
156166 resolveExposedProperties,
157- } = createSchemaResolvers ( ts , typeChecker , printer , language , componentNode , checkerOptions ) ;
167+ } = createSchemaResolvers ( ts , typeChecker , printer , language , options , deprecatedOptions ) ;
158168
159169 return resolveExposedProperties ( prop ) ;
160170 } ) ;
@@ -167,9 +177,9 @@ export function getComponentMeta(
167177 let decl = componentNode ;
168178
169179 // const __VLS_export = ...
170- const text = sourceFile . text . slice ( decl . pos , decl . end ) ;
180+ const text = componentFile . text . slice ( decl . pos , decl . end ) ;
171181 if ( text . includes ( core . names . _export ) ) {
172- ts . forEachChild ( sourceFile , child2 => {
182+ ts . forEachChild ( componentFile , child2 => {
173183 if ( ts . isVariableStatement ( child2 ) ) {
174184 for ( const { name, initializer } of child2 . declarationList . declarations ) {
175185 if ( name . getText ( ) === core . names . _export && initializer ) {
@@ -180,7 +190,7 @@ export function getComponentMeta(
180190 } ) ;
181191 }
182192
183- return core . parseOptionsFromExtression ( ts , decl , sourceFile ) ?. name ?. node . text ;
193+ return core . parseOptionsFromExtression ( ts , decl , componentFile ) ?. name ?. node . text ;
184194 }
185195
186196 function getDescription ( ) {
0 commit comments