Skip to content

Commit 8ce51dd

Browse files
authored
feat: add parsed hook (#29)
1 parent 8fca9e4 commit 8ce51dd

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/module.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { readFile } from 'fs/promises'
22
import { defineNuxtModule, resolveModule, createResolver, addServerHandler } from '@nuxt/kit'
33
import { parseComponent } from './utils/parseComponent'
4+
import type { ComponentProp, ComponentSlot, HookData } from './types'
45

56
export interface ModuleOptions {}
67

8+
export interface ModuleHooks {
9+
'component-meta:parsed'(data: HookData): void
10+
}
11+
712
export default defineNuxtModule<ModuleOptions>({
813
meta: {
914
name: 'nuxt-component-meta',
@@ -16,17 +21,28 @@ export default defineNuxtModule<ModuleOptions>({
1621
nuxt.hook('components:extend', async (components) => {
1722
componentMeta = await Promise.all(
1823
components.map(async (component) => {
19-
const name = (component as any).pascalName
2024
const path = resolveModule((component as any).filePath, { paths: nuxt.options.rootDir })
2125
const source = await readFile(path, { encoding: 'utf-8' })
2226

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
2936
}
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
3046
})
3147
)
3248
})

src/types.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,18 @@ export interface ComponentProp {
1212
values?: any,
1313
description?: string
1414
}
15+
16+
export interface ComponentSlot {
17+
name: string
18+
}
19+
20+
export interface HookData {
21+
meta: {
22+
name: string
23+
global: boolean
24+
props: ComponentProp[]
25+
slots: ComponentSlot[]
26+
}
27+
path: string
28+
source: string
29+
}

0 commit comments

Comments
 (0)