#!/usr/bin/env node
import fs from 'fs'
import path from 'path'
const componentName = process.argv[2]
const componentDir = `src/components/primitives/${componentName}`
if (!componentName) {
console.error('Usage: node scripts/generate-primitive.mjs ComponentName')
process.exit(1)
}
// Create directory
if (!fs.existsSync(componentDir)) {
fs.mkdirSync(componentDir, { recursive: true })
console.log(`✓ Created directory: ${componentDir}`)
}
// Create Vue component
const vueTemplate = `
`
const vueFile = path.join(componentDir, `${componentName}.vue`)
if (!fs.existsSync(vueFile)) {
fs.writeFileSync(vueFile, vueTemplate)
console.log(`✓ Created: ${vueFile}`)
}
// Create Storybook stories
const storiesTemplate = `import type { Meta, StoryObj } from '@storybook/vue3'
import ${componentName} from './${componentName}.vue'
const meta = {
title: 'Primitives/${componentName}',
component: ${componentName},
tags: ['autodocs']
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
args: {}
}
`
const storiesFile = path.join(componentDir, `${componentName}.stories.ts`)
if (!fs.existsSync(storiesFile)) {
fs.writeFileSync(storiesFile, storiesTemplate)
console.log(`✓ Created: ${storiesFile}`)
}
// Create unit tests
const specTemplate = `import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import ${componentName} from './${componentName}.vue'
describe('${componentName}', () => {
it('renders', () => {
const wrapper = mount(${componentName})
expect(wrapper.exists()).toBe(true)
})
})
`
const specFile = path.join(componentDir, `${componentName}.spec.ts`)
if (!fs.existsSync(specFile)) {
fs.writeFileSync(specFile, specTemplate)
console.log(`✓ Created: ${specFile}`)
}
console.log(`✓ Component "${componentName}" generated successfully!`)