@appswave/rq-codegen 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +11 -7
- package/dist/bin/cli.js.map +1 -1
- package/package.json +2 -2
package/dist/bin/cli.js
CHANGED
|
@@ -241,14 +241,18 @@ async function loadConfigFromFile(configPath) {
|
|
|
241
241
|
}
|
|
242
242
|
if (ext === ".ts" || ext === ".mts") {
|
|
243
243
|
try {
|
|
244
|
-
const
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
244
|
+
const { createJiti } = await import("jiti");
|
|
245
|
+
const jiti = createJiti(import.meta.url, { interopDefault: true });
|
|
246
|
+
const mod2 = await jiti.import(configPath);
|
|
247
|
+
if (mod2 && typeof mod2 === "object" && "default" in mod2 && mod2.default) {
|
|
248
|
+
return mod2.default;
|
|
249
|
+
}
|
|
250
|
+
return mod2;
|
|
251
|
+
} catch (error) {
|
|
252
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
248
253
|
throw new Error(
|
|
249
254
|
`Failed to load TypeScript config: ${configPath}
|
|
250
|
-
|
|
251
|
-
And run with: NODE_OPTIONS="--import tsx" rq-codegen`
|
|
255
|
+
${message}`
|
|
252
256
|
);
|
|
253
257
|
}
|
|
254
258
|
}
|
|
@@ -1776,7 +1780,7 @@ function createCli() {
|
|
|
1776
1780
|
const program2 = new Command();
|
|
1777
1781
|
program2.name("rq-codegen").description(
|
|
1778
1782
|
"Config-driven code generator for React + TypeScript + React Query projects"
|
|
1779
|
-
).version("0.1.
|
|
1783
|
+
).version("0.1.1");
|
|
1780
1784
|
program2.command("init").description("Initialize rqgen.config.ts with auto-detected settings").option("--force", "Overwrite existing config file").action(runInit);
|
|
1781
1785
|
program2.argument("[generator]", "Generator to run (e.g., handler, page, feature)").action(runGenerate);
|
|
1782
1786
|
return program2;
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli.ts","../../src/commands/generate.ts","../../src/config/loader.ts","../../src/config/defaults.ts","../../src/config/schema.ts","../../src/core/engine.ts","../../src/core/helpers.ts","../../src/core/actions.ts","../../src/utils/string.ts","../../src/utils/fs.ts","../../src/core/template-resolver.ts","../../src/utils/validation.ts","../../src/generators/component-ui.ts","../../src/generators/component-shared.ts","../../src/generators/component-form.ts","../../src/generators/page.ts","../../src/generators/view.ts","../../src/generators/handler.ts","../../src/generators/query-hook.ts","../../src/generators/mutation-hook.ts","../../src/generators/types-dto.ts","../../src/generators/shared-hook.ts","../../src/generators/validation.ts","../../src/generators/feature.ts","../../src/generators/index.ts","../../src/commands/init.ts","../../bin/cli.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { runGenerate } from './commands/generate.js';\nimport { runInit } from './commands/init.js';\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('rq-codegen')\n .description(\n 'Config-driven code generator for React + TypeScript + React Query projects',\n )\n .version('0.1.0');\n\n program\n .command('init')\n .description('Initialize rqgen.config.ts with auto-detected settings')\n .option('--force', 'Overwrite existing config file')\n .action(runInit);\n\n // Default command: interactive generator selection or direct generator\n program\n .argument('[generator]', 'Generator to run (e.g., handler, page, feature)')\n .action(runGenerate);\n\n return program;\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { loadConfig } from '../config/loader.js';\nimport { executeActions, resetHandlebars } from '../core/engine.js';\nimport { getGenerators } from '../generators/index.js';\n\nexport async function runGenerate(generatorName?: string): Promise<void> {\n let config;\n\n try {\n config = await loadConfig();\n } catch (error) {\n console.error(\n chalk.red('Error loading config:'),\n error instanceof Error ? error.message : error,\n );\n console.log(chalk.yellow('Run \"rq-codegen init\" to create a config file.'));\n process.exit(1);\n }\n\n // Reset handlebars instance for fresh config\n resetHandlebars();\n\n const generators = getGenerators(config);\n\n // If no generator specified, show interactive menu\n if (!generatorName) {\n const choices = generators.map((g) => ({\n name: `${g.name.padEnd(18)} ${chalk.dim('—')} ${g.description}`,\n value: g.name,\n }));\n\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'What would you like to generate?',\n choices,\n },\n ]);\n\n generatorName = selected;\n }\n\n // Find the generator\n const generator = generators.find((g) => g.name === generatorName);\n\n if (!generator) {\n console.error(chalk.red(`Unknown generator: ${generatorName}`));\n console.log(\n chalk.yellow('Available generators:'),\n generators.map((g) => g.name).join(', '),\n );\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n Running: ${generator.name}\\n`));\n\n // Run prompts\n const prompts = generator.prompts(config);\n const answers = await inquirer.prompt(prompts as never);\n\n // Preprocess answers if needed\n const processedAnswers = generator.preprocess\n ? generator.preprocess(answers)\n : answers;\n\n // Get actions\n const actions = generator.actions(processedAnswers, config);\n\n // Execute actions\n const results = await executeActions(actions, processedAnswers, config);\n\n // Display results\n console.log('');\n for (const result of results) {\n switch (result.type) {\n case 'created':\n console.log(chalk.green(' CREATED'), result.message);\n break;\n case 'updated':\n console.log(chalk.blue(' UPDATED'), result.message);\n break;\n case 'skipped':\n console.log(chalk.yellow(' SKIPPED'), result.message);\n break;\n case 'failed':\n console.error(chalk.red(' FAILED'), result.message);\n break;\n }\n }\n\n const created = results.filter((r) => r.type === 'created').length;\n const updated = results.filter((r) => r.type === 'updated').length;\n const failed = results.filter((r) => r.type === 'failed').length;\n\n console.log('');\n if (failed > 0) {\n console.log(chalk.red(` ${failed} action(s) failed.`));\n }\n console.log(\n chalk.green(` Done! ${created} file(s) created, ${updated} barrel(s) updated.\\n`),\n );\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { DEFAULT_CONFIG } from './defaults.js';\nimport { configSchema } from './schema.js';\nimport type { RqCodegenConfig } from './types.js';\n\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceVal = source[key];\n const targetVal = target[key];\n\n if (sourceVal === undefined) continue;\n\n if (\n sourceVal !== null &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n targetVal !== null &&\n typeof targetVal === 'object' &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n ) as T[keyof T];\n } else {\n result[key] = sourceVal as T[keyof T];\n }\n }\n\n return result;\n}\n\nfunction detectAliasesFromTsConfig(projectRoot: string): Partial<RqCodegenConfig['aliases']> | null {\n const configFiles = ['tsconfig.app.json', 'tsconfig.json'];\n\n for (const configFile of configFiles) {\n const fullPath = path.resolve(projectRoot, configFile);\n if (!fs.existsSync(fullPath)) continue;\n\n try {\n const raw = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n const paths: Record<string, string[]> = raw.compilerOptions?.paths ?? {};\n return mapTsPathsToAliases(paths);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nfunction mapTsPathsToAliases(\n paths: Record<string, string[]>,\n): Partial<RqCodegenConfig['aliases']> {\n const aliases: Partial<RqCodegenConfig['aliases']> = {};\n\n const aliasMap: Record<string, keyof RqCodegenConfig['aliases']> = {\n 'api': 'api',\n 'components': 'components',\n 'hooks': 'hooks',\n 'app-types': 'types',\n 'types': 'types',\n 'utils': 'utils',\n 'contexts': 'contexts',\n 'constants': 'constants',\n 'views': 'views',\n 'pages': 'pages',\n 'validations': 'validations',\n 'assets': 'assets',\n 'routes': 'routes',\n 'hoc': 'hoc',\n 'app-config': 'appConfig',\n };\n\n for (const tsAlias of Object.keys(paths)) {\n const match = tsAlias.match(/^@([\\w-]+)/);\n if (!match) continue;\n\n const aliasName = match[1];\n const configKey = aliasMap[aliasName];\n if (configKey) {\n aliases[configKey] = tsAlias.replace('/*', '');\n }\n }\n\n return aliases;\n}\n\nasync function findConfigFile(projectRoot: string): Promise<string | null> {\n const candidates = [\n 'rqgen.config.ts',\n 'rqgen.config.mts',\n 'rqgen.config.js',\n 'rqgen.config.mjs',\n ];\n\n for (const candidate of candidates) {\n const fullPath = path.resolve(projectRoot, candidate);\n if (fs.existsSync(fullPath)) return fullPath;\n }\n\n // Check package.json for \"rqgen\" key\n const pkgPath = path.resolve(projectRoot, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.rqgen) return pkgPath;\n } catch {\n // ignore\n }\n }\n\n return null;\n}\n\nasync function loadConfigFromFile(configPath: string): Promise<Partial<RqCodegenConfig>> {\n const ext = path.extname(configPath);\n const basename = path.basename(configPath);\n\n if (basename === 'package.json') {\n const pkg = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n return pkg.rqgen ?? {};\n }\n\n if (ext === '.ts' || ext === '.mts') {\n // For TypeScript config files, we use tsx or ts-node via dynamic import\n // The user needs tsx installed for .ts config support\n try {\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return mod.default ?? mod;\n } catch {\n // If direct import fails, try reading as JSON-like\n throw new Error(\n `Failed to load TypeScript config: ${configPath}\\n` +\n 'Make sure you have \"tsx\" installed: npm i -D tsx\\n' +\n 'And run with: NODE_OPTIONS=\"--import tsx\" rq-codegen',\n );\n }\n }\n\n // JS/MJS files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return mod.default ?? mod;\n}\n\nexport async function loadConfig(projectRoot?: string): Promise<RqCodegenConfig> {\n const root = projectRoot ?? process.cwd();\n\n // 1. Try to find and load config file\n const configPath = await findConfigFile(root);\n let userConfig: Partial<RqCodegenConfig> = {};\n\n if (configPath) {\n const rawConfig = await loadConfigFromFile(configPath);\n const parsed = configSchema.safeParse(rawConfig);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`);\n throw new Error(`Invalid rqgen config:\\n${errors.join('\\n')}`);\n }\n\n userConfig = parsed.data as Partial<RqCodegenConfig>;\n }\n\n // 2. Auto-detect aliases from tsconfig if not provided in config\n if (!userConfig.aliases) {\n const detected = detectAliasesFromTsConfig(root);\n if (detected) {\n userConfig.aliases = detected as RqCodegenConfig['aliases'];\n }\n }\n\n // 3. Deep-merge with defaults\n const config = deepMerge(DEFAULT_CONFIG, userConfig);\n\n return config;\n}\n\nexport { detectAliasesFromTsConfig };\n","import type { RqCodegenConfig } from './types.js';\n\nexport const DEFAULT_CONFIG: RqCodegenConfig = {\n srcDir: './src',\n\n aliases: {\n api: '@api',\n components: '@components',\n hooks: '@hooks',\n types: '@app-types',\n utils: '@utils',\n contexts: '@contexts',\n constants: '@constants',\n views: '@views',\n pages: '@pages',\n validations: '@validations',\n assets: '@assets',\n routes: '@routes',\n hoc: '@hoc',\n appConfig: '@app-config',\n },\n\n features: {\n i18n: true,\n toast: true,\n barrel: true,\n routeRegistration: false,\n },\n\n naming: {\n dtoSuffixes: {\n read: 'ForReadDto',\n create: 'ForCreateDto',\n update: 'ForUpdateDto',\n list: 'ListDto',\n listResponse: 'ListResponseDto',\n params: 'ParamsDto',\n },\n validationSuffix: '.schema.ts',\n pageSuffix: 'Page',\n hookPrefix: 'use',\n },\n\n paths: {\n handlers: 'api/handlers',\n apiConfig: 'api/config',\n types: 'types/api',\n queries: 'lib/hooks/queries',\n mutations: 'lib/hooks/mutations',\n sharedHooks: 'lib/hooks/shared',\n hookUtils: 'lib/hooks/utils',\n uiComponents: 'components/ui',\n sharedComponents: 'components/shared',\n formComponents: 'components/forms',\n pages: 'pages',\n views: 'views',\n validations: 'validations',\n },\n\n router: {\n routerFile: 'routes/router.tsx',\n routesFile: 'routes/routes.ts',\n layouts: ['MainLayout', 'DashboardLayout'],\n },\n\n hooks: {\n toast: { import: 'useToast', from: '@hooks/shared' },\n translation: { import: 'useAppTranslation', from: '@hooks/shared' },\n paginatedQuery: { import: 'usePaginatedDataTableQuery', from: '@hooks/utils' },\n },\n};\n","import { z } from 'zod';\n\nconst hookImportSchema = z.object({\n import: z.string(),\n from: z.string(),\n});\n\nexport const configSchema = z.object({\n srcDir: z.string().optional(),\n\n aliases: z\n .object({\n api: z.string().optional(),\n components: z.string().optional(),\n hooks: z.string().optional(),\n types: z.string().optional(),\n utils: z.string().optional(),\n contexts: z.string().optional(),\n constants: z.string().optional(),\n views: z.string().optional(),\n pages: z.string().optional(),\n validations: z.string().optional(),\n assets: z.string().optional(),\n routes: z.string().optional(),\n hoc: z.string().optional(),\n appConfig: z.string().optional(),\n })\n .optional(),\n\n features: z\n .object({\n i18n: z.boolean().optional(),\n toast: z.boolean().optional(),\n barrel: z.boolean().optional(),\n routeRegistration: z.boolean().optional(),\n })\n .optional(),\n\n naming: z\n .object({\n dtoSuffixes: z\n .object({\n read: z.string().optional(),\n create: z.string().optional(),\n update: z.string().optional(),\n list: z.string().optional(),\n listResponse: z.string().optional(),\n params: z.string().optional(),\n })\n .optional(),\n validationSuffix: z.string().optional(),\n pageSuffix: z.string().optional(),\n hookPrefix: z.string().optional(),\n })\n .optional(),\n\n paths: z\n .object({\n handlers: z.string().optional(),\n apiConfig: z.string().optional(),\n types: z.string().optional(),\n queries: z.string().optional(),\n mutations: z.string().optional(),\n sharedHooks: z.string().optional(),\n hookUtils: z.string().optional(),\n uiComponents: z.string().optional(),\n sharedComponents: z.string().optional(),\n formComponents: z.string().optional(),\n pages: z.string().optional(),\n views: z.string().optional(),\n validations: z.string().optional(),\n })\n .optional(),\n\n router: z\n .object({\n routerFile: z.string().optional(),\n routesFile: z.string().optional(),\n layouts: z.array(z.string()).optional(),\n })\n .optional(),\n\n hooks: z\n .object({\n toast: hookImportSchema.optional(),\n translation: hookImportSchema.optional(),\n paginatedQuery: hookImportSchema.optional(),\n })\n .optional(),\n\n templatesDir: z.string().optional(),\n});\n\nexport type PartialRqCodegenConfig = z.infer<typeof configSchema>;\n","import fs from 'fs';\nimport path from 'path';\nimport Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\nimport { registerHelpers } from './helpers.js';\nimport { barrelAppend, routeRegister, type ActionResult } from './actions.js';\nimport { resolveTemplatePath } from './template-resolver.js';\nimport { ensureDirectoryExists } from '../utils/fs.js';\n\nexport type GeneratorAction =\n | AddAction\n | BarrelAppendAction\n | RouteRegisterAction;\n\nexport type AddAction = {\n type: 'add';\n path: string;\n templateFile: string;\n data?: Record<string, unknown>;\n};\n\nexport type BarrelAppendAction = {\n type: 'barrel-append';\n path: string;\n exportLine: string;\n};\n\nexport type RouteRegisterAction = {\n type: 'route-register';\n data: {\n pageName: string;\n category: string;\n layout: string;\n isProtected: boolean;\n routePath: string;\n };\n};\n\nlet handlebarsInstance: typeof Handlebars | null = null;\n\nfunction getHandlebars(config: RqCodegenConfig): typeof Handlebars {\n if (!handlebarsInstance) {\n handlebarsInstance = Handlebars.create();\n registerHelpers(handlebarsInstance, config);\n }\n return handlebarsInstance;\n}\n\nexport function resetHandlebars(): void {\n handlebarsInstance = null;\n}\n\nfunction renderString(\n template: string,\n data: Record<string, unknown>,\n config: RqCodegenConfig,\n): string {\n const hbs = getHandlebars(config);\n return hbs.compile(template)(data);\n}\n\nexport async function executeActions(\n actions: GeneratorAction[],\n answers: Record<string, unknown>,\n config: RqCodegenConfig,\n): Promise<ActionResult[]> {\n const results: ActionResult[] = [];\n const hbs = getHandlebars(config);\n\n for (const action of actions) {\n switch (action.type) {\n case 'add': {\n try {\n const mergedData = { ...answers, ...(action.data ?? {}), config };\n const resolvedPath = renderString(action.path, mergedData, config);\n const outputPath = path.resolve(process.cwd(), config.srcDir, resolvedPath);\n\n // Resolve template\n const templatePath = resolveTemplatePath(action.templateFile, config);\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n const compiled = hbs.compile(templateContent);\n const rendered = compiled(mergedData);\n\n ensureDirectoryExists(outputPath);\n\n if (fs.existsSync(outputPath)) {\n results.push({\n type: 'skipped',\n path: outputPath,\n message: 'File already exists',\n });\n } else {\n fs.writeFileSync(outputPath, rendered, 'utf-8');\n results.push({\n type: 'created',\n path: outputPath,\n message: `Created ${resolvedPath}`,\n });\n }\n } catch (error) {\n results.push({\n type: 'failed',\n path: action.path,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n break;\n }\n\n case 'barrel-append': {\n const mergedData = { ...answers, config };\n const result = barrelAppend(action.path, action.exportLine, config, mergedData);\n results.push(result);\n break;\n }\n\n case 'route-register': {\n const routeResults = routeRegister(config, action.data);\n results.push(...routeResults);\n break;\n }\n }\n }\n\n return results;\n}\n","import Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\n\nexport function registerHelpers(handlebars: typeof Handlebars, config: RqCodegenConfig): void {\n // -- Existing helpers (migrated from original) --\n\n handlebars.registerHelper('constantCase', (text: string) => {\n return text\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n });\n\n handlebars.registerHelper('eq', (a: unknown, b: unknown) => a === b);\n\n handlebars.registerHelper('neq', (a: unknown, b: unknown) => a !== b);\n\n handlebars.registerHelper('plural', (text: string) => {\n if (text.endsWith('s')) return text;\n if (text.endsWith('y') && !/[aeiou]y$/i.test(text)) return text.slice(0, -1) + 'ies';\n return text + 's';\n });\n\n handlebars.registerHelper('includes', (arr: string[], val: string) => {\n return Array.isArray(arr) && arr.includes(val);\n });\n\n handlebars.registerHelper('join', (arr: string[], separator: string) => {\n return Array.isArray(arr) ? arr.join(separator) : '';\n });\n\n // -- New config-aware helpers --\n\n handlebars.registerHelper('configAlias', (key: string) => {\n return (config.aliases as Record<string, string>)[key] ?? `@${key}`;\n });\n\n handlebars.registerHelper('configPath', (key: string) => {\n return (config.paths as Record<string, string>)[key] ?? key;\n });\n\n handlebars.registerHelper('dtoSuffix', (key: string) => {\n return (config.naming.dtoSuffixes as Record<string, string>)[key] ?? '';\n });\n\n // Block helper for feature checks\n handlebars.registerHelper('ifFeature', function (\n this: unknown,\n feature: string,\n options: Handlebars.HelperOptions,\n ) {\n const isEnabled = (config.features as Record<string, boolean>)[feature];\n return isEnabled ? options.fn(this) : options.inverse(this);\n });\n\n // Plop built-in helpers that we need to provide\n handlebars.registerHelper('pascalCase', (text: string) => {\n return text\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n });\n\n handlebars.registerHelper('camelCase', (text: string) => {\n return text\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toLowerCase());\n });\n\n handlebars.registerHelper('kebabCase', (text: string) => {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\nimport { toPascalCase, toKebabCase, toConstantCase } from '../utils/string.js';\nimport { ensureDirectoryExists } from '../utils/fs.js';\n\nexport type ActionResult = {\n type: 'created' | 'updated' | 'skipped' | 'failed';\n path: string;\n message: string;\n};\n\nexport function barrelAppend(\n barrelRelativePath: string,\n exportLine: string,\n config: RqCodegenConfig,\n data: Record<string, unknown>,\n): ActionResult {\n if (!config.features.barrel) {\n return { type: 'skipped', path: barrelRelativePath, message: 'Barrel updates disabled' };\n }\n\n const handlebars = Handlebars.create();\n // Register needed helpers for rendering\n handlebars.registerHelper('kebabCase', (text: string) =>\n text.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/[\\s_]+/g, '-').toLowerCase(),\n );\n handlebars.registerHelper('pascalCase', (text: string) =>\n text.replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : '')).replace(/^(.)/, (_, c: string) => c.toUpperCase()),\n );\n handlebars.registerHelper('camelCase', (text: string) =>\n text.replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : '')).replace(/^(.)/, (_, c: string) => c.toLowerCase()),\n );\n\n const renderedPath = handlebars.compile(barrelRelativePath)(data);\n const barrelPath = path.resolve(process.cwd(), config.srcDir, renderedPath);\n const renderedExport = handlebars.compile(exportLine)(data);\n\n ensureDirectoryExists(barrelPath);\n\n let content = '';\n if (fs.existsSync(barrelPath)) {\n content = fs.readFileSync(barrelPath, 'utf-8');\n }\n\n if (content.includes(renderedExport)) {\n return { type: 'skipped', path: barrelPath, message: 'Export already exists' };\n }\n\n const trimmedContent = content.trimEnd();\n const newContent = trimmedContent ? `${trimmedContent}\\n${renderedExport}\\n` : `${renderedExport}\\n`;\n\n fs.writeFileSync(barrelPath, newContent, 'utf-8');\n return { type: 'updated', path: barrelPath, message: `Updated barrel: ${renderedPath}` };\n}\n\nexport function routeRegister(\n config: RqCodegenConfig,\n data: {\n pageName: string;\n category: string;\n layout: string;\n isProtected: boolean;\n routePath: string;\n },\n): ActionResult[] {\n const results: ActionResult[] = [];\n const routerFilePath = path.resolve(process.cwd(), config.srcDir, config.router.routerFile);\n const routesFilePath = path.resolve(process.cwd(), config.srcDir, config.router.routesFile);\n\n if (!fs.existsSync(routerFilePath)) {\n return [{ type: 'failed', path: routerFilePath, message: 'Router file not found' }];\n }\n if (!fs.existsSync(routesFilePath)) {\n return [{ type: 'failed', path: routesFilePath, message: 'Routes file not found' }];\n }\n\n const pascalName = toPascalCase(data.pageName);\n const kebabCategory = toKebabCase(data.category);\n const constantCategory = toConstantCase(data.category);\n const constantPage = toConstantCase(data.pageName);\n const pageSuffix = config.naming.pageSuffix;\n const pagesAlias = config.aliases.pages;\n\n // 1. Add lazy import to router file\n let routerContent = fs.readFileSync(routerFilePath, 'utf-8');\n const lazyImportLine = `const ${pascalName}${pageSuffix} = lazy(() => import('${pagesAlias}/${kebabCategory}/${pascalName}${pageSuffix}'));`;\n\n if (!routerContent.includes(lazyImportLine)) {\n const lazyImportRegex = /^const \\w+ = lazy\\(\\(\\) => import\\([^)]+\\)\\);$/gm;\n let lastMatch: RegExpExecArray | null = null;\n let match: RegExpExecArray | null;\n while ((match = lazyImportRegex.exec(routerContent)) !== null) {\n lastMatch = match;\n }\n\n if (lastMatch) {\n const insertPos = lastMatch.index + lastMatch[0].length;\n routerContent =\n routerContent.slice(0, insertPos) + '\\n' + lazyImportLine + routerContent.slice(insertPos);\n fs.writeFileSync(routerFilePath, routerContent, 'utf-8');\n results.push({ type: 'updated', path: routerFilePath, message: `Added lazy import for ${pascalName}${pageSuffix}` });\n } else {\n results.push({\n type: 'failed',\n path: routerFilePath,\n message: `Could not find lazy import insertion point. Add manually:\\n ${lazyImportLine}`,\n });\n }\n } else {\n results.push({ type: 'skipped', path: routerFilePath, message: 'Lazy import already exists' });\n }\n\n // 2. Add route constant to routes file\n let routesContent = fs.readFileSync(routesFilePath, 'utf-8');\n const routeConstant = ` ${constantPage}: '${data.routePath}',`;\n\n // Check if category section exists\n const categoryRegex = new RegExp(`${constantCategory}:\\\\s*\\\\{([^}]*)\\\\}`, 's');\n const categoryMatch = categoryRegex.exec(routesContent);\n\n if (categoryMatch) {\n // Category exists — add the route inside it\n if (!routesContent.includes(routeConstant)) {\n const closingBrace = routesContent.indexOf('}', categoryMatch.index + categoryMatch[0].indexOf('{'));\n routesContent =\n routesContent.slice(0, closingBrace) + routeConstant + '\\n ' + routesContent.slice(closingBrace);\n fs.writeFileSync(routesFilePath, routesContent, 'utf-8');\n results.push({ type: 'updated', path: routesFilePath, message: `Added route constant ${constantCategory}.${constantPage}` });\n } else {\n results.push({ type: 'skipped', path: routesFilePath, message: 'Route constant already exists' });\n }\n } else {\n // Category doesn't exist — add it\n const newSection = ` ${constantCategory}: {\\n ${routeConstant}\\n },`;\n // Find the closing of FULL_ROUTES_PATH\n const fullRoutesEnd = routesContent.lastIndexOf('} as const');\n if (fullRoutesEnd !== -1) {\n routesContent =\n routesContent.slice(0, fullRoutesEnd) + newSection + '\\n' + routesContent.slice(fullRoutesEnd);\n fs.writeFileSync(routesFilePath, routesContent, 'utf-8');\n results.push({ type: 'updated', path: routesFilePath, message: `Added new route category ${constantCategory}` });\n } else {\n results.push({\n type: 'failed',\n path: routesFilePath,\n message: `Could not find FULL_ROUTES_PATH. Add manually:\\n ${constantCategory}: { ${constantPage}: '${data.routePath}' }`,\n });\n }\n }\n\n return results;\n}\n","export function toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toLowerCase());\n}\n\nexport function toConstantCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function fileExists(filePath: string): boolean {\n return fs.existsSync(path.resolve(process.cwd(), filePath));\n}\n\nexport function dirExists(dirPath: string): boolean {\n const resolved = path.resolve(process.cwd(), dirPath);\n return fs.existsSync(resolved) && fs.statSync(resolved).isDirectory();\n}\n\nexport function getDirectories(dirPath: string): string[] {\n const resolved = path.resolve(process.cwd(), dirPath);\n if (!fs.existsSync(resolved)) return [];\n return fs\n .readdirSync(resolved, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n}\n\nexport function ensureDirectoryExists(filePath: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport type { RqCodegenConfig } from '../config/types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Bundled templates are at the package root /templates/ directory\n// In the built package: dist/core/template-resolver.js → ../../templates/\nconst BUNDLED_TEMPLATES_DIR = path.resolve(__dirname, '../../templates');\n\nexport function resolveTemplatePath(\n templateRelative: string,\n config: RqCodegenConfig,\n): string {\n // 1. Check local override\n if (config.templatesDir) {\n const localPath = path.resolve(process.cwd(), config.templatesDir, templateRelative);\n if (fs.existsSync(localPath)) return localPath;\n }\n\n // 2. Fall back to bundled\n const bundledPath = path.resolve(BUNDLED_TEMPLATES_DIR, templateRelative);\n if (fs.existsSync(bundledPath)) return bundledPath;\n\n throw new Error(\n `Template not found: ${templateRelative}\\n` +\n `Searched:\\n` +\n (config.templatesDir\n ? ` - ${path.resolve(process.cwd(), config.templatesDir, templateRelative)}\\n`\n : '') +\n ` - ${bundledPath}`,\n );\n}\n","export function validateName(value: string): true | string {\n if (!value || value.trim() === '') return 'Name is required';\n if (/[^a-zA-Z0-9-]/.test(value)) return 'Name must be alphanumeric (hyphens allowed)';\n return true;\n}\n\nexport function validatePascalCase(value: string): true | string {\n if (!value || !/^[A-Z][a-zA-Z0-9]*$/.test(value)) {\n return 'Name must be PascalCase (e.g., UserProfile)';\n }\n return true;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentUiAnswers = {\n name: string;\n};\n\nexport function componentUiPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Component name (e.g., StatusIndicator):',\n validate: validateName,\n },\n ];\n}\n\nexport function componentUiActions(\n _answers: ComponentUiAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.uiComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'component-ui/Component.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/index.ts`,\n templateFile: 'component-ui/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentSharedAnswers = {\n name: string;\n subComponentsRaw: string;\n subComponents?: string[];\n};\n\nexport function componentSharedPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Component name (e.g., InfoCard):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'subComponentsRaw',\n message: 'Sub-component names (comma-separated, e.g., Header,Body,Footer):',\n default: 'Header,Body,Footer',\n },\n ];\n}\n\nexport function preprocessComponentSharedAnswers(\n answers: ComponentSharedAnswers,\n): ComponentSharedAnswers {\n return {\n ...answers,\n subComponents: answers.subComponentsRaw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n };\n}\n\nexport function componentSharedActions(\n _answers: ComponentSharedAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.sharedComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'component-shared/Component.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/index.ts`,\n templateFile: 'component-shared/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentFormAnswers = {\n name: string;\n};\n\nexport function componentFormPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Field name (e.g., DateRange, Slider):',\n validate: validateName,\n },\n ];\n}\n\nexport function componentFormActions(\n _answers: ComponentFormAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.formComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/form-{{kebabCase name}}/Form{{pascalCase name}}.tsx`,\n templateFile: 'component-form/FormComponent.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/form-{{kebabCase name}}/index.ts`,\n templateFile: 'component-form/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './form-{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { getDirectories } from '../utils/fs.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type PageAnswers = {\n name: string;\n category: string;\n newCategory?: string;\n registerRoute?: boolean;\n layout?: string;\n isProtected?: boolean;\n routePath?: string;\n};\n\nexport function pagePrompts(config: RqCodegenConfig) {\n const prompts = [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Page name (e.g., Communities, EventDetails):',\n validate: validateName,\n },\n {\n type: 'list' as const,\n name: 'category',\n message: 'Page category (folder):',\n choices: () => {\n const dirs = getDirectories(`${config.srcDir}/${config.paths.pages}`);\n return [...dirs, '── Create new category ──'];\n },\n },\n {\n type: 'input' as const,\n name: 'newCategory',\n message: 'New category name (kebab-case):',\n when: (answers: PageAnswers) => answers.category === '── Create new category ──',\n validate: validateName,\n },\n ];\n\n if (config.features.routeRegistration) {\n prompts.push(\n {\n type: 'confirm' as const,\n name: 'registerRoute',\n message: 'Auto-register route in router?',\n default: true,\n } as never,\n {\n type: 'list' as const,\n name: 'layout',\n message: 'Which layout?',\n choices: () => config.router.layouts,\n when: (answers: PageAnswers) => !!answers.registerRoute,\n } as never,\n {\n type: 'confirm' as const,\n name: 'isProtected',\n message: 'Is this a protected route (requires auth)?',\n default: true,\n when: (answers: PageAnswers) => !!answers.registerRoute,\n } as never,\n {\n type: 'input' as const,\n name: 'routePath',\n message: 'Route path (e.g., communities, events/details):',\n when: (answers: PageAnswers) => !!answers.registerRoute,\n validate: validateName,\n } as never,\n );\n }\n\n return prompts;\n}\n\nexport function preprocessPageAnswers(answers: PageAnswers): PageAnswers {\n if (answers.newCategory) {\n return { ...answers, category: answers.newCategory };\n }\n return answers;\n}\n\nexport function pageActions(answers: PageAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const basePath = config.paths.pages;\n const pageSuffix = config.naming.pageSuffix;\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase category}}/{{pascalCase name}}${pageSuffix}.tsx`,\n templateFile: 'page/Page.tsx.hbs',\n data: { pageSuffix },\n },\n ];\n\n if (config.features.routeRegistration && answers.registerRoute) {\n actions.push({\n type: 'route-register',\n data: {\n pageName: answers.name,\n category: answers.category,\n layout: answers.layout ?? config.router.layouts[0],\n isProtected: answers.isProtected ?? true,\n routePath: answers.routePath ?? answers.name.toLowerCase(),\n },\n });\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { dirExists, getDirectories } from '../utils/fs.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ViewAnswers = {\n feature: string;\n newFeature?: string;\n name: string;\n};\n\nexport function viewPrompts(config: RqCodegenConfig) {\n return [\n {\n type: 'list' as const,\n name: 'feature',\n message: 'Feature (parent folder):',\n choices: () => {\n const dirs = getDirectories(`${config.srcDir}/${config.paths.views}`);\n return [...dirs, '── Create new feature ──'];\n },\n },\n {\n type: 'input' as const,\n name: 'newFeature',\n message: 'New feature name (kebab-case):',\n when: (answers: ViewAnswers) => answers.feature === '── Create new feature ──',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'name',\n message: 'View component name (e.g., CommunityCard):',\n validate: validateName,\n },\n ];\n}\n\nexport function preprocessViewAnswers(answers: ViewAnswers): ViewAnswers {\n if (answers.newFeature) {\n return { ...answers, feature: answers.newFeature };\n }\n return answers;\n}\n\nexport function viewActions(answers: ViewAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const basePath = config.paths.views;\n const isNewFeature = !!answers.newFeature;\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase feature}}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'view/View.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase feature}}/{{kebabCase name}}/index.ts`,\n templateFile: 'view/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/{{kebabCase feature}}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n\n if (isNewFeature || !dirExists(`${config.srcDir}/${config.paths.views}/${answers.feature}`)) {\n actions.push({\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase feature}}';\",\n });\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { toPascalCase } from '../utils/string.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type HandlerAnswers = {\n name: string;\n singularName: string;\n endpointKey: string;\n operations: string[];\n chainTypes: boolean;\n chainQueryHook: boolean;\n isPaginated?: boolean;\n chainMutationHook: boolean;\n};\n\nexport function handlerPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Entity name (e.g., products):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'singularName',\n message: 'Singular entity name for mutations (e.g., product):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'endpointKey',\n message: 'ApiEndpoints key (e.g., PRODUCTS):',\n },\n {\n type: 'checkbox' as const,\n name: 'operations',\n message: 'Which operations?',\n choices: [\n { name: 'list', value: 'list', checked: true },\n { name: 'details', value: 'details', checked: true },\n { name: 'create', value: 'create' },\n { name: 'update', value: 'update' },\n { name: 'delete', value: 'delete' },\n ],\n },\n {\n type: 'confirm' as const,\n name: 'chainTypes',\n message: 'Also generate DTO types?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'chainQueryHook',\n message: 'Also generate query hook(s)?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is the list endpoint paginated?',\n default: false,\n when: (answers: HandlerAnswers) => {\n const ops = answers.operations;\n return !!answers.chainQueryHook && ops?.includes('list');\n },\n },\n {\n type: 'confirm' as const,\n name: 'chainMutationHook',\n message: 'Also generate mutation hook(s)?',\n default: true,\n },\n ];\n}\n\nexport function handlerActions(answers: HandlerAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const operations = answers.operations || [];\n const entityName = answers.name;\n const singularName = answers.singularName;\n const pascalSingular = toPascalCase(singularName);\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${config.paths.handlers}/{{camelCase name}}.ts`,\n templateFile: 'handler/handler.ts.hbs',\n data: { operations },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.handlers}/index.ts`,\n exportLine: \"export * from './{{camelCase name}}';\",\n },\n ];\n\n // Chain DTO types\n if (answers.chainTypes) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n data: {\n includeCreateDto: operations.includes('create'),\n includeUpdateDto: operations.includes('update'),\n includeParamsDto: true,\n },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n );\n }\n\n // Chain query hooks\n if (answers.chainQueryHook && operations.includes('list')) {\n if (answers.isPaginated) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}PaginatedQuery.ts`,\n templateFile: 'query-hook/hook-paginated.ts.hbs',\n data: { hookName: `${entityName}Paginated`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}PaginatedQuery';\",\n },\n );\n } else {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}ListQuery.ts`,\n templateFile: 'query-hook/hook.ts.hbs',\n data: { hookName: `${entityName}List`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}ListQuery';\",\n },\n );\n }\n }\n\n if (answers.chainQueryHook && operations.includes('details')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}DetailsQuery.ts`,\n templateFile: 'query-hook/hook-details.ts.hbs',\n data: { hookName: `${entityName}Details`, handlerName: entityName, handlerKey: 'details' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}DetailsQuery';\",\n },\n );\n }\n\n // Chain mutation hooks — use singularName for naming\n if (answers.chainMutationHook && operations.includes('create')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useCreate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'create', invalidateKey: 'list', mutationName: `Create${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useCreate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (answers.chainMutationHook && operations.includes('update')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useUpdate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'update', invalidateKey: 'list', mutationName: `Update${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useUpdate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (answers.chainMutationHook && operations.includes('delete')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useDelete${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'remove', invalidateKey: 'list', mutationName: `Delete${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useDelete${pascalSingular}Mutation';`,\n },\n );\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type QueryHookAnswers = {\n name: string;\n handlerName: string;\n handlerKey: string;\n isDetailsQuery: boolean;\n isPaginated?: boolean;\n};\n\nexport function queryHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Hook name suffix (e.g., CommunityList, ProductDetails):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerName',\n message: 'Handler name to import (e.g., Community):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerKey',\n message: 'Handler key (e.g., list, details):',\n default: 'list',\n },\n {\n type: 'confirm' as const,\n name: 'isDetailsQuery',\n message: 'Is this a details/by-id query (takes an id parameter)?',\n default: false,\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is this a paginated list query?',\n default: false,\n when: (answers: QueryHookAnswers) => !answers.isDetailsQuery,\n },\n ];\n}\n\nexport function queryHookActions(answers: QueryHookAnswers, config: RqCodegenConfig): GeneratorAction[] {\n let templateFile: string;\n\n if (answers.isDetailsQuery) {\n templateFile = 'query-hook/hook-details.ts.hbs';\n } else if (answers.isPaginated) {\n templateFile = 'query-hook/hook-paginated.ts.hbs';\n } else {\n templateFile = 'query-hook/hook.ts.hbs';\n }\n\n return [\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}Query.ts`,\n templateFile,\n data: { hookName: answers.name },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}Query';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type MutationHookAnswers = {\n mutationName: string;\n handlerName: string;\n handlerKey: string;\n invalidateKey: string;\n};\n\nexport function mutationHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'mutationName',\n message: 'Mutation name (e.g., CreateCommunity, UpdateUser):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerName',\n message: 'Handler name to import (e.g., Community):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerKey',\n message: 'Handler mutation key (e.g., create, update, remove):',\n default: 'create',\n },\n {\n type: 'input' as const,\n name: 'invalidateKey',\n message: 'Handler query key to invalidate on success (e.g., list):',\n default: 'list',\n },\n ];\n}\n\nexport function mutationHookActions(\n _answers: MutationHookAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.mutations}/use{{pascalCase mutationName}}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: \"export * from './use{{pascalCase mutationName}}Mutation';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type TypesDtoAnswers = {\n name: string;\n includeCreateDto: boolean;\n includeUpdateDto: boolean;\n includeParamsDto: boolean;\n};\n\nexport function typesDtoPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Entity name (e.g., Community, Event):',\n validate: validateName,\n },\n {\n type: 'confirm' as const,\n name: 'includeCreateDto',\n message: 'Include ForCreateDto?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'includeUpdateDto',\n message: 'Include ForUpdateDto?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'includeParamsDto',\n message: 'Include ParamsDto?',\n default: true,\n },\n ];\n}\n\nexport function typesDtoActions(\n _answers: TypesDtoAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type SharedHookAnswers = {\n name: string;\n reactImports: string[];\n};\n\nexport function sharedHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Hook name (e.g., WindowSize, Clipboard):',\n validate: validateName,\n },\n {\n type: 'checkbox' as const,\n name: 'reactImports',\n message: 'Which React imports?',\n choices: [\n { name: 'useState', value: 'useState', checked: true },\n { name: 'useEffect', value: 'useEffect', checked: true },\n { name: 'useCallback', value: 'useCallback' },\n { name: 'useMemo', value: 'useMemo' },\n { name: 'useRef', value: 'useRef' },\n ],\n },\n ];\n}\n\nexport function sharedHookActions(\n _answers: SharedHookAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.sharedHooks}/use{{pascalCase name}}.ts`,\n templateFile: 'shared-hook/hook.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.sharedHooks}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ValidationAnswers = {\n name: string;\n};\n\nexport function validationPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Schema name (e.g., communitySettings, eventCreate):',\n validate: validateName,\n },\n ];\n}\n\nexport function validationActions(\n _answers: ValidationAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n // Determine file extension from config (e.g., '.schema.ts' or '.ts')\n const suffix = config.naming.validationSuffix;\n // Strip leading dot and extension for barrel export\n // '.schema.ts' -> file: '{{camelCase name}}.schema.ts', export: './{{camelCase name}}.schema'\n const fileExt = suffix; // e.g., '.schema.ts'\n const barrelExt = suffix.replace(/\\.ts$/, ''); // e.g., '.schema'\n\n return [\n {\n type: 'add',\n path: `${config.paths.validations}/{{camelCase name}}${fileExt}`,\n templateFile: 'validation/validation.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.validations}/index.ts`,\n exportLine: `export * from './{{camelCase name}}${barrelExt}';`,\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { toPascalCase } from '../utils/string.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type FeatureAnswers = {\n name: string;\n singularName: string;\n endpointKey: string;\n artifacts: string[];\n isPaginated?: boolean;\n};\n\nexport function featurePrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Feature/entity name (e.g., products):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'singularName',\n message: 'Singular entity name for mutations (e.g., product):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'endpointKey',\n message: 'ApiEndpoints key (e.g., PRODUCTS):',\n },\n {\n type: 'checkbox' as const,\n name: 'artifacts',\n message: 'Which artifacts to generate?',\n choices: [\n { name: 'API Handler', value: 'handler', checked: true },\n { name: 'DTO Types', value: 'types', checked: true },\n { name: 'Query Hook (list)', value: 'queryList', checked: true },\n { name: 'Query Hook (details)', value: 'queryDetails', checked: true },\n { name: 'Mutation Hook (create)', value: 'mutationCreate' },\n { name: 'Mutation Hook (update)', value: 'mutationUpdate' },\n { name: 'Mutation Hook (delete)', value: 'mutationDelete' },\n { name: 'View Component', value: 'view' },\n { name: 'Page Component', value: 'page' },\n { name: 'Validation Schema', value: 'validation' },\n ],\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is the list endpoint paginated?',\n default: false,\n when: (answers: FeatureAnswers) => {\n return answers.artifacts?.includes('queryList');\n },\n },\n ];\n}\n\nexport function featureActions(answers: FeatureAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const artifacts = answers.artifacts || [];\n const actions: GeneratorAction[] = [];\n const entityName = answers.name;\n const singularName = answers.singularName;\n const pascalSingular = toPascalCase(singularName);\n const validationSuffix = config.naming.validationSuffix;\n const validationBarrelExt = validationSuffix.replace(/\\.ts$/, '');\n\n // 1. DTO Types (first, so handler can reference them)\n if (artifacts.includes('types')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n data: {\n includeCreateDto: artifacts.includes('mutationCreate'),\n includeUpdateDto: artifacts.includes('mutationUpdate'),\n includeParamsDto: true,\n },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n );\n }\n\n // 2. Handler\n if (artifacts.includes('handler')) {\n const operations: string[] = ['list', 'details'];\n if (artifacts.includes('mutationCreate')) operations.push('create');\n if (artifacts.includes('mutationUpdate')) operations.push('update');\n if (artifacts.includes('mutationDelete')) operations.push('delete');\n\n actions.push(\n {\n type: 'add',\n path: `${config.paths.handlers}/{{camelCase name}}.ts`,\n templateFile: 'handler/handler.ts.hbs',\n data: { operations, endpointKey: answers.endpointKey },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.handlers}/index.ts`,\n exportLine: \"export * from './{{camelCase name}}';\",\n },\n );\n }\n\n // 3. Query Hooks\n if (artifacts.includes('queryList')) {\n if (answers.isPaginated) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}PaginatedQuery.ts`,\n templateFile: 'query-hook/hook-paginated.ts.hbs',\n data: { hookName: `${entityName}Paginated`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}PaginatedQuery';\",\n },\n );\n } else {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}ListQuery.ts`,\n templateFile: 'query-hook/hook.ts.hbs',\n data: { hookName: `${entityName}List`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}ListQuery';\",\n },\n );\n }\n }\n\n if (artifacts.includes('queryDetails')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}DetailsQuery.ts`,\n templateFile: 'query-hook/hook-details.ts.hbs',\n data: { hookName: `${entityName}Details`, handlerName: entityName, handlerKey: 'details' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}DetailsQuery';\",\n },\n );\n }\n\n // 4. Mutation Hooks — use singularName for naming\n if (artifacts.includes('mutationCreate')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useCreate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'create', invalidateKey: 'list', mutationName: `Create${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useCreate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (artifacts.includes('mutationUpdate')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useUpdate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'update', invalidateKey: 'list', mutationName: `Update${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useUpdate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (artifacts.includes('mutationDelete')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useDelete${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'remove', invalidateKey: 'list', mutationName: `Delete${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useDelete${pascalSingular}Mutation';`,\n },\n );\n }\n\n // 5. View\n if (artifacts.includes('view')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.views}/{{kebabCase name}}/{{kebabCase name}}-list/{{pascalCase name}}List.tsx`,\n templateFile: 'view/View.tsx.hbs',\n data: { name: `${entityName}List` },\n },\n {\n type: 'add',\n path: `${config.paths.views}/{{kebabCase name}}/{{kebabCase name}}-list/index.ts`,\n templateFile: 'view/index.ts.hbs',\n data: { name: `${entityName}List` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.views}/{{kebabCase name}}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}-list';\",\n },\n {\n type: 'barrel-append',\n path: `${config.paths.views}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n );\n }\n\n // 6. Page\n if (artifacts.includes('page')) {\n const pageSuffix = config.naming.pageSuffix;\n actions.push({\n type: 'add',\n path: `${config.paths.pages}/{{kebabCase name}}/{{pascalCase name}}${pageSuffix}.tsx`,\n templateFile: 'page/Page.tsx.hbs',\n data: { pageSuffix },\n });\n }\n\n // 7. Validation\n if (artifacts.includes('validation')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.validations}/{{camelCase name}}${validationSuffix}`,\n templateFile: 'validation/validation.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.validations}/index.ts`,\n exportLine: `export * from './{{camelCase name}}${validationBarrelExt}';`,\n },\n );\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\n\nimport { componentUiPrompts, componentUiActions } from './component-ui.js';\nimport { componentSharedPrompts, componentSharedActions, preprocessComponentSharedAnswers } from './component-shared.js';\nimport { componentFormPrompts, componentFormActions } from './component-form.js';\nimport { pagePrompts, pageActions, preprocessPageAnswers } from './page.js';\nimport { viewPrompts, viewActions, preprocessViewAnswers } from './view.js';\nimport { handlerPrompts, handlerActions } from './handler.js';\nimport { queryHookPrompts, queryHookActions } from './query-hook.js';\nimport { mutationHookPrompts, mutationHookActions } from './mutation-hook.js';\nimport { typesDtoPrompts, typesDtoActions } from './types-dto.js';\nimport { sharedHookPrompts, sharedHookActions } from './shared-hook.js';\nimport { validationPrompts, validationActions } from './validation.js';\nimport { featurePrompts, featureActions } from './feature.js';\n\nexport type GeneratorDefinition = {\n name: string;\n description: string;\n prompts: (config: RqCodegenConfig) => unknown[];\n actions: (answers: Record<string, unknown>, config: RqCodegenConfig) => GeneratorAction[];\n preprocess?: (answers: Record<string, unknown>) => Record<string, unknown>;\n};\n\nexport function getGenerators(_config: RqCodegenConfig): GeneratorDefinition[] {\n // _config is available for future use; generators access it via their actions callback\n return [\n {\n name: 'component-ui',\n description: 'CVA-based UI component (shadcn/ui style)',\n prompts: () => componentUiPrompts(),\n actions: (answers, cfg) => componentUiActions(answers as never, cfg),\n },\n {\n name: 'component-shared',\n description: 'Compound shared component',\n prompts: () => componentSharedPrompts(),\n actions: (answers, cfg) => componentSharedActions(answers as never, cfg),\n preprocess: (answers) => preprocessComponentSharedAnswers(answers as never),\n },\n {\n name: 'component-form',\n description: 'React Hook Form component (useController-based)',\n prompts: () => componentFormPrompts(),\n actions: (answers, cfg) => componentFormActions(answers as never, cfg),\n },\n {\n name: 'page',\n description: 'Route-level page component',\n prompts: (cfg) => pagePrompts(cfg),\n actions: (answers, cfg) => pageActions(answers as never, cfg),\n preprocess: (answers) => preprocessPageAnswers(answers as never),\n },\n {\n name: 'view',\n description: 'Feature view component',\n prompts: (cfg) => viewPrompts(cfg),\n actions: (answers, cfg) => viewActions(answers as never, cfg),\n preprocess: (answers) => preprocessViewAnswers(answers as never),\n },\n {\n name: 'handler',\n description: 'API handler (+ types + hooks)',\n prompts: () => handlerPrompts(),\n actions: (answers, cfg) => handlerActions(answers as never, cfg),\n },\n {\n name: 'query-hook',\n description: 'React Query hook',\n prompts: () => queryHookPrompts(),\n actions: (answers, cfg) => queryHookActions(answers as never, cfg),\n },\n {\n name: 'mutation-hook',\n description: 'React Query mutation hook',\n prompts: () => mutationHookPrompts(),\n actions: (answers, cfg) => mutationHookActions(answers as never, cfg),\n },\n {\n name: 'types-dto',\n description: 'DTO type definitions',\n prompts: () => typesDtoPrompts(),\n actions: (answers, cfg) => typesDtoActions(answers as never, cfg),\n },\n {\n name: 'shared-hook',\n description: 'Custom utility hook',\n prompts: () => sharedHookPrompts(),\n actions: (answers, cfg) => sharedHookActions(answers as never, cfg),\n },\n {\n name: 'validation',\n description: 'Zod validation schema',\n prompts: () => validationPrompts(),\n actions: (answers, cfg) => validationActions(answers as never, cfg),\n },\n {\n name: 'feature',\n description: 'Full feature scaffold (handler + types + hooks + view + page)',\n prompts: () => featurePrompts(),\n actions: (answers, cfg) => featureActions(answers as never, cfg),\n },\n ];\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { detectAliasesFromTsConfig } from '../config/loader.js';\n\ntype InitOptions = {\n force?: boolean;\n};\n\nexport async function runInit(options: InitOptions): Promise<void> {\n const configPath = path.resolve(process.cwd(), 'rqgen.config.ts');\n\n if (fs.existsSync(configPath) && !options.force) {\n console.error(\n chalk.red('Config file already exists: rqgen.config.ts'),\n );\n console.log(chalk.yellow('Use --force to overwrite.'));\n process.exit(1);\n }\n\n console.log(chalk.cyan('\\n Initializing @appswave/rq-codegen config...\\n'));\n\n // Auto-detect\n const detectedAliases = detectAliasesFromTsConfig(process.cwd());\n const srcDirExists = fs.existsSync(path.resolve(process.cwd(), 'src'));\n const srcDir = srcDirExists ? './src' : '.';\n\n const hasRouter = fs.existsSync(\n path.resolve(process.cwd(), srcDir, 'routes/router.tsx'),\n );\n\n const hasI18n =\n fs.existsSync(path.resolve(process.cwd(), srcDir, 'locales')) ||\n fs.existsSync(path.resolve(process.cwd(), 'i18next.config.ts'));\n\n // Interactive questions\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'i18n',\n message: 'Does your project use i18n (i18next)?',\n default: hasI18n,\n },\n {\n type: 'confirm',\n name: 'toast',\n message: 'Does your project use toast notifications?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'routeRegistration',\n message: 'Enable automatic route registration when generating pages?',\n default: hasRouter,\n },\n ]);\n\n // Build config content\n const aliasesStr = detectedAliases\n ? formatAliases(detectedAliases)\n : ' // Auto-detected from tsconfig.json — customize if needed';\n\n const configContent = `import { defineConfig } from '@appswave/rq-codegen';\n\nexport default defineConfig({\n srcDir: '${srcDir}',\n\n aliases: {\n${aliasesStr}\n },\n\n features: {\n i18n: ${answers.i18n},\n toast: ${answers.toast},\n barrel: true,\n routeRegistration: ${answers.routeRegistration},\n },\n\n naming: {\n dtoSuffixes: {\n read: 'ForReadDto',\n create: 'ForCreateDto',\n update: 'ForUpdateDto',\n list: 'ListDto',\n listResponse: 'ListResponseDto',\n params: 'ParamsDto',\n },\n validationSuffix: '.schema.ts',\n pageSuffix: 'Page',\n hookPrefix: 'use',\n },\n\n paths: {\n handlers: 'api/handlers',\n apiConfig: 'api/config',\n types: 'types/api',\n queries: 'lib/hooks/queries',\n mutations: 'lib/hooks/mutations',\n sharedHooks: 'lib/hooks/shared',\n hookUtils: 'lib/hooks/utils',\n uiComponents: 'components/ui',\n sharedComponents: 'components/shared',\n formComponents: 'components/forms',\n pages: 'pages',\n views: 'views',\n validations: 'validations',\n },\n${\n answers.routeRegistration\n ? `\n router: {\n routerFile: 'routes/router.tsx',\n routesFile: 'routes/routes.ts',\n layouts: ['MainLayout', 'DashboardLayout'],\n },\n`\n : ''\n}\n hooks: {\n toast: { import: 'useToast', from: '@hooks/shared' },\n translation: { import: 'useAppTranslation', from: '@hooks/shared' },\n paginatedQuery: { import: 'usePaginatedDataTableQuery', from: '@hooks/utils' },\n },\n});\n`;\n\n fs.writeFileSync(configPath, configContent, 'utf-8');\n console.log(chalk.green(' Created rqgen.config.ts'));\n console.log(chalk.dim(' Edit the config to customize paths, aliases, and features.\\n'));\n}\n\nfunction formatAliases(\n aliases: Partial<Record<string, string>>,\n): string {\n const lines: string[] = [];\n const keyMap: Record<string, string> = {\n api: 'api',\n components: 'components',\n hooks: 'hooks',\n types: 'types',\n utils: 'utils',\n contexts: 'contexts',\n constants: 'constants',\n views: 'views',\n pages: 'pages',\n validations: 'validations',\n assets: 'assets',\n routes: 'routes',\n hoc: 'hoc',\n appConfig: 'appConfig',\n };\n\n for (const [key, configKey] of Object.entries(keyMap)) {\n const value = aliases[key as keyof typeof aliases];\n if (value) {\n lines.push(` ${configKey}: '${value}',`);\n }\n }\n\n return lines.length > 0\n ? lines.join('\\n')\n : ' // No aliases detected — add your path aliases here';\n}\n","import { createCli } from '../src/cli.js';\n\nconst program = createCli();\nprogram.parse(process.argv);\n"],"mappings":"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","names":["fileUrl","mod","fs","path","Handlebars","fs","path","fs","path","path","fs","path","fs","fs","path","Handlebars","path","fs","fs","path","chalk","inquirer","path","fs","chalk","inquirer","program"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli.ts","../../src/commands/generate.ts","../../src/config/loader.ts","../../src/config/defaults.ts","../../src/config/schema.ts","../../src/core/engine.ts","../../src/core/helpers.ts","../../src/core/actions.ts","../../src/utils/string.ts","../../src/utils/fs.ts","../../src/core/template-resolver.ts","../../src/utils/validation.ts","../../src/generators/component-ui.ts","../../src/generators/component-shared.ts","../../src/generators/component-form.ts","../../src/generators/page.ts","../../src/generators/view.ts","../../src/generators/handler.ts","../../src/generators/query-hook.ts","../../src/generators/mutation-hook.ts","../../src/generators/types-dto.ts","../../src/generators/shared-hook.ts","../../src/generators/validation.ts","../../src/generators/feature.ts","../../src/generators/index.ts","../../src/commands/init.ts","../../bin/cli.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { runGenerate } from './commands/generate.js';\nimport { runInit } from './commands/init.js';\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('rq-codegen')\n .description(\n 'Config-driven code generator for React + TypeScript + React Query projects',\n )\n .version('0.1.1');\n\n program\n .command('init')\n .description('Initialize rqgen.config.ts with auto-detected settings')\n .option('--force', 'Overwrite existing config file')\n .action(runInit);\n\n // Default command: interactive generator selection or direct generator\n program\n .argument('[generator]', 'Generator to run (e.g., handler, page, feature)')\n .action(runGenerate);\n\n return program;\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { loadConfig } from '../config/loader.js';\nimport { executeActions, resetHandlebars } from '../core/engine.js';\nimport { getGenerators } from '../generators/index.js';\n\nexport async function runGenerate(generatorName?: string): Promise<void> {\n let config;\n\n try {\n config = await loadConfig();\n } catch (error) {\n console.error(\n chalk.red('Error loading config:'),\n error instanceof Error ? error.message : error,\n );\n console.log(chalk.yellow('Run \"rq-codegen init\" to create a config file.'));\n process.exit(1);\n }\n\n // Reset handlebars instance for fresh config\n resetHandlebars();\n\n const generators = getGenerators(config);\n\n // If no generator specified, show interactive menu\n if (!generatorName) {\n const choices = generators.map((g) => ({\n name: `${g.name.padEnd(18)} ${chalk.dim('—')} ${g.description}`,\n value: g.name,\n }));\n\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'What would you like to generate?',\n choices,\n },\n ]);\n\n generatorName = selected;\n }\n\n // Find the generator\n const generator = generators.find((g) => g.name === generatorName);\n\n if (!generator) {\n console.error(chalk.red(`Unknown generator: ${generatorName}`));\n console.log(\n chalk.yellow('Available generators:'),\n generators.map((g) => g.name).join(', '),\n );\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n Running: ${generator.name}\\n`));\n\n // Run prompts\n const prompts = generator.prompts(config);\n const answers = await inquirer.prompt(prompts as never);\n\n // Preprocess answers if needed\n const processedAnswers = generator.preprocess\n ? generator.preprocess(answers)\n : answers;\n\n // Get actions\n const actions = generator.actions(processedAnswers, config);\n\n // Execute actions\n const results = await executeActions(actions, processedAnswers, config);\n\n // Display results\n console.log('');\n for (const result of results) {\n switch (result.type) {\n case 'created':\n console.log(chalk.green(' CREATED'), result.message);\n break;\n case 'updated':\n console.log(chalk.blue(' UPDATED'), result.message);\n break;\n case 'skipped':\n console.log(chalk.yellow(' SKIPPED'), result.message);\n break;\n case 'failed':\n console.error(chalk.red(' FAILED'), result.message);\n break;\n }\n }\n\n const created = results.filter((r) => r.type === 'created').length;\n const updated = results.filter((r) => r.type === 'updated').length;\n const failed = results.filter((r) => r.type === 'failed').length;\n\n console.log('');\n if (failed > 0) {\n console.log(chalk.red(` ${failed} action(s) failed.`));\n }\n console.log(\n chalk.green(` Done! ${created} file(s) created, ${updated} barrel(s) updated.\\n`),\n );\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { DEFAULT_CONFIG } from './defaults.js';\nimport { configSchema } from './schema.js';\nimport type { RqCodegenConfig } from './types.js';\n\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceVal = source[key];\n const targetVal = target[key];\n\n if (sourceVal === undefined) continue;\n\n if (\n sourceVal !== null &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n targetVal !== null &&\n typeof targetVal === 'object' &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n ) as T[keyof T];\n } else {\n result[key] = sourceVal as T[keyof T];\n }\n }\n\n return result;\n}\n\nfunction detectAliasesFromTsConfig(projectRoot: string): Partial<RqCodegenConfig['aliases']> | null {\n const configFiles = ['tsconfig.app.json', 'tsconfig.json'];\n\n for (const configFile of configFiles) {\n const fullPath = path.resolve(projectRoot, configFile);\n if (!fs.existsSync(fullPath)) continue;\n\n try {\n const raw = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n const paths: Record<string, string[]> = raw.compilerOptions?.paths ?? {};\n return mapTsPathsToAliases(paths);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nfunction mapTsPathsToAliases(\n paths: Record<string, string[]>,\n): Partial<RqCodegenConfig['aliases']> {\n const aliases: Partial<RqCodegenConfig['aliases']> = {};\n\n const aliasMap: Record<string, keyof RqCodegenConfig['aliases']> = {\n 'api': 'api',\n 'components': 'components',\n 'hooks': 'hooks',\n 'app-types': 'types',\n 'types': 'types',\n 'utils': 'utils',\n 'contexts': 'contexts',\n 'constants': 'constants',\n 'views': 'views',\n 'pages': 'pages',\n 'validations': 'validations',\n 'assets': 'assets',\n 'routes': 'routes',\n 'hoc': 'hoc',\n 'app-config': 'appConfig',\n };\n\n for (const tsAlias of Object.keys(paths)) {\n const match = tsAlias.match(/^@([\\w-]+)/);\n if (!match) continue;\n\n const aliasName = match[1];\n const configKey = aliasMap[aliasName];\n if (configKey) {\n aliases[configKey] = tsAlias.replace('/*', '');\n }\n }\n\n return aliases;\n}\n\nasync function findConfigFile(projectRoot: string): Promise<string | null> {\n const candidates = [\n 'rqgen.config.ts',\n 'rqgen.config.mts',\n 'rqgen.config.js',\n 'rqgen.config.mjs',\n ];\n\n for (const candidate of candidates) {\n const fullPath = path.resolve(projectRoot, candidate);\n if (fs.existsSync(fullPath)) return fullPath;\n }\n\n // Check package.json for \"rqgen\" key\n const pkgPath = path.resolve(projectRoot, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.rqgen) return pkgPath;\n } catch {\n // ignore\n }\n }\n\n return null;\n}\n\nasync function loadConfigFromFile(configPath: string): Promise<Partial<RqCodegenConfig>> {\n const ext = path.extname(configPath);\n const basename = path.basename(configPath);\n\n if (basename === 'package.json') {\n const pkg = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n return pkg.rqgen ?? {};\n }\n\n if (ext === '.ts' || ext === '.mts') {\n try {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(import.meta.url, { interopDefault: true });\n const mod = (await jiti.import(configPath)) as\n | { default?: Partial<RqCodegenConfig> }\n | Partial<RqCodegenConfig>;\n if (mod && typeof mod === 'object' && 'default' in mod && mod.default) {\n return mod.default;\n }\n return mod as Partial<RqCodegenConfig>;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load TypeScript config: ${configPath}\\n${message}`,\n );\n }\n }\n\n // JS/MJS files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return mod.default ?? mod;\n}\n\nexport async function loadConfig(projectRoot?: string): Promise<RqCodegenConfig> {\n const root = projectRoot ?? process.cwd();\n\n // 1. Try to find and load config file\n const configPath = await findConfigFile(root);\n let userConfig: Partial<RqCodegenConfig> = {};\n\n if (configPath) {\n const rawConfig = await loadConfigFromFile(configPath);\n const parsed = configSchema.safeParse(rawConfig);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`);\n throw new Error(`Invalid rqgen config:\\n${errors.join('\\n')}`);\n }\n\n userConfig = parsed.data as Partial<RqCodegenConfig>;\n }\n\n // 2. Auto-detect aliases from tsconfig if not provided in config\n if (!userConfig.aliases) {\n const detected = detectAliasesFromTsConfig(root);\n if (detected) {\n userConfig.aliases = detected as RqCodegenConfig['aliases'];\n }\n }\n\n // 3. Deep-merge with defaults\n const config = deepMerge(DEFAULT_CONFIG, userConfig);\n\n return config;\n}\n\nexport { detectAliasesFromTsConfig };\n","import type { RqCodegenConfig } from './types.js';\n\nexport const DEFAULT_CONFIG: RqCodegenConfig = {\n srcDir: './src',\n\n aliases: {\n api: '@api',\n components: '@components',\n hooks: '@hooks',\n types: '@app-types',\n utils: '@utils',\n contexts: '@contexts',\n constants: '@constants',\n views: '@views',\n pages: '@pages',\n validations: '@validations',\n assets: '@assets',\n routes: '@routes',\n hoc: '@hoc',\n appConfig: '@app-config',\n },\n\n features: {\n i18n: true,\n toast: true,\n barrel: true,\n routeRegistration: false,\n },\n\n naming: {\n dtoSuffixes: {\n read: 'ForReadDto',\n create: 'ForCreateDto',\n update: 'ForUpdateDto',\n list: 'ListDto',\n listResponse: 'ListResponseDto',\n params: 'ParamsDto',\n },\n validationSuffix: '.schema.ts',\n pageSuffix: 'Page',\n hookPrefix: 'use',\n },\n\n paths: {\n handlers: 'api/handlers',\n apiConfig: 'api/config',\n types: 'types/api',\n queries: 'lib/hooks/queries',\n mutations: 'lib/hooks/mutations',\n sharedHooks: 'lib/hooks/shared',\n hookUtils: 'lib/hooks/utils',\n uiComponents: 'components/ui',\n sharedComponents: 'components/shared',\n formComponents: 'components/forms',\n pages: 'pages',\n views: 'views',\n validations: 'validations',\n },\n\n router: {\n routerFile: 'routes/router.tsx',\n routesFile: 'routes/routes.ts',\n layouts: ['MainLayout', 'DashboardLayout'],\n },\n\n hooks: {\n toast: { import: 'useToast', from: '@hooks/shared' },\n translation: { import: 'useAppTranslation', from: '@hooks/shared' },\n paginatedQuery: { import: 'usePaginatedDataTableQuery', from: '@hooks/utils' },\n },\n};\n","import { z } from 'zod';\n\nconst hookImportSchema = z.object({\n import: z.string(),\n from: z.string(),\n});\n\nexport const configSchema = z.object({\n srcDir: z.string().optional(),\n\n aliases: z\n .object({\n api: z.string().optional(),\n components: z.string().optional(),\n hooks: z.string().optional(),\n types: z.string().optional(),\n utils: z.string().optional(),\n contexts: z.string().optional(),\n constants: z.string().optional(),\n views: z.string().optional(),\n pages: z.string().optional(),\n validations: z.string().optional(),\n assets: z.string().optional(),\n routes: z.string().optional(),\n hoc: z.string().optional(),\n appConfig: z.string().optional(),\n })\n .optional(),\n\n features: z\n .object({\n i18n: z.boolean().optional(),\n toast: z.boolean().optional(),\n barrel: z.boolean().optional(),\n routeRegistration: z.boolean().optional(),\n })\n .optional(),\n\n naming: z\n .object({\n dtoSuffixes: z\n .object({\n read: z.string().optional(),\n create: z.string().optional(),\n update: z.string().optional(),\n list: z.string().optional(),\n listResponse: z.string().optional(),\n params: z.string().optional(),\n })\n .optional(),\n validationSuffix: z.string().optional(),\n pageSuffix: z.string().optional(),\n hookPrefix: z.string().optional(),\n })\n .optional(),\n\n paths: z\n .object({\n handlers: z.string().optional(),\n apiConfig: z.string().optional(),\n types: z.string().optional(),\n queries: z.string().optional(),\n mutations: z.string().optional(),\n sharedHooks: z.string().optional(),\n hookUtils: z.string().optional(),\n uiComponents: z.string().optional(),\n sharedComponents: z.string().optional(),\n formComponents: z.string().optional(),\n pages: z.string().optional(),\n views: z.string().optional(),\n validations: z.string().optional(),\n })\n .optional(),\n\n router: z\n .object({\n routerFile: z.string().optional(),\n routesFile: z.string().optional(),\n layouts: z.array(z.string()).optional(),\n })\n .optional(),\n\n hooks: z\n .object({\n toast: hookImportSchema.optional(),\n translation: hookImportSchema.optional(),\n paginatedQuery: hookImportSchema.optional(),\n })\n .optional(),\n\n templatesDir: z.string().optional(),\n});\n\nexport type PartialRqCodegenConfig = z.infer<typeof configSchema>;\n","import fs from 'fs';\nimport path from 'path';\nimport Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\nimport { registerHelpers } from './helpers.js';\nimport { barrelAppend, routeRegister, type ActionResult } from './actions.js';\nimport { resolveTemplatePath } from './template-resolver.js';\nimport { ensureDirectoryExists } from '../utils/fs.js';\n\nexport type GeneratorAction =\n | AddAction\n | BarrelAppendAction\n | RouteRegisterAction;\n\nexport type AddAction = {\n type: 'add';\n path: string;\n templateFile: string;\n data?: Record<string, unknown>;\n};\n\nexport type BarrelAppendAction = {\n type: 'barrel-append';\n path: string;\n exportLine: string;\n};\n\nexport type RouteRegisterAction = {\n type: 'route-register';\n data: {\n pageName: string;\n category: string;\n layout: string;\n isProtected: boolean;\n routePath: string;\n };\n};\n\nlet handlebarsInstance: typeof Handlebars | null = null;\n\nfunction getHandlebars(config: RqCodegenConfig): typeof Handlebars {\n if (!handlebarsInstance) {\n handlebarsInstance = Handlebars.create();\n registerHelpers(handlebarsInstance, config);\n }\n return handlebarsInstance;\n}\n\nexport function resetHandlebars(): void {\n handlebarsInstance = null;\n}\n\nfunction renderString(\n template: string,\n data: Record<string, unknown>,\n config: RqCodegenConfig,\n): string {\n const hbs = getHandlebars(config);\n return hbs.compile(template)(data);\n}\n\nexport async function executeActions(\n actions: GeneratorAction[],\n answers: Record<string, unknown>,\n config: RqCodegenConfig,\n): Promise<ActionResult[]> {\n const results: ActionResult[] = [];\n const hbs = getHandlebars(config);\n\n for (const action of actions) {\n switch (action.type) {\n case 'add': {\n try {\n const mergedData = { ...answers, ...(action.data ?? {}), config };\n const resolvedPath = renderString(action.path, mergedData, config);\n const outputPath = path.resolve(process.cwd(), config.srcDir, resolvedPath);\n\n // Resolve template\n const templatePath = resolveTemplatePath(action.templateFile, config);\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n const compiled = hbs.compile(templateContent);\n const rendered = compiled(mergedData);\n\n ensureDirectoryExists(outputPath);\n\n if (fs.existsSync(outputPath)) {\n results.push({\n type: 'skipped',\n path: outputPath,\n message: 'File already exists',\n });\n } else {\n fs.writeFileSync(outputPath, rendered, 'utf-8');\n results.push({\n type: 'created',\n path: outputPath,\n message: `Created ${resolvedPath}`,\n });\n }\n } catch (error) {\n results.push({\n type: 'failed',\n path: action.path,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n break;\n }\n\n case 'barrel-append': {\n const mergedData = { ...answers, config };\n const result = barrelAppend(action.path, action.exportLine, config, mergedData);\n results.push(result);\n break;\n }\n\n case 'route-register': {\n const routeResults = routeRegister(config, action.data);\n results.push(...routeResults);\n break;\n }\n }\n }\n\n return results;\n}\n","import Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\n\nexport function registerHelpers(handlebars: typeof Handlebars, config: RqCodegenConfig): void {\n // -- Existing helpers (migrated from original) --\n\n handlebars.registerHelper('constantCase', (text: string) => {\n return text\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n });\n\n handlebars.registerHelper('eq', (a: unknown, b: unknown) => a === b);\n\n handlebars.registerHelper('neq', (a: unknown, b: unknown) => a !== b);\n\n handlebars.registerHelper('plural', (text: string) => {\n if (text.endsWith('s')) return text;\n if (text.endsWith('y') && !/[aeiou]y$/i.test(text)) return text.slice(0, -1) + 'ies';\n return text + 's';\n });\n\n handlebars.registerHelper('includes', (arr: string[], val: string) => {\n return Array.isArray(arr) && arr.includes(val);\n });\n\n handlebars.registerHelper('join', (arr: string[], separator: string) => {\n return Array.isArray(arr) ? arr.join(separator) : '';\n });\n\n // -- New config-aware helpers --\n\n handlebars.registerHelper('configAlias', (key: string) => {\n return (config.aliases as Record<string, string>)[key] ?? `@${key}`;\n });\n\n handlebars.registerHelper('configPath', (key: string) => {\n return (config.paths as Record<string, string>)[key] ?? key;\n });\n\n handlebars.registerHelper('dtoSuffix', (key: string) => {\n return (config.naming.dtoSuffixes as Record<string, string>)[key] ?? '';\n });\n\n // Block helper for feature checks\n handlebars.registerHelper('ifFeature', function (\n this: unknown,\n feature: string,\n options: Handlebars.HelperOptions,\n ) {\n const isEnabled = (config.features as Record<string, boolean>)[feature];\n return isEnabled ? options.fn(this) : options.inverse(this);\n });\n\n // Plop built-in helpers that we need to provide\n handlebars.registerHelper('pascalCase', (text: string) => {\n return text\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n });\n\n handlebars.registerHelper('camelCase', (text: string) => {\n return text\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toLowerCase());\n });\n\n handlebars.registerHelper('kebabCase', (text: string) => {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport Handlebars from 'handlebars';\n\nimport type { RqCodegenConfig } from '../config/types.js';\nimport { toPascalCase, toKebabCase, toConstantCase } from '../utils/string.js';\nimport { ensureDirectoryExists } from '../utils/fs.js';\n\nexport type ActionResult = {\n type: 'created' | 'updated' | 'skipped' | 'failed';\n path: string;\n message: string;\n};\n\nexport function barrelAppend(\n barrelRelativePath: string,\n exportLine: string,\n config: RqCodegenConfig,\n data: Record<string, unknown>,\n): ActionResult {\n if (!config.features.barrel) {\n return { type: 'skipped', path: barrelRelativePath, message: 'Barrel updates disabled' };\n }\n\n const handlebars = Handlebars.create();\n // Register needed helpers for rendering\n handlebars.registerHelper('kebabCase', (text: string) =>\n text.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/[\\s_]+/g, '-').toLowerCase(),\n );\n handlebars.registerHelper('pascalCase', (text: string) =>\n text.replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : '')).replace(/^(.)/, (_, c: string) => c.toUpperCase()),\n );\n handlebars.registerHelper('camelCase', (text: string) =>\n text.replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : '')).replace(/^(.)/, (_, c: string) => c.toLowerCase()),\n );\n\n const renderedPath = handlebars.compile(barrelRelativePath)(data);\n const barrelPath = path.resolve(process.cwd(), config.srcDir, renderedPath);\n const renderedExport = handlebars.compile(exportLine)(data);\n\n ensureDirectoryExists(barrelPath);\n\n let content = '';\n if (fs.existsSync(barrelPath)) {\n content = fs.readFileSync(barrelPath, 'utf-8');\n }\n\n if (content.includes(renderedExport)) {\n return { type: 'skipped', path: barrelPath, message: 'Export already exists' };\n }\n\n const trimmedContent = content.trimEnd();\n const newContent = trimmedContent ? `${trimmedContent}\\n${renderedExport}\\n` : `${renderedExport}\\n`;\n\n fs.writeFileSync(barrelPath, newContent, 'utf-8');\n return { type: 'updated', path: barrelPath, message: `Updated barrel: ${renderedPath}` };\n}\n\nexport function routeRegister(\n config: RqCodegenConfig,\n data: {\n pageName: string;\n category: string;\n layout: string;\n isProtected: boolean;\n routePath: string;\n },\n): ActionResult[] {\n const results: ActionResult[] = [];\n const routerFilePath = path.resolve(process.cwd(), config.srcDir, config.router.routerFile);\n const routesFilePath = path.resolve(process.cwd(), config.srcDir, config.router.routesFile);\n\n if (!fs.existsSync(routerFilePath)) {\n return [{ type: 'failed', path: routerFilePath, message: 'Router file not found' }];\n }\n if (!fs.existsSync(routesFilePath)) {\n return [{ type: 'failed', path: routesFilePath, message: 'Routes file not found' }];\n }\n\n const pascalName = toPascalCase(data.pageName);\n const kebabCategory = toKebabCase(data.category);\n const constantCategory = toConstantCase(data.category);\n const constantPage = toConstantCase(data.pageName);\n const pageSuffix = config.naming.pageSuffix;\n const pagesAlias = config.aliases.pages;\n\n // 1. Add lazy import to router file\n let routerContent = fs.readFileSync(routerFilePath, 'utf-8');\n const lazyImportLine = `const ${pascalName}${pageSuffix} = lazy(() => import('${pagesAlias}/${kebabCategory}/${pascalName}${pageSuffix}'));`;\n\n if (!routerContent.includes(lazyImportLine)) {\n const lazyImportRegex = /^const \\w+ = lazy\\(\\(\\) => import\\([^)]+\\)\\);$/gm;\n let lastMatch: RegExpExecArray | null = null;\n let match: RegExpExecArray | null;\n while ((match = lazyImportRegex.exec(routerContent)) !== null) {\n lastMatch = match;\n }\n\n if (lastMatch) {\n const insertPos = lastMatch.index + lastMatch[0].length;\n routerContent =\n routerContent.slice(0, insertPos) + '\\n' + lazyImportLine + routerContent.slice(insertPos);\n fs.writeFileSync(routerFilePath, routerContent, 'utf-8');\n results.push({ type: 'updated', path: routerFilePath, message: `Added lazy import for ${pascalName}${pageSuffix}` });\n } else {\n results.push({\n type: 'failed',\n path: routerFilePath,\n message: `Could not find lazy import insertion point. Add manually:\\n ${lazyImportLine}`,\n });\n }\n } else {\n results.push({ type: 'skipped', path: routerFilePath, message: 'Lazy import already exists' });\n }\n\n // 2. Add route constant to routes file\n let routesContent = fs.readFileSync(routesFilePath, 'utf-8');\n const routeConstant = ` ${constantPage}: '${data.routePath}',`;\n\n // Check if category section exists\n const categoryRegex = new RegExp(`${constantCategory}:\\\\s*\\\\{([^}]*)\\\\}`, 's');\n const categoryMatch = categoryRegex.exec(routesContent);\n\n if (categoryMatch) {\n // Category exists — add the route inside it\n if (!routesContent.includes(routeConstant)) {\n const closingBrace = routesContent.indexOf('}', categoryMatch.index + categoryMatch[0].indexOf('{'));\n routesContent =\n routesContent.slice(0, closingBrace) + routeConstant + '\\n ' + routesContent.slice(closingBrace);\n fs.writeFileSync(routesFilePath, routesContent, 'utf-8');\n results.push({ type: 'updated', path: routesFilePath, message: `Added route constant ${constantCategory}.${constantPage}` });\n } else {\n results.push({ type: 'skipped', path: routesFilePath, message: 'Route constant already exists' });\n }\n } else {\n // Category doesn't exist — add it\n const newSection = ` ${constantCategory}: {\\n ${routeConstant}\\n },`;\n // Find the closing of FULL_ROUTES_PATH\n const fullRoutesEnd = routesContent.lastIndexOf('} as const');\n if (fullRoutesEnd !== -1) {\n routesContent =\n routesContent.slice(0, fullRoutesEnd) + newSection + '\\n' + routesContent.slice(fullRoutesEnd);\n fs.writeFileSync(routesFilePath, routesContent, 'utf-8');\n results.push({ type: 'updated', path: routesFilePath, message: `Added new route category ${constantCategory}` });\n } else {\n results.push({\n type: 'failed',\n path: routesFilePath,\n message: `Could not find FULL_ROUTES_PATH. Add manually:\\n ${constantCategory}: { ${constantPage}: '${data.routePath}' }`,\n });\n }\n }\n\n return results;\n}\n","export function toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (_, c: string) => c.toLowerCase());\n}\n\nexport function toConstantCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function fileExists(filePath: string): boolean {\n return fs.existsSync(path.resolve(process.cwd(), filePath));\n}\n\nexport function dirExists(dirPath: string): boolean {\n const resolved = path.resolve(process.cwd(), dirPath);\n return fs.existsSync(resolved) && fs.statSync(resolved).isDirectory();\n}\n\nexport function getDirectories(dirPath: string): string[] {\n const resolved = path.resolve(process.cwd(), dirPath);\n if (!fs.existsSync(resolved)) return [];\n return fs\n .readdirSync(resolved, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n}\n\nexport function ensureDirectoryExists(filePath: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport type { RqCodegenConfig } from '../config/types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Bundled templates are at the package root /templates/ directory\n// In the built package: dist/core/template-resolver.js → ../../templates/\nconst BUNDLED_TEMPLATES_DIR = path.resolve(__dirname, '../../templates');\n\nexport function resolveTemplatePath(\n templateRelative: string,\n config: RqCodegenConfig,\n): string {\n // 1. Check local override\n if (config.templatesDir) {\n const localPath = path.resolve(process.cwd(), config.templatesDir, templateRelative);\n if (fs.existsSync(localPath)) return localPath;\n }\n\n // 2. Fall back to bundled\n const bundledPath = path.resolve(BUNDLED_TEMPLATES_DIR, templateRelative);\n if (fs.existsSync(bundledPath)) return bundledPath;\n\n throw new Error(\n `Template not found: ${templateRelative}\\n` +\n `Searched:\\n` +\n (config.templatesDir\n ? ` - ${path.resolve(process.cwd(), config.templatesDir, templateRelative)}\\n`\n : '') +\n ` - ${bundledPath}`,\n );\n}\n","export function validateName(value: string): true | string {\n if (!value || value.trim() === '') return 'Name is required';\n if (/[^a-zA-Z0-9-]/.test(value)) return 'Name must be alphanumeric (hyphens allowed)';\n return true;\n}\n\nexport function validatePascalCase(value: string): true | string {\n if (!value || !/^[A-Z][a-zA-Z0-9]*$/.test(value)) {\n return 'Name must be PascalCase (e.g., UserProfile)';\n }\n return true;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentUiAnswers = {\n name: string;\n};\n\nexport function componentUiPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Component name (e.g., StatusIndicator):',\n validate: validateName,\n },\n ];\n}\n\nexport function componentUiActions(\n _answers: ComponentUiAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.uiComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'component-ui/Component.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/index.ts`,\n templateFile: 'component-ui/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentSharedAnswers = {\n name: string;\n subComponentsRaw: string;\n subComponents?: string[];\n};\n\nexport function componentSharedPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Component name (e.g., InfoCard):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'subComponentsRaw',\n message: 'Sub-component names (comma-separated, e.g., Header,Body,Footer):',\n default: 'Header,Body,Footer',\n },\n ];\n}\n\nexport function preprocessComponentSharedAnswers(\n answers: ComponentSharedAnswers,\n): ComponentSharedAnswers {\n return {\n ...answers,\n subComponents: answers.subComponentsRaw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n };\n}\n\nexport function componentSharedActions(\n _answers: ComponentSharedAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.sharedComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'component-shared/Component.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase name}}/index.ts`,\n templateFile: 'component-shared/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ComponentFormAnswers = {\n name: string;\n};\n\nexport function componentFormPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Field name (e.g., DateRange, Slider):',\n validate: validateName,\n },\n ];\n}\n\nexport function componentFormActions(\n _answers: ComponentFormAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n const basePath = config.paths.formComponents;\n\n return [\n {\n type: 'add',\n path: `${basePath}/form-{{kebabCase name}}/Form{{pascalCase name}}.tsx`,\n templateFile: 'component-form/FormComponent.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/form-{{kebabCase name}}/index.ts`,\n templateFile: 'component-form/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './form-{{kebabCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { getDirectories } from '../utils/fs.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type PageAnswers = {\n name: string;\n category: string;\n newCategory?: string;\n registerRoute?: boolean;\n layout?: string;\n isProtected?: boolean;\n routePath?: string;\n};\n\nexport function pagePrompts(config: RqCodegenConfig) {\n const prompts = [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Page name (e.g., Communities, EventDetails):',\n validate: validateName,\n },\n {\n type: 'list' as const,\n name: 'category',\n message: 'Page category (folder):',\n choices: () => {\n const dirs = getDirectories(`${config.srcDir}/${config.paths.pages}`);\n return [...dirs, '── Create new category ──'];\n },\n },\n {\n type: 'input' as const,\n name: 'newCategory',\n message: 'New category name (kebab-case):',\n when: (answers: PageAnswers) => answers.category === '── Create new category ──',\n validate: validateName,\n },\n ];\n\n if (config.features.routeRegistration) {\n prompts.push(\n {\n type: 'confirm' as const,\n name: 'registerRoute',\n message: 'Auto-register route in router?',\n default: true,\n } as never,\n {\n type: 'list' as const,\n name: 'layout',\n message: 'Which layout?',\n choices: () => config.router.layouts,\n when: (answers: PageAnswers) => !!answers.registerRoute,\n } as never,\n {\n type: 'confirm' as const,\n name: 'isProtected',\n message: 'Is this a protected route (requires auth)?',\n default: true,\n when: (answers: PageAnswers) => !!answers.registerRoute,\n } as never,\n {\n type: 'input' as const,\n name: 'routePath',\n message: 'Route path (e.g., communities, events/details):',\n when: (answers: PageAnswers) => !!answers.registerRoute,\n validate: validateName,\n } as never,\n );\n }\n\n return prompts;\n}\n\nexport function preprocessPageAnswers(answers: PageAnswers): PageAnswers {\n if (answers.newCategory) {\n return { ...answers, category: answers.newCategory };\n }\n return answers;\n}\n\nexport function pageActions(answers: PageAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const basePath = config.paths.pages;\n const pageSuffix = config.naming.pageSuffix;\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase category}}/{{pascalCase name}}${pageSuffix}.tsx`,\n templateFile: 'page/Page.tsx.hbs',\n data: { pageSuffix },\n },\n ];\n\n if (config.features.routeRegistration && answers.registerRoute) {\n actions.push({\n type: 'route-register',\n data: {\n pageName: answers.name,\n category: answers.category,\n layout: answers.layout ?? config.router.layouts[0],\n isProtected: answers.isProtected ?? true,\n routePath: answers.routePath ?? answers.name.toLowerCase(),\n },\n });\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { dirExists, getDirectories } from '../utils/fs.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ViewAnswers = {\n feature: string;\n newFeature?: string;\n name: string;\n};\n\nexport function viewPrompts(config: RqCodegenConfig) {\n return [\n {\n type: 'list' as const,\n name: 'feature',\n message: 'Feature (parent folder):',\n choices: () => {\n const dirs = getDirectories(`${config.srcDir}/${config.paths.views}`);\n return [...dirs, '── Create new feature ──'];\n },\n },\n {\n type: 'input' as const,\n name: 'newFeature',\n message: 'New feature name (kebab-case):',\n when: (answers: ViewAnswers) => answers.feature === '── Create new feature ──',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'name',\n message: 'View component name (e.g., CommunityCard):',\n validate: validateName,\n },\n ];\n}\n\nexport function preprocessViewAnswers(answers: ViewAnswers): ViewAnswers {\n if (answers.newFeature) {\n return { ...answers, feature: answers.newFeature };\n }\n return answers;\n}\n\nexport function viewActions(answers: ViewAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const basePath = config.paths.views;\n const isNewFeature = !!answers.newFeature;\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${basePath}/{{kebabCase feature}}/{{kebabCase name}}/{{pascalCase name}}.tsx`,\n templateFile: 'view/View.tsx.hbs',\n },\n {\n type: 'add',\n path: `${basePath}/{{kebabCase feature}}/{{kebabCase name}}/index.ts`,\n templateFile: 'view/index.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${basePath}/{{kebabCase feature}}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n ];\n\n if (isNewFeature || !dirExists(`${config.srcDir}/${config.paths.views}/${answers.feature}`)) {\n actions.push({\n type: 'barrel-append',\n path: `${basePath}/index.ts`,\n exportLine: \"export * from './{{kebabCase feature}}';\",\n });\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { toPascalCase } from '../utils/string.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type HandlerAnswers = {\n name: string;\n singularName: string;\n endpointKey: string;\n operations: string[];\n chainTypes: boolean;\n chainQueryHook: boolean;\n isPaginated?: boolean;\n chainMutationHook: boolean;\n};\n\nexport function handlerPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Entity name (e.g., products):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'singularName',\n message: 'Singular entity name for mutations (e.g., product):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'endpointKey',\n message: 'ApiEndpoints key (e.g., PRODUCTS):',\n },\n {\n type: 'checkbox' as const,\n name: 'operations',\n message: 'Which operations?',\n choices: [\n { name: 'list', value: 'list', checked: true },\n { name: 'details', value: 'details', checked: true },\n { name: 'create', value: 'create' },\n { name: 'update', value: 'update' },\n { name: 'delete', value: 'delete' },\n ],\n },\n {\n type: 'confirm' as const,\n name: 'chainTypes',\n message: 'Also generate DTO types?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'chainQueryHook',\n message: 'Also generate query hook(s)?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is the list endpoint paginated?',\n default: false,\n when: (answers: HandlerAnswers) => {\n const ops = answers.operations;\n return !!answers.chainQueryHook && ops?.includes('list');\n },\n },\n {\n type: 'confirm' as const,\n name: 'chainMutationHook',\n message: 'Also generate mutation hook(s)?',\n default: true,\n },\n ];\n}\n\nexport function handlerActions(answers: HandlerAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const operations = answers.operations || [];\n const entityName = answers.name;\n const singularName = answers.singularName;\n const pascalSingular = toPascalCase(singularName);\n\n const actions: GeneratorAction[] = [\n {\n type: 'add',\n path: `${config.paths.handlers}/{{camelCase name}}.ts`,\n templateFile: 'handler/handler.ts.hbs',\n data: { operations },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.handlers}/index.ts`,\n exportLine: \"export * from './{{camelCase name}}';\",\n },\n ];\n\n // Chain DTO types\n if (answers.chainTypes) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n data: {\n includeCreateDto: operations.includes('create'),\n includeUpdateDto: operations.includes('update'),\n includeParamsDto: true,\n },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n );\n }\n\n // Chain query hooks\n if (answers.chainQueryHook && operations.includes('list')) {\n if (answers.isPaginated) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}PaginatedQuery.ts`,\n templateFile: 'query-hook/hook-paginated.ts.hbs',\n data: { hookName: `${entityName}Paginated`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}PaginatedQuery';\",\n },\n );\n } else {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}ListQuery.ts`,\n templateFile: 'query-hook/hook.ts.hbs',\n data: { hookName: `${entityName}List`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}ListQuery';\",\n },\n );\n }\n }\n\n if (answers.chainQueryHook && operations.includes('details')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}DetailsQuery.ts`,\n templateFile: 'query-hook/hook-details.ts.hbs',\n data: { hookName: `${entityName}Details`, handlerName: entityName, handlerKey: 'details' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}DetailsQuery';\",\n },\n );\n }\n\n // Chain mutation hooks — use singularName for naming\n if (answers.chainMutationHook && operations.includes('create')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useCreate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'create', invalidateKey: 'list', mutationName: `Create${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useCreate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (answers.chainMutationHook && operations.includes('update')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useUpdate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'update', invalidateKey: 'list', mutationName: `Update${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useUpdate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (answers.chainMutationHook && operations.includes('delete')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useDelete${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'remove', invalidateKey: 'list', mutationName: `Delete${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useDelete${pascalSingular}Mutation';`,\n },\n );\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type QueryHookAnswers = {\n name: string;\n handlerName: string;\n handlerKey: string;\n isDetailsQuery: boolean;\n isPaginated?: boolean;\n};\n\nexport function queryHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Hook name suffix (e.g., CommunityList, ProductDetails):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerName',\n message: 'Handler name to import (e.g., Community):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerKey',\n message: 'Handler key (e.g., list, details):',\n default: 'list',\n },\n {\n type: 'confirm' as const,\n name: 'isDetailsQuery',\n message: 'Is this a details/by-id query (takes an id parameter)?',\n default: false,\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is this a paginated list query?',\n default: false,\n when: (answers: QueryHookAnswers) => !answers.isDetailsQuery,\n },\n ];\n}\n\nexport function queryHookActions(answers: QueryHookAnswers, config: RqCodegenConfig): GeneratorAction[] {\n let templateFile: string;\n\n if (answers.isDetailsQuery) {\n templateFile = 'query-hook/hook-details.ts.hbs';\n } else if (answers.isPaginated) {\n templateFile = 'query-hook/hook-paginated.ts.hbs';\n } else {\n templateFile = 'query-hook/hook.ts.hbs';\n }\n\n return [\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}Query.ts`,\n templateFile,\n data: { hookName: answers.name },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}Query';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type MutationHookAnswers = {\n mutationName: string;\n handlerName: string;\n handlerKey: string;\n invalidateKey: string;\n};\n\nexport function mutationHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'mutationName',\n message: 'Mutation name (e.g., CreateCommunity, UpdateUser):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerName',\n message: 'Handler name to import (e.g., Community):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'handlerKey',\n message: 'Handler mutation key (e.g., create, update, remove):',\n default: 'create',\n },\n {\n type: 'input' as const,\n name: 'invalidateKey',\n message: 'Handler query key to invalidate on success (e.g., list):',\n default: 'list',\n },\n ];\n}\n\nexport function mutationHookActions(\n _answers: MutationHookAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.mutations}/use{{pascalCase mutationName}}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: \"export * from './use{{pascalCase mutationName}}Mutation';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type TypesDtoAnswers = {\n name: string;\n includeCreateDto: boolean;\n includeUpdateDto: boolean;\n includeParamsDto: boolean;\n};\n\nexport function typesDtoPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Entity name (e.g., Community, Event):',\n validate: validateName,\n },\n {\n type: 'confirm' as const,\n name: 'includeCreateDto',\n message: 'Include ForCreateDto?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'includeUpdateDto',\n message: 'Include ForUpdateDto?',\n default: true,\n },\n {\n type: 'confirm' as const,\n name: 'includeParamsDto',\n message: 'Include ParamsDto?',\n default: true,\n },\n ];\n}\n\nexport function typesDtoActions(\n _answers: TypesDtoAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type SharedHookAnswers = {\n name: string;\n reactImports: string[];\n};\n\nexport function sharedHookPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Hook name (e.g., WindowSize, Clipboard):',\n validate: validateName,\n },\n {\n type: 'checkbox' as const,\n name: 'reactImports',\n message: 'Which React imports?',\n choices: [\n { name: 'useState', value: 'useState', checked: true },\n { name: 'useEffect', value: 'useEffect', checked: true },\n { name: 'useCallback', value: 'useCallback' },\n { name: 'useMemo', value: 'useMemo' },\n { name: 'useRef', value: 'useRef' },\n ],\n },\n ];\n}\n\nexport function sharedHookActions(\n _answers: SharedHookAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n return [\n {\n type: 'add',\n path: `${config.paths.sharedHooks}/use{{pascalCase name}}.ts`,\n templateFile: 'shared-hook/hook.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.sharedHooks}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}';\",\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type ValidationAnswers = {\n name: string;\n};\n\nexport function validationPrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Schema name (e.g., communitySettings, eventCreate):',\n validate: validateName,\n },\n ];\n}\n\nexport function validationActions(\n _answers: ValidationAnswers,\n config: RqCodegenConfig,\n): GeneratorAction[] {\n // Determine file extension from config (e.g., '.schema.ts' or '.ts')\n const suffix = config.naming.validationSuffix;\n // Strip leading dot and extension for barrel export\n // '.schema.ts' -> file: '{{camelCase name}}.schema.ts', export: './{{camelCase name}}.schema'\n const fileExt = suffix; // e.g., '.schema.ts'\n const barrelExt = suffix.replace(/\\.ts$/, ''); // e.g., '.schema'\n\n return [\n {\n type: 'add',\n path: `${config.paths.validations}/{{camelCase name}}${fileExt}`,\n templateFile: 'validation/validation.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.validations}/index.ts`,\n exportLine: `export * from './{{camelCase name}}${barrelExt}';`,\n },\n ];\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\nimport { toPascalCase } from '../utils/string.js';\nimport { validateName } from '../utils/validation.js';\n\nexport type FeatureAnswers = {\n name: string;\n singularName: string;\n endpointKey: string;\n artifacts: string[];\n isPaginated?: boolean;\n};\n\nexport function featurePrompts() {\n return [\n {\n type: 'input' as const,\n name: 'name',\n message: 'Feature/entity name (e.g., products):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'singularName',\n message: 'Singular entity name for mutations (e.g., product):',\n validate: validateName,\n },\n {\n type: 'input' as const,\n name: 'endpointKey',\n message: 'ApiEndpoints key (e.g., PRODUCTS):',\n },\n {\n type: 'checkbox' as const,\n name: 'artifacts',\n message: 'Which artifacts to generate?',\n choices: [\n { name: 'API Handler', value: 'handler', checked: true },\n { name: 'DTO Types', value: 'types', checked: true },\n { name: 'Query Hook (list)', value: 'queryList', checked: true },\n { name: 'Query Hook (details)', value: 'queryDetails', checked: true },\n { name: 'Mutation Hook (create)', value: 'mutationCreate' },\n { name: 'Mutation Hook (update)', value: 'mutationUpdate' },\n { name: 'Mutation Hook (delete)', value: 'mutationDelete' },\n { name: 'View Component', value: 'view' },\n { name: 'Page Component', value: 'page' },\n { name: 'Validation Schema', value: 'validation' },\n ],\n },\n {\n type: 'confirm' as const,\n name: 'isPaginated',\n message: 'Is the list endpoint paginated?',\n default: false,\n when: (answers: FeatureAnswers) => {\n return answers.artifacts?.includes('queryList');\n },\n },\n ];\n}\n\nexport function featureActions(answers: FeatureAnswers, config: RqCodegenConfig): GeneratorAction[] {\n const artifacts = answers.artifacts || [];\n const actions: GeneratorAction[] = [];\n const entityName = answers.name;\n const singularName = answers.singularName;\n const pascalSingular = toPascalCase(singularName);\n const validationSuffix = config.naming.validationSuffix;\n const validationBarrelExt = validationSuffix.replace(/\\.ts$/, '');\n\n // 1. DTO Types (first, so handler can reference them)\n if (artifacts.includes('types')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.types}/{{pascalCase name}}Dto.ts`,\n templateFile: 'types-dto/dto.ts.hbs',\n data: {\n includeCreateDto: artifacts.includes('mutationCreate'),\n includeUpdateDto: artifacts.includes('mutationUpdate'),\n includeParamsDto: true,\n },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.types}/index.ts`,\n exportLine: \"export * from './{{pascalCase name}}Dto';\",\n },\n );\n }\n\n // 2. Handler\n if (artifacts.includes('handler')) {\n const operations: string[] = ['list', 'details'];\n if (artifacts.includes('mutationCreate')) operations.push('create');\n if (artifacts.includes('mutationUpdate')) operations.push('update');\n if (artifacts.includes('mutationDelete')) operations.push('delete');\n\n actions.push(\n {\n type: 'add',\n path: `${config.paths.handlers}/{{camelCase name}}.ts`,\n templateFile: 'handler/handler.ts.hbs',\n data: { operations, endpointKey: answers.endpointKey },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.handlers}/index.ts`,\n exportLine: \"export * from './{{camelCase name}}';\",\n },\n );\n }\n\n // 3. Query Hooks\n if (artifacts.includes('queryList')) {\n if (answers.isPaginated) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}PaginatedQuery.ts`,\n templateFile: 'query-hook/hook-paginated.ts.hbs',\n data: { hookName: `${entityName}Paginated`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}PaginatedQuery';\",\n },\n );\n } else {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}ListQuery.ts`,\n templateFile: 'query-hook/hook.ts.hbs',\n data: { hookName: `${entityName}List`, handlerName: entityName, handlerKey: 'list' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}ListQuery';\",\n },\n );\n }\n }\n\n if (artifacts.includes('queryDetails')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.queries}/use{{pascalCase name}}DetailsQuery.ts`,\n templateFile: 'query-hook/hook-details.ts.hbs',\n data: { hookName: `${entityName}Details`, handlerName: entityName, handlerKey: 'details' },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.queries}/index.ts`,\n exportLine: \"export * from './use{{pascalCase name}}DetailsQuery';\",\n },\n );\n }\n\n // 4. Mutation Hooks — use singularName for naming\n if (artifacts.includes('mutationCreate')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useCreate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'create', invalidateKey: 'list', mutationName: `Create${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useCreate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (artifacts.includes('mutationUpdate')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useUpdate${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'update', invalidateKey: 'list', mutationName: `Update${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useUpdate${pascalSingular}Mutation';`,\n },\n );\n }\n\n if (artifacts.includes('mutationDelete')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.mutations}/useDelete${pascalSingular}Mutation.ts`,\n templateFile: 'mutation-hook/hook.ts.hbs',\n data: { handlerName: entityName, handlerKey: 'remove', invalidateKey: 'list', mutationName: `Delete${pascalSingular}` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.mutations}/index.ts`,\n exportLine: `export * from './useDelete${pascalSingular}Mutation';`,\n },\n );\n }\n\n // 5. View\n if (artifacts.includes('view')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.views}/{{kebabCase name}}/{{kebabCase name}}-list/{{pascalCase name}}List.tsx`,\n templateFile: 'view/View.tsx.hbs',\n data: { name: `${entityName}List` },\n },\n {\n type: 'add',\n path: `${config.paths.views}/{{kebabCase name}}/{{kebabCase name}}-list/index.ts`,\n templateFile: 'view/index.ts.hbs',\n data: { name: `${entityName}List` },\n },\n {\n type: 'barrel-append',\n path: `${config.paths.views}/{{kebabCase name}}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}-list';\",\n },\n {\n type: 'barrel-append',\n path: `${config.paths.views}/index.ts`,\n exportLine: \"export * from './{{kebabCase name}}';\",\n },\n );\n }\n\n // 6. Page\n if (artifacts.includes('page')) {\n const pageSuffix = config.naming.pageSuffix;\n actions.push({\n type: 'add',\n path: `${config.paths.pages}/{{kebabCase name}}/{{pascalCase name}}${pageSuffix}.tsx`,\n templateFile: 'page/Page.tsx.hbs',\n data: { pageSuffix },\n });\n }\n\n // 7. Validation\n if (artifacts.includes('validation')) {\n actions.push(\n {\n type: 'add',\n path: `${config.paths.validations}/{{camelCase name}}${validationSuffix}`,\n templateFile: 'validation/validation.ts.hbs',\n },\n {\n type: 'barrel-append',\n path: `${config.paths.validations}/index.ts`,\n exportLine: `export * from './{{camelCase name}}${validationBarrelExt}';`,\n },\n );\n }\n\n return actions;\n}\n","import type { RqCodegenConfig } from '../config/types.js';\nimport type { GeneratorAction } from '../core/engine.js';\n\nimport { componentUiPrompts, componentUiActions } from './component-ui.js';\nimport { componentSharedPrompts, componentSharedActions, preprocessComponentSharedAnswers } from './component-shared.js';\nimport { componentFormPrompts, componentFormActions } from './component-form.js';\nimport { pagePrompts, pageActions, preprocessPageAnswers } from './page.js';\nimport { viewPrompts, viewActions, preprocessViewAnswers } from './view.js';\nimport { handlerPrompts, handlerActions } from './handler.js';\nimport { queryHookPrompts, queryHookActions } from './query-hook.js';\nimport { mutationHookPrompts, mutationHookActions } from './mutation-hook.js';\nimport { typesDtoPrompts, typesDtoActions } from './types-dto.js';\nimport { sharedHookPrompts, sharedHookActions } from './shared-hook.js';\nimport { validationPrompts, validationActions } from './validation.js';\nimport { featurePrompts, featureActions } from './feature.js';\n\nexport type GeneratorDefinition = {\n name: string;\n description: string;\n prompts: (config: RqCodegenConfig) => unknown[];\n actions: (answers: Record<string, unknown>, config: RqCodegenConfig) => GeneratorAction[];\n preprocess?: (answers: Record<string, unknown>) => Record<string, unknown>;\n};\n\nexport function getGenerators(_config: RqCodegenConfig): GeneratorDefinition[] {\n // _config is available for future use; generators access it via their actions callback\n return [\n {\n name: 'component-ui',\n description: 'CVA-based UI component (shadcn/ui style)',\n prompts: () => componentUiPrompts(),\n actions: (answers, cfg) => componentUiActions(answers as never, cfg),\n },\n {\n name: 'component-shared',\n description: 'Compound shared component',\n prompts: () => componentSharedPrompts(),\n actions: (answers, cfg) => componentSharedActions(answers as never, cfg),\n preprocess: (answers) => preprocessComponentSharedAnswers(answers as never),\n },\n {\n name: 'component-form',\n description: 'React Hook Form component (useController-based)',\n prompts: () => componentFormPrompts(),\n actions: (answers, cfg) => componentFormActions(answers as never, cfg),\n },\n {\n name: 'page',\n description: 'Route-level page component',\n prompts: (cfg) => pagePrompts(cfg),\n actions: (answers, cfg) => pageActions(answers as never, cfg),\n preprocess: (answers) => preprocessPageAnswers(answers as never),\n },\n {\n name: 'view',\n description: 'Feature view component',\n prompts: (cfg) => viewPrompts(cfg),\n actions: (answers, cfg) => viewActions(answers as never, cfg),\n preprocess: (answers) => preprocessViewAnswers(answers as never),\n },\n {\n name: 'handler',\n description: 'API handler (+ types + hooks)',\n prompts: () => handlerPrompts(),\n actions: (answers, cfg) => handlerActions(answers as never, cfg),\n },\n {\n name: 'query-hook',\n description: 'React Query hook',\n prompts: () => queryHookPrompts(),\n actions: (answers, cfg) => queryHookActions(answers as never, cfg),\n },\n {\n name: 'mutation-hook',\n description: 'React Query mutation hook',\n prompts: () => mutationHookPrompts(),\n actions: (answers, cfg) => mutationHookActions(answers as never, cfg),\n },\n {\n name: 'types-dto',\n description: 'DTO type definitions',\n prompts: () => typesDtoPrompts(),\n actions: (answers, cfg) => typesDtoActions(answers as never, cfg),\n },\n {\n name: 'shared-hook',\n description: 'Custom utility hook',\n prompts: () => sharedHookPrompts(),\n actions: (answers, cfg) => sharedHookActions(answers as never, cfg),\n },\n {\n name: 'validation',\n description: 'Zod validation schema',\n prompts: () => validationPrompts(),\n actions: (answers, cfg) => validationActions(answers as never, cfg),\n },\n {\n name: 'feature',\n description: 'Full feature scaffold (handler + types + hooks + view + page)',\n prompts: () => featurePrompts(),\n actions: (answers, cfg) => featureActions(answers as never, cfg),\n },\n ];\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { detectAliasesFromTsConfig } from '../config/loader.js';\n\ntype InitOptions = {\n force?: boolean;\n};\n\nexport async function runInit(options: InitOptions): Promise<void> {\n const configPath = path.resolve(process.cwd(), 'rqgen.config.ts');\n\n if (fs.existsSync(configPath) && !options.force) {\n console.error(\n chalk.red('Config file already exists: rqgen.config.ts'),\n );\n console.log(chalk.yellow('Use --force to overwrite.'));\n process.exit(1);\n }\n\n console.log(chalk.cyan('\\n Initializing @appswave/rq-codegen config...\\n'));\n\n // Auto-detect\n const detectedAliases = detectAliasesFromTsConfig(process.cwd());\n const srcDirExists = fs.existsSync(path.resolve(process.cwd(), 'src'));\n const srcDir = srcDirExists ? './src' : '.';\n\n const hasRouter = fs.existsSync(\n path.resolve(process.cwd(), srcDir, 'routes/router.tsx'),\n );\n\n const hasI18n =\n fs.existsSync(path.resolve(process.cwd(), srcDir, 'locales')) ||\n fs.existsSync(path.resolve(process.cwd(), 'i18next.config.ts'));\n\n // Interactive questions\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'i18n',\n message: 'Does your project use i18n (i18next)?',\n default: hasI18n,\n },\n {\n type: 'confirm',\n name: 'toast',\n message: 'Does your project use toast notifications?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'routeRegistration',\n message: 'Enable automatic route registration when generating pages?',\n default: hasRouter,\n },\n ]);\n\n // Build config content\n const aliasesStr = detectedAliases\n ? formatAliases(detectedAliases)\n : ' // Auto-detected from tsconfig.json — customize if needed';\n\n const configContent = `import { defineConfig } from '@appswave/rq-codegen';\n\nexport default defineConfig({\n srcDir: '${srcDir}',\n\n aliases: {\n${aliasesStr}\n },\n\n features: {\n i18n: ${answers.i18n},\n toast: ${answers.toast},\n barrel: true,\n routeRegistration: ${answers.routeRegistration},\n },\n\n naming: {\n dtoSuffixes: {\n read: 'ForReadDto',\n create: 'ForCreateDto',\n update: 'ForUpdateDto',\n list: 'ListDto',\n listResponse: 'ListResponseDto',\n params: 'ParamsDto',\n },\n validationSuffix: '.schema.ts',\n pageSuffix: 'Page',\n hookPrefix: 'use',\n },\n\n paths: {\n handlers: 'api/handlers',\n apiConfig: 'api/config',\n types: 'types/api',\n queries: 'lib/hooks/queries',\n mutations: 'lib/hooks/mutations',\n sharedHooks: 'lib/hooks/shared',\n hookUtils: 'lib/hooks/utils',\n uiComponents: 'components/ui',\n sharedComponents: 'components/shared',\n formComponents: 'components/forms',\n pages: 'pages',\n views: 'views',\n validations: 'validations',\n },\n${\n answers.routeRegistration\n ? `\n router: {\n routerFile: 'routes/router.tsx',\n routesFile: 'routes/routes.ts',\n layouts: ['MainLayout', 'DashboardLayout'],\n },\n`\n : ''\n}\n hooks: {\n toast: { import: 'useToast', from: '@hooks/shared' },\n translation: { import: 'useAppTranslation', from: '@hooks/shared' },\n paginatedQuery: { import: 'usePaginatedDataTableQuery', from: '@hooks/utils' },\n },\n});\n`;\n\n fs.writeFileSync(configPath, configContent, 'utf-8');\n console.log(chalk.green(' Created rqgen.config.ts'));\n console.log(chalk.dim(' Edit the config to customize paths, aliases, and features.\\n'));\n}\n\nfunction formatAliases(\n aliases: Partial<Record<string, string>>,\n): string {\n const lines: string[] = [];\n const keyMap: Record<string, string> = {\n api: 'api',\n components: 'components',\n hooks: 'hooks',\n types: 'types',\n utils: 'utils',\n contexts: 'contexts',\n constants: 'constants',\n views: 'views',\n pages: 'pages',\n validations: 'validations',\n assets: 'assets',\n routes: 'routes',\n hoc: 'hoc',\n appConfig: 'appConfig',\n };\n\n for (const [key, configKey] of Object.entries(keyMap)) {\n const value = aliases[key as keyof typeof aliases];\n if (value) {\n lines.push(` ${configKey}: '${value}',`);\n }\n }\n\n return lines.length > 0\n ? lines.join('\\n')\n : ' // No aliases detected — add your path aliases here';\n}\n","import { createCli } from '../src/cli.js';\n\nconst program = createCli();\nprogram.parse(process.argv);\n"],"mappings":"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","names":["mod","fs","path","Handlebars","fs","path","fs","path","path","fs","path","fs","fs","path","Handlebars","path","fs","fs","path","chalk","inquirer","path","fs","chalk","inquirer","program"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appswave/rq-codegen",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Config-driven code generator for React + TypeScript projects with React Query, handlers, DTOs, and more",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"chalk": "^5.3.0",
|
|
50
50
|
"commander": "^12.1.0",
|
|
51
|
-
"cosmiconfig": "^9.0.0",
|
|
52
51
|
"handlebars": "^4.7.8",
|
|
53
52
|
"inquirer": "^9.3.7",
|
|
53
|
+
"jiti": "^2.6.1",
|
|
54
54
|
"ora": "^8.1.1",
|
|
55
55
|
"zod": "^3.23.8"
|
|
56
56
|
},
|