import { Plugin } from 'vite'
|
|
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
|
|
export function generateComponentTypes(): Plugin {
|
|
return {
|
|
name: 'generate-component-types',
|
|
async buildStart() {
|
|
const componentsDir = path.resolve(process.cwd(), 'src/components')
|
|
const dtsPath = path.resolve(process.cwd(), 'src/components/components.d.ts')
|
|
|
|
// Get immediate subdirectories only
|
|
const directories = fs
|
|
.readdirSync(componentsDir, { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => dirent.name)
|
|
|
|
// Generate type definitions only for valid components
|
|
const typeDefinitions = directories
|
|
.filter((dir) => {
|
|
// Check if ComponentName/ComponentName.vue exists
|
|
const componentFile = path.join(componentsDir, dir, `${dir}.vue`)
|
|
return fs.existsSync(componentFile)
|
|
})
|
|
.map((dir) => {
|
|
return `${dir}: typeof import('./${dir}/${dir}.vue')['default']`
|
|
})
|
|
|
|
// Create the type definition file content
|
|
const content = `declare module 'vue' {
|
|
export interface GlobalComponents {
|
|
${typeDefinitions.join('\n')}
|
|
}
|
|
}
|
|
|
|
export {}`
|
|
|
|
// Write the type definition file
|
|
fs.writeFileSync(dtsPath, content, 'utf-8')
|
|
},
|
|
}
|
|
}
|