#!/usr/bin/env node import fs from 'fs' import path from 'path' const storeName = process.argv[2] const storeType = process.argv[3] || 'default' if (!storeName) { console.error('Usage: node scripts/generate-store.mjs StoreName [type]') process.exit(1) } const storeDir = `src/stores/modules` const fileName = `${storeName.charAt(0).toLowerCase()}${storeName.slice(1)}.ts` if (!fs.existsSync(storeDir)) { fs.mkdirSync(storeDir, { recursive: true }) } // Store templates by type const templates = { default: `/** * Pinia Store: ${storeName} * State management for ${storeName.toLowerCase()}-related data */ import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const use${storeName}Store = defineStore('${fileName.replace('.ts', '')}', () => { // State const items = ref([]) const selectedItem = ref(null) const loading = ref(false) const error = ref(null) const filters = ref>({}) // Computed const itemCount = computed(() => items.value.length) const filteredItems = computed(() => items.value) // Actions const fetchItems = async (limit = 100, offset = 0) => { loading.value = true error.value = null try { // TODO: Call API endpoint // const response = await ${fileName.replace('.ts', '')}Api.list${storeName}({ limit, offset }) // items.value = response.data } catch (err) { error.value = (err as Error).message } finally { loading.value = false } } const fetchItemById = async (itemId: string) => { loading.value = true error.value = null try { // TODO: Call API endpoint // const response = await ${fileName.replace('.ts', '')}Api.get${storeName}(itemId) // selectedItem.value = response.data } catch (err) { error.value = (err as Error).message } finally { loading.value = false } } const createItem = async (payload: any) => { loading.value = true error.value = null try { // TODO: Call API endpoint // const response = await ${fileName.replace('.ts', '')}Api.create${storeName}(payload) // items.value.push(response.data) // selectedItem.value = response.data // return response.data } catch (err) { error.value = (err as Error).message throw err } finally { loading.value = false } } const updateItem = async (itemId: string, payload: any) => { loading.value = true error.value = null try { // TODO: Call API endpoint // const response = await ${fileName.replace('.ts', '')}Api.update${storeName}(itemId, payload) // const index = items.value.findIndex((i) => i.id === itemId) // if (index !== -1) items.value[index] = response.data // if (selectedItem.value?.id === itemId) selectedItem.value = response.data // return response.data } catch (err) { error.value = (err as Error).message throw err } finally { loading.value = false } } const deleteItem = async (itemId: string) => { loading.value = true error.value = null try { // TODO: Call API endpoint // await ${fileName.replace('.ts', '')}Api.delete${storeName}(itemId) // items.value = items.value.filter((i) => i.id !== itemId) // if (selectedItem.value?.id === itemId) selectedItem.value = null } catch (err) { error.value = (err as Error).message throw err } finally { loading.value = false } } const setFilter = (key: string, value: any) => { filters.value[key] = value } const clearFilters = () => { filters.value = {} } return { // State items, selectedItem, loading, error, filters, // Computed itemCount, filteredItems, // Actions fetchItems, fetchItemById, createItem, updateItem, deleteItem, setFilter, clearFilters } }) ` } const template = templates[storeType] || templates.default const storeFile = path.join(storeDir, fileName) if (!fs.existsSync(storeFile)) { fs.writeFileSync(storeFile, template) console.log(`✓ Created: ${storeFile}`) } else { console.log(`⚠ Already exists: ${storeFile}`) }