diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index b150c6a..adaa024 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -23,6 +23,16 @@ export default defineNuxtConfig({ componentMeta: { debug: 2, exclude: [/node_modules/i], + overrides: { + TestComponent: { + props: { + name: { + name: 'name', + type: 'number' + } + } + } + }, metaSources: [ { TestExternalMeta: { diff --git a/src/module.ts b/src/module.ts index 7dda6b8..8e42f23 100644 --- a/src/module.ts +++ b/src/module.ts @@ -138,6 +138,7 @@ export default defineNuxtModule({ components: [], metaSources: {}, transformers, + overrides: options.overrides || {}, beforeWrite: async (schema: NuxtComponentMeta) => { return await nuxt.callHook('component-meta:schema' as any, schema) || schema } diff --git a/src/parser/meta-parser.ts b/src/parser/meta-parser.ts index 8e9c8f5..b7c41d1 100644 --- a/src/parser/meta-parser.ts +++ b/src/parser/meta-parser.ts @@ -17,6 +17,7 @@ export function useComponentMetaParser ( componentDirs = [], checkerOptions, exclude = [], + overrides = {}, transformers = [], debug = false, metaFields, @@ -201,7 +202,7 @@ export function useComponentMetaParser ( Object.assign( component.meta, - refineMeta(meta, metaFields), + refineMeta(meta, metaFields, overrides[component.pascalName] || {}), { hash: codeHash } diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 01df6dd..abcd45e 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -2,7 +2,7 @@ import { camelCase } from "scule" import type { ComponentMeta } from 'vue-component-meta' import type { ModuleOptions } from '../types/module' -export function refineMeta(meta: ComponentMeta, fields: ModuleOptions['metaFields'] = { type: true, props: true, slots: true, events: true, exposed: true }): ComponentMeta { +export function refineMeta(meta: ComponentMeta, fields: ModuleOptions['metaFields'] = { type: true, props: true, slots: true, events: true, exposed: true }, overrides: ModuleOptions['overrides'][string] = {}): ComponentMeta { const eventProps = new Set(meta.events.map((event :any) => camelCase(`on_${event.name}`))) const props = (fields.props ? meta.props : []) .filter((prop: any) => !prop.global && !eventProps.has(prop.name as string)) @@ -49,6 +49,19 @@ export function refineMeta(meta: ComponentMeta, fields: ModuleOptions['metaField removeFields(refinedMeta.props, ['schema']) } + for (const meta in overrides) { + const metaOverrides = overrides[meta as keyof typeof overrides] + const metaFields = refinedMeta[meta as keyof ComponentMeta] + if (Array.isArray(metaFields)) { + for (const fieldName in metaOverrides) { + const override = metaOverrides[fieldName] + const index = metaFields.findIndex((field: any) => field.name === fieldName) + if (index !== -1) { + metaFields[index] = override + } + } + } + } return refinedMeta } diff --git a/src/types/module.ts b/src/types/module.ts index 1bca2fa..3d1cfa1 100644 --- a/src/types/module.ts +++ b/src/types/module.ts @@ -1,6 +1,7 @@ import type { MetaCheckerOptions } from 'vue-component-meta' import type { ComponentsDir, ComponentsOptions } from '@nuxt/schema' import type { TransformersHookData, ExtendHookData, NuxtComponentMeta } from '.' +import type { JsonSchema } from './schema' export interface ModuleOptions { /** @@ -51,6 +52,31 @@ export interface ModuleOptions { * Filter all components that are not global. */ globalsOnly?: boolean, + overrides: { + [componentName: string]: { + props?: { + [propName: string]: { + "name": string, + "global"?: boolean, + "description"?: string, + "tags"?: Array<{ "name": string, "text": string }>, + "required"?: boolean, + "type": string, + "schema"?: JsonSchema, + "default"?: string + } + } + slots?: { + [slotName: string]: any + } + events?: { + [eventName: string]: any + } + exposed?: { + [exposedName: string]: any + } + } + } /** * Filter meta properties to be included in the output. */