1
1
import { readFile } from 'fs/promises'
2
2
import { defineNuxtModule , resolveModule , createResolver , addServerHandler } from '@nuxt/kit'
3
3
import { parseComponent } from './utils/parseComponent'
4
+ import type { ComponentProp , ComponentSlot , HookData } from './types'
4
5
5
6
export interface ModuleOptions { }
6
7
8
+ export interface ModuleHooks {
9
+ 'component-meta:parsed' ( data : HookData ) : void
10
+ }
11
+
7
12
export default defineNuxtModule < ModuleOptions > ( {
8
13
meta : {
9
14
name : 'nuxt-component-meta' ,
@@ -16,17 +21,28 @@ export default defineNuxtModule<ModuleOptions>({
16
21
nuxt . hook ( 'components:extend' , async ( components ) => {
17
22
componentMeta = await Promise . all (
18
23
components . map ( async ( component ) => {
19
- const name = ( component as any ) . pascalName
20
24
const path = resolveModule ( ( component as any ) . filePath , { paths : nuxt . options . rootDir } )
21
25
const source = await readFile ( path , { encoding : 'utf-8' } )
22
26
23
- const { props, slots } = parseComponent ( name , source )
24
- return {
25
- name,
26
- global : Boolean ( component . global ) ,
27
- props,
28
- slots
27
+ const data : HookData = {
28
+ meta : {
29
+ name : ( component as any ) . pascalName ,
30
+ global : Boolean ( component . global ) ,
31
+ props : [ ] as ComponentProp [ ] ,
32
+ slots : [ ] as ComponentSlot [ ]
33
+ } ,
34
+ path,
35
+ source
29
36
}
37
+
38
+ const { props, slots } = parseComponent ( data . meta . name , source )
39
+ data . meta . props = props
40
+ data . meta . slots = slots
41
+
42
+ // @ts -ignore
43
+ await nuxt . callHook ( 'component-meta:parsed' , data )
44
+
45
+ return data . meta
30
46
} )
31
47
)
32
48
} )
0 commit comments