Skip to content

Commit 52eee5c

Browse files
authored
feat: add extendComponentMeta (#73)
1 parent e892375 commit 52eee5c

File tree

5 files changed

+20
-2
lines changed

5 files changed

+20
-2
lines changed

Diff for: src/parser.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type { Component } from '@nuxt/schema'
88
import { resolvePathSync } from 'mlly'
99
import type { ModuleOptions } from './options'
1010
import type { NuxtComponentMeta } from './types'
11+
import { defu } from 'defu'
1112

1213
export type ComponentMetaParserOptions = Omit<ModuleOptions, 'components' | 'metaSources'> & {
1314
components: Component[]
@@ -210,6 +211,12 @@ export function useComponentMetaParser (
210211
component.meta.exposed = component.meta.exposed.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true))
211212
component.meta.events = component.meta.events.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true))
212213

214+
215+
const content = await readFile(component.fullPath, 'utf-8')
216+
const extendComponentMetaMatch = content.match(/extendComponentMeta\((\{[\s\S]*?\})\)/);
217+
const extendedComponentMeta = extendComponentMetaMatch?.length ? eval(`(${extendComponentMetaMatch[1]})`) : null
218+
component.meta = defu(component.meta, extendedComponentMeta)
219+
213220
// Remove descriptional fileds to reduce chunk size
214221
removeFields(component.meta, ['declarations'])
215222

@@ -260,7 +267,6 @@ function removeFields(obj: Record<string, any>, fieldsToRemove: string[]): any {
260267
}
261268
}
262269
}
263-
264270
return obj;
265271
}
266272

Diff for: src/runtime/composables/extendComponentMeta.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export function extendComponentMeta(_meta: Record<string, any>) { /* Placeholder for extending component meta */ }

Diff for: test/fixtures/basic/components/TestComponent.vue

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
</template>
88

99
<script setup>
10+
11+
extendComponentMeta({
12+
hello: 'world',
13+
foo: 'bar'
14+
})
15+
1016
defineProps({
1117
hello: {
1218
type: String,

Diff for: test/fixtures/basic/nuxt.config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import nuxtMetaModule from 'nuxt-component-meta'
1+
import nuxtMetaModule from '../../../src/module'
22

33
export default defineNuxtConfig({
44
components: {

Diff for: test/module.test.ts

+5
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,9 @@ describe('fixtures:basic', async () => {
7676
expect(component.meta.slots[0].name).toBe('title')
7777
expect(component.meta.slots[1].name).toBe('default')
7878
})
79+
80+
test('Test extendComponentMeta', async () => {
81+
const component = await $fetch('/api/component-meta/TestComponent')
82+
expect(component.meta).toMatchObject({ hello: 'world', foo: 'bar' })
83+
})
7984
})

0 commit comments

Comments
 (0)