@famgia/omnify-cli 0.0.76 → 0.0.78
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/cli.js +44 -8
- package/dist/cli.js.map +1 -1
- package/package.json +6 -6
package/dist/cli.js
CHANGED
|
@@ -1831,15 +1831,17 @@ async function runReset(options) {
|
|
|
1831
1831
|
const rootDir = configPath2 ? dirname5(configPath2) : process.cwd();
|
|
1832
1832
|
const paths = [];
|
|
1833
1833
|
const omnifyBasePaths = [
|
|
1834
|
-
"app/Models/OmnifyBase",
|
|
1835
|
-
"backend/app/
|
|
1836
|
-
"
|
|
1834
|
+
{ name: "OmnifyBase models", paths: ["app/Models/OmnifyBase", "backend/app/Models/OmnifyBase"] },
|
|
1835
|
+
{ name: "OmnifyBase requests", paths: ["app/Http/Requests/OmnifyBase", "backend/app/Http/Requests/OmnifyBase"] },
|
|
1836
|
+
{ name: "OmnifyBase resources", paths: ["app/Http/Resources/OmnifyBase", "backend/app/Http/Resources/OmnifyBase"] }
|
|
1837
1837
|
];
|
|
1838
|
-
for (const
|
|
1839
|
-
const
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1838
|
+
for (const { name, paths: relPaths } of omnifyBasePaths) {
|
|
1839
|
+
for (const relPath of relPaths) {
|
|
1840
|
+
const omnifyBasePath = resolve7(rootDir, relPath);
|
|
1841
|
+
if (existsSync5(omnifyBasePath)) {
|
|
1842
|
+
paths.push({ name, path: omnifyBasePath, type: "dir" });
|
|
1843
|
+
break;
|
|
1844
|
+
}
|
|
1843
1845
|
}
|
|
1844
1846
|
}
|
|
1845
1847
|
const migrationPaths = [
|
|
@@ -1877,6 +1879,40 @@ async function runReset(options) {
|
|
|
1877
1879
|
});
|
|
1878
1880
|
}
|
|
1879
1881
|
}
|
|
1882
|
+
const typescriptPath = config.output.typescript?.path;
|
|
1883
|
+
const tsBasePath = typescriptPath ? resolve7(rootDir, typescriptPath) : null;
|
|
1884
|
+
const commonTsPaths = [
|
|
1885
|
+
"resources/ts/types/models",
|
|
1886
|
+
"frontend/src/types/model",
|
|
1887
|
+
"frontend/src/types/models",
|
|
1888
|
+
"src/types/models"
|
|
1889
|
+
];
|
|
1890
|
+
let foundTsPath = tsBasePath;
|
|
1891
|
+
if (!foundTsPath || !existsSync5(foundTsPath)) {
|
|
1892
|
+
for (const relPath of commonTsPaths) {
|
|
1893
|
+
const tsPath = resolve7(rootDir, relPath);
|
|
1894
|
+
if (existsSync5(tsPath)) {
|
|
1895
|
+
foundTsPath = tsPath;
|
|
1896
|
+
break;
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
}
|
|
1900
|
+
if (foundTsPath && existsSync5(foundTsPath)) {
|
|
1901
|
+
const autoGeneratedDirs = ["base", "enum", "rules"];
|
|
1902
|
+
for (const subDir of autoGeneratedDirs) {
|
|
1903
|
+
const subPath = join(foundTsPath, subDir);
|
|
1904
|
+
if (existsSync5(subPath)) {
|
|
1905
|
+
paths.push({ name: `TypeScript ${subDir}`, path: subPath, type: "dir" });
|
|
1906
|
+
}
|
|
1907
|
+
}
|
|
1908
|
+
const autoGeneratedFiles = ["common.ts", "index.ts"];
|
|
1909
|
+
for (const fileName of autoGeneratedFiles) {
|
|
1910
|
+
const filePath = join(foundTsPath, fileName);
|
|
1911
|
+
if (existsSync5(filePath)) {
|
|
1912
|
+
paths.push({ name: `TypeScript ${fileName}`, path: filePath, type: "file" });
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1880
1916
|
const lockFilePath = resolve7(rootDir, config.lockFilePath);
|
|
1881
1917
|
if (existsSync5(lockFilePath)) {
|
|
1882
1918
|
paths.push({ name: "Lock file", path: lockFilePath, type: "file" });
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/output/logger.ts","../src/commands/validate.ts","../src/config/loader.ts","../src/commands/diff.ts","../src/operations/diff.ts","../src/commands/generate.ts","../src/guides/index.ts","../src/commands/reset.ts","../src/commands/create-project.ts"],"sourcesContent":["/**\n * @famgia/omnify-cli - CLI Runner\n * This file contains the actual CLI execution logic.\n * Import this file to run the CLI (has side effects).\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n registerResetCommand,\n registerCreateProjectCommand,\n runInit,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.5';\n\n/**\n * Main CLI program.\n */\nconst program = new Command();\n\nprogram\n .name('omnify')\n .description('Schema-first database migrations for Laravel and TypeScript')\n .version(VERSION);\n\n// Register commands\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterDiffCommand(program);\nregisterGenerateCommand(program);\nregisterResetCommand(program);\nregisterCreateProjectCommand(program);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else {\n logger.error(error.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n if (reason instanceof OmnifyError) {\n logger.formatError(reason);\n process.exit(logger.getExitCode(reason));\n } else if (reason instanceof Error) {\n logger.error(reason.message);\n } else {\n logger.error(String(reason));\n }\n process.exit(1);\n});\n\n// Check if we should auto-run init\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst hasCommand = firstArg !== undefined && !firstArg.startsWith('-');\nconst configPath = resolve(process.cwd(), 'omnify.config.ts');\nconst hasConfig = existsSync(configPath);\n\nif (!hasCommand && !hasConfig) {\n // No command specified and no config exists → run init\n runInit({}).catch((error) => {\n if (error instanceof Error) {\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n });\n} else {\n // Parse CLI arguments normally\n program.parse();\n}\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with interactive configuration.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { logger } from '../output/logger.js';\n\n/**\n * Migration tool options.\n */\ntype MigrationTool = 'laravel' | 'prisma' | 'drizzle' | 'none';\n\n/**\n * Project configuration from prompts.\n */\ninterface ProjectConfig {\n database: 'mysql' | 'postgres' | 'sqlite';\n migrationTool: MigrationTool;\n generateTypes: boolean;\n migrationsPath: string;\n typesPath: string;\n schemasDir: string;\n}\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://github.com/famgia/omnify for documentation\n\nname: User\ndisplayName: User Account\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n displayName: Email Address\n\n name:\n type: String\n displayName: Full Name\n\n bio:\n type: Text\n nullable: true\n displayName: Biography\n\noptions:\n timestamps: true\n softDelete: true\n`;\n\n/**\n * Generates config file content based on project configuration.\n */\nfunction generateConfig(config: ProjectConfig): string {\n const imports: string[] = [`import { defineConfig } from '@famgia/omnify';`];\n const plugins: string[] = [];\n\n // Add Laravel plugin\n if (config.migrationTool === 'laravel') {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n migrationsPath: '${config.migrationsPath}',\n typesPath: '${config.typesPath}',\n singleFile: true,\n generateMigrations: true,\n generateTypes: ${config.generateTypes},\n }),`);\n }\n\n // Prisma plugin (coming soon)\n if (config.migrationTool === 'prisma') {\n plugins.push(` // Prisma plugin coming soon!\n // prisma({ schemaPath: 'prisma/schema.prisma' }),`);\n }\n\n // Drizzle plugin (coming soon)\n if (config.migrationTool === 'drizzle') {\n plugins.push(` // Drizzle plugin coming soon!\n // drizzle({ schemaPath: 'src/db/schema.ts' }),`);\n }\n\n // TypeScript-only (no migration tool)\n if (config.migrationTool === 'none' && config.generateTypes) {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n typesPath: '${config.typesPath}',\n generateMigrations: false,\n generateTypes: true,\n }),`);\n }\n\n // Database URL examples\n const dbUrlExamples: Record<string, string> = {\n mysql: 'mysql://root:password@localhost:3306/omnify_dev',\n postgres: 'postgres://postgres:password@localhost:5432/omnify_dev',\n sqlite: 'sqlite://./omnify_dev.db',\n };\n\n return `${imports.join('\\n')}\n\nexport default defineConfig({\n // Schema files location\n schemasDir: '${config.schemasDir}',\n\n // Lock file for tracking schema changes\n lockFilePath: './omnify.lock',\n\n // Database configuration\n database: {\n driver: '${config.database}',\n // REQUIRED: Set your development database URL\n // devUrl: '${dbUrlExamples[config.database]}',\n },\n\n // Generator plugins\n plugins: [\n${plugins.join('\\n\\n')}\n ],\n});\n`;\n}\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n yes?: boolean;\n}\n\n/**\n * Runs the init command with interactive prompts.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Omnify Project Setup');\n logger.newline();\n\n // Check if config already exists\n const configPath = resolve(cwd, 'omnify.config.ts');\n if (existsSync(configPath) && !options.force) {\n logger.warn('omnify.config.ts already exists. Use --force to overwrite.');\n return;\n }\n\n let config: ProjectConfig;\n\n if (options.yes) {\n // Use defaults (Laravel)\n config = {\n database: 'mysql',\n migrationTool: 'laravel',\n generateTypes: true,\n migrationsPath: 'database/migrations',\n typesPath: 'resources/js/types',\n schemasDir: './schemas',\n };\n logger.info('Using default configuration...');\n } else {\n // Interactive prompts\n logger.info('Answer a few questions to configure your project:\\n');\n\n // 1. Database selection\n const database = await select({\n message: 'Which database?',\n choices: [\n { name: 'MySQL / MariaDB', value: 'mysql' as const },\n { name: 'PostgreSQL', value: 'postgres' as const },\n { name: 'SQLite', value: 'sqlite' as const },\n ],\n default: 'mysql',\n });\n\n // 2. Migration tool selection\n const migrationTool = await select({\n message: 'Which migration tool?',\n choices: [\n { name: 'Laravel (PHP)', value: 'laravel' as const },\n { name: 'Prisma (coming soon)', value: 'prisma' as const, disabled: true },\n { name: 'Drizzle (coming soon)', value: 'drizzle' as const, disabled: true },\n { name: 'None (types only)', value: 'none' as const },\n ],\n default: 'laravel',\n });\n\n // 3. TypeScript types\n const generateTypes = await confirm({\n message: 'Generate TypeScript types?',\n default: true,\n });\n\n // Default paths based on migration tool\n const defaultPaths: Record<MigrationTool, { migrations: string; types: string }> = {\n laravel: { migrations: 'database/migrations', types: 'resources/js/types' },\n prisma: { migrations: 'prisma/migrations', types: 'src/types' },\n drizzle: { migrations: 'drizzle', types: 'src/types' },\n none: { migrations: '', types: 'types' },\n };\n\n const defaults = defaultPaths[migrationTool];\n let migrationsPath = defaults.migrations;\n let typesPath = defaults.types;\n\n if (migrationTool !== 'none') {\n migrationsPath = await input({\n message: 'Migrations output path:',\n default: defaults.migrations,\n });\n }\n\n if (generateTypes) {\n typesPath = await input({\n message: 'TypeScript types path:',\n default: defaults.types,\n });\n }\n\n // Schemas directory\n const schemasDir = await input({\n message: 'Schemas directory:',\n default: './schemas',\n });\n\n config = {\n database,\n migrationTool,\n generateTypes,\n migrationsPath,\n typesPath,\n schemasDir,\n };\n }\n\n logger.newline();\n logger.step('Creating project files...');\n\n // Create schemas directory\n const schemasDir = resolve(cwd, config.schemasDir);\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created ${config.schemasDir}/ directory`);\n }\n\n // Create example schema\n const examplePath = resolve(schemasDir, 'User.yaml');\n if (!existsSync(examplePath) || options.force) {\n writeFileSync(examplePath, EXAMPLE_SCHEMA);\n logger.debug('Created example schema: User.yaml');\n }\n\n // Create config file\n const configContent = generateConfig(config);\n writeFileSync(configPath, configContent);\n logger.debug('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized!');\n logger.newline();\n\n // Summary\n const toolName =\n config.migrationTool === 'laravel'\n ? 'Laravel'\n : config.migrationTool === 'prisma'\n ? 'Prisma'\n : config.migrationTool === 'drizzle'\n ? 'Drizzle'\n : 'None';\n\n logger.info('Configuration:');\n logger.list([\n `Database: ${config.database}`,\n `Migration tool: ${toolName}`,\n `TypeScript types: ${config.generateTypes ? 'Yes' : 'No'}`,\n ]);\n\n logger.newline();\n logger.info('Files created:');\n logger.list(['omnify.config.ts', `${config.schemasDir}/User.yaml`]);\n\n logger.newline();\n logger.info('Next steps:');\n logger.newline();\n\n logger.step('1. Set database URL in omnify.config.ts');\n logger.newline();\n\n logger.step('2. Define schemas in ' + config.schemasDir + '/');\n logger.newline();\n\n logger.step('3. Generate:');\n logger.info(' npx omnify validate');\n logger.info(' npx omnify generate');\n logger.newline();\n}\n\n/**\n * Registers the init command.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new omnify project')\n .option('-f, --force', 'Overwrite existing files')\n .option('-y, --yes', 'Use default configuration (skip prompts)')\n .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\n // Handle Ctrl+C gracefully\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Logger\n *\n * CLI output and logging utilities.\n */\n\nimport pc from 'picocolors';\nimport { OmnifyError, formatError, getExitCode } from '@famgia/omnify-core';\n\n/**\n * Logger options.\n */\nexport interface LoggerOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Suppress all output except errors */\n quiet?: boolean;\n}\n\n/**\n * CLI Logger for formatted output.\n */\nexport class Logger {\n private _verbose: boolean;\n private _quiet: boolean;\n private _startTime: number;\n\n constructor(options: LoggerOptions = {}) {\n this._verbose = options.verbose ?? false;\n this._quiet = options.quiet ?? false;\n this._startTime = Date.now();\n }\n\n /**\n * Enable or disable verbose mode.\n */\n setVerbose(verbose: boolean): void {\n this._verbose = verbose;\n }\n\n /**\n * Enable or disable quiet mode.\n */\n setQuiet(quiet: boolean): void {\n this._quiet = quiet;\n }\n\n /**\n * Log an info message.\n */\n info(message: string): void {\n if (!this._quiet) {\n console.log(message);\n }\n }\n\n /**\n * Log a success message.\n */\n success(message: string): void {\n if (!this._quiet) {\n console.log(pc.green('✓') + ' ' + message);\n }\n }\n\n /**\n * Log a warning message.\n */\n warn(message: string): void {\n if (!this._quiet) {\n console.log(pc.yellow('⚠') + ' ' + pc.yellow(message));\n }\n }\n\n /**\n * Log an error message.\n */\n error(message: string): void {\n console.error(pc.red('✗') + ' ' + pc.red(message));\n }\n\n /**\n * Log a debug message (only in verbose mode).\n */\n debug(message: string): void {\n if (this._verbose && !this._quiet) {\n console.log(pc.dim(' ' + message));\n }\n }\n\n /**\n * Log a step message.\n */\n step(message: string): void {\n if (!this._quiet) {\n console.log(pc.cyan('→') + ' ' + message);\n }\n }\n\n /**\n * Log a header.\n */\n header(message: string): void {\n if (!this._quiet) {\n console.log();\n console.log(pc.bold(message));\n console.log();\n }\n }\n\n /**\n * Log a list item.\n */\n list(items: string[]): void {\n if (!this._quiet) {\n for (const item of items) {\n console.log(' • ' + item);\n }\n }\n }\n\n /**\n * Log a timing message.\n */\n timing(message: string): void {\n if (this._verbose && !this._quiet) {\n const elapsed = Date.now() - this._startTime;\n console.log(pc.dim(` [${elapsed}ms] ${message}`));\n }\n }\n\n /**\n * Log an empty line.\n */\n newline(): void {\n if (!this._quiet) {\n console.log();\n }\n }\n\n /**\n * Format and log an OmnifyError.\n */\n formatError(error: OmnifyError): void {\n const formatted = formatError(error, { color: true });\n console.error(formatted);\n }\n\n /**\n * Get exit code for an error.\n */\n getExitCode(error: OmnifyError): number {\n return getExitCode(error);\n }\n}\n\n/**\n * Global logger instance.\n */\nexport const logger = new Logger();\n","/**\n * @famgia/omnify-cli - Validate Command\n *\n * Validates schema files for syntax and semantic errors.\n */\n\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Validate command options.\n */\ninterface ValidateOptions {\n verbose?: boolean;\n}\n\n/**\n * Runs the validate command.\n */\nexport async function runValidate(options: ValidateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Validating Schemas');\n\n // Load configuration\n logger.debug('Loading configuration...');\n logger.timing('Config load start');\n const { config, configPath } = await loadConfig();\n logger.timing('Config loaded');\n\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (checks schema directory exists)\n validateConfig(config, rootDir);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n logger.timing('Schema load start');\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n logger.timing('Schemas loaded');\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Validate schemas\n logger.step('Validating schemas...');\n logger.timing('Validation start');\n\n const result = validateSchemas(schemas);\n logger.timing('Validation complete');\n\n if (result.valid) {\n logger.success(`All ${schemaCount} schema(s) are valid`);\n } else {\n logger.error(`Found ${result.errors.length} validation error(s)`);\n logger.newline();\n\n for (const error of result.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n logger.newline();\n }\n\n process.exit(2);\n }\n}\n\n/**\n * Registers the validate command.\n */\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate')\n .description('Validate schema files')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (options: ValidateOptions) => {\n try {\n await runValidate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Configuration Loader\n *\n * Loads and resolves omnify.config.ts configuration.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { createJiti } from 'jiti';\nimport type { OmnifyConfig, ResolvedOmnifyConfig, OmnifyPlugin } from '@famgia/omnify-types';\nimport type { ConfigLoadResult } from './types.js';\nimport { configError, configNotFoundError } from '@famgia/omnify-core';\n\n/**\n * Configuration file names to search for (in order of priority).\n */\nconst CONFIG_FILES = [\n 'omnify.config.ts',\n 'omnify.config.js',\n 'omnify.config.mjs',\n 'omnify.config.cjs',\n];\n\n/**\n * Finds configuration file in directory.\n */\nexport function findConfigFile(startDir: string): string | null {\n const cwd = resolve(startDir);\n\n for (const filename of CONFIG_FILES) {\n const configPath = resolve(cwd, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Loads configuration from file using jiti.\n */\nasync function loadConfigFile(configPath: string): Promise<OmnifyConfig> {\n const jiti = createJiti(configPath, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(configPath);\n const config = module as OmnifyConfig;\n\n // Handle default export\n if ('default' in config) {\n return (config as { default: OmnifyConfig }).default;\n }\n\n return config;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load config file: ${message}. Check your omnify.config.ts for syntax errors.`,\n 'E002'\n );\n }\n}\n\n/**\n * Resolves plugins from configuration.\n * Handles both string (npm package) and object plugins.\n */\nasync function resolvePlugins(\n plugins: readonly (string | OmnifyPlugin)[] | undefined,\n configPath: string | null\n): Promise<OmnifyPlugin[]> {\n if (!plugins || plugins.length === 0) {\n return [];\n }\n\n const resolved: OmnifyPlugin[] = [];\n const configDir = configPath ? dirname(configPath) : process.cwd();\n\n for (const plugin of plugins) {\n if (typeof plugin === 'string') {\n // Load plugin from npm package\n const jiti = createJiti(configDir, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(plugin);\n const loadedPlugin = (module as { default?: OmnifyPlugin }).default ?? module;\n resolved.push(loadedPlugin as OmnifyPlugin);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load plugin '${plugin}': ${message}. Ensure the plugin is installed: npm install ${plugin}`,\n 'E301'\n );\n }\n } else {\n // Direct plugin object\n resolved.push(plugin);\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolves configuration with defaults.\n */\nexport async function resolveConfig(\n userConfig: OmnifyConfig,\n configPath: string | null\n): Promise<ResolvedOmnifyConfig> {\n const plugins = await resolvePlugins(userConfig.plugins, configPath);\n\n // Build database config, only including defined optional properties\n const databaseConfig = {\n driver: userConfig.database.driver,\n enableFieldComments: userConfig.database.enableFieldComments ?? false,\n };\n // Only add devUrl if defined\n const database = userConfig.database.devUrl !== undefined\n ? { ...databaseConfig, devUrl: userConfig.database.devUrl }\n : databaseConfig;\n\n // Build laravel output config\n const laravelConfig = {\n migrationsPath: userConfig.output?.laravel?.migrationsPath ?? 'database/migrations',\n };\n // Only add optional properties if they are defined\n const laravel = buildLaravelConfig(laravelConfig, userConfig.output?.laravel);\n\n // Build typescript output config\n const typescript = {\n path: userConfig.output?.typescript?.path ?? 'types',\n singleFile: userConfig.output?.typescript?.singleFile ?? true,\n generateEnums: userConfig.output?.typescript?.generateEnums ?? true,\n generateRelationships: userConfig.output?.typescript?.generateRelationships ?? true,\n };\n\n const result: ResolvedOmnifyConfig = {\n schemasDir: userConfig.schemasDir ?? './schemas',\n database: database as ResolvedOmnifyConfig['database'],\n output: {\n laravel,\n typescript,\n } as ResolvedOmnifyConfig['output'],\n plugins,\n verbose: userConfig.verbose ?? false,\n lockFilePath: userConfig.lockFilePath ?? '.omnify.lock',\n ...(userConfig.locale && { locale: userConfig.locale }),\n };\n\n return result;\n}\n\n/**\n * Builds Laravel config with only defined optional properties.\n */\nfunction buildLaravelConfig(\n base: { migrationsPath: string },\n userLaravel?: Readonly<{\n migrationsPath?: string;\n modelsPath?: string;\n baseModelsPath?: string;\n providersPath?: string;\n modelsNamespace?: string;\n factoriesPath?: string;\n enumsPath?: string;\n enumsNamespace?: string;\n }>\n): ResolvedOmnifyConfig['output']['laravel'] {\n const config: ResolvedOmnifyConfig['output']['laravel'] = { ...base };\n\n if (userLaravel?.modelsPath !== undefined) {\n (config as { modelsPath: string }).modelsPath = userLaravel.modelsPath;\n }\n if (userLaravel?.baseModelsPath !== undefined) {\n (config as { baseModelsPath: string }).baseModelsPath = userLaravel.baseModelsPath;\n }\n if (userLaravel?.providersPath !== undefined) {\n (config as { providersPath: string }).providersPath = userLaravel.providersPath;\n }\n if (userLaravel?.modelsNamespace !== undefined) {\n (config as { modelsNamespace: string }).modelsNamespace = userLaravel.modelsNamespace;\n }\n if (userLaravel?.factoriesPath !== undefined) {\n (config as { factoriesPath: string }).factoriesPath = userLaravel.factoriesPath;\n }\n if (userLaravel?.enumsPath !== undefined) {\n (config as { enumsPath: string }).enumsPath = userLaravel.enumsPath;\n }\n if (userLaravel?.enumsNamespace !== undefined) {\n (config as { enumsNamespace: string }).enumsNamespace = userLaravel.enumsNamespace;\n }\n\n return config;\n}\n\n/**\n * Validates required configuration.\n */\nexport function validateConfig(config: ResolvedOmnifyConfig, rootDir: string): void {\n // Validate schema directory exists\n const schemaPath = resolve(rootDir, config.schemasDir);\n if (!existsSync(schemaPath)) {\n throw configError(\n `Schema directory not found: ${schemaPath}. Create the '${config.schemasDir}' directory or update schemasDir in config.`,\n 'E002'\n );\n }\n}\n\n/**\n * Validates that devUrl is configured (required for diff/generate operations).\n */\nexport function requireDevUrl(config: ResolvedOmnifyConfig): void {\n if (!config.database.devUrl) {\n throw configError(\n `database.devUrl is required for diff and generate operations. Add devUrl to your database config, e.g., \"mysql://root@localhost:3306/omnify_dev\"`,\n 'E003'\n );\n }\n}\n\n/**\n * Loads configuration from file or returns defaults.\n */\nexport async function loadConfig(startDir: string = process.cwd()): Promise<ConfigLoadResult> {\n const cwd = resolve(startDir);\n const configPath = findConfigFile(cwd);\n\n if (configPath) {\n const userConfig = await loadConfigFile(configPath);\n const config = await resolveConfig(userConfig, configPath);\n\n return {\n config,\n configPath,\n };\n }\n\n // No config file found - require config file\n throw configNotFoundError(resolve(cwd, 'omnify.config.ts'));\n}\n\n/**\n * Helper function for type-safe configuration.\n * Used in omnify.config.ts files.\n */\nexport function defineConfig(config: OmnifyConfig): OmnifyConfig {\n return config;\n}\n","/**\n * @famgia/omnify-cli - Diff Command\n *\n * Shows pending schema changes without generating migrations.\n */\n\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.js';\nimport pc from 'picocolors';\n\n/**\n * Diff command options.\n */\ninterface DiffOptions {\n verbose?: boolean;\n check?: boolean;\n}\n\n/**\n * Runs the diff command.\n */\nexport async function runDiff(options: DiffOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Checking for Schema Changes');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config and require devUrl for diff\n validateConfig(config, rootDir);\n requireDevUrl(config);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas);\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before running diff.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Run diff operation\n logger.step('Running Atlas diff...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const diffResult = await runDiffOperation({\n schemas,\n devUrl: config.database.devUrl!,\n lockFilePath: lockPath,\n driver: config.database.driver,\n workDir: rootDir,\n });\n\n if (!diffResult.hasChanges) {\n logger.success('No changes detected');\n return;\n }\n\n // Show changes preview\n logger.newline();\n console.log(pc.bold('Changes detected:'));\n console.log();\n console.log(diffResult.formattedPreview);\n\n if (diffResult.hasDestructiveChanges) {\n logger.newline();\n logger.warn('This preview contains destructive changes. Review carefully.');\n }\n\n // Check mode: exit with code 1 if changes exist\n if (options.check) {\n logger.newline();\n logger.info('Changes detected (--check mode)');\n process.exit(1);\n }\n\n logger.newline();\n logger.info('Run \"omnify generate\" to create migrations');\n}\n\n/**\n * Registers the diff command.\n */\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff')\n .description('Show pending schema changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--check', 'Exit with code 1 if changes exist (for CI)')\n .action(async (options: DiffOptions) => {\n try {\n await runDiff(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Diff Operations\n *\n * High-level diff operations combining atlas-adapter functions.\n */\n\nimport type { SchemaCollection, DatabaseDriver } from '@famgia/omnify-types';\nimport {\n generatePreview,\n formatPreview,\n type ChangePreview,\n} from '@famgia/omnify-atlas';\n\n/**\n * Options for running diff.\n */\nexport interface RunDiffOptions {\n schemas: SchemaCollection;\n devUrl: string;\n lockFilePath: string;\n driver: DatabaseDriver;\n workDir: string;\n}\n\n/**\n * Result of diff operation.\n */\nexport interface DiffOperationResult {\n hasChanges: boolean;\n hasDestructiveChanges: boolean;\n preview: ChangePreview;\n formattedPreview: string;\n sql: string;\n}\n\n/**\n * Runs a full diff operation.\n */\nexport async function runDiffOperation(options: RunDiffOptions): Promise<DiffOperationResult> {\n const { schemas, devUrl, driver, workDir } = options;\n\n // Generate preview using atlas-adapter\n const preview = await generatePreview(schemas, {\n driver,\n devUrl,\n workDir,\n }, {\n warnDestructive: true,\n showSql: true,\n });\n\n // Format preview for display\n const formattedPreview = formatPreview(preview, 'text');\n\n return {\n hasChanges: preview.hasChanges,\n hasDestructiveChanges: preview.hasDestructiveChanges,\n preview,\n formattedPreview,\n sql: preview.sql,\n };\n}\n\n/**\n * Re-export for convenience.\n */\nexport { formatPreview };\n","/**\n * @famgia/omnify-cli - Generate Command\n *\n * Generates Laravel migrations and TypeScript types from schemas.\n * Supports both direct generation and plugin-based generation.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n loadSchemas,\n validateSchemas,\n OmnifyError,\n PluginManager,\n createVersionStore,\n type VersionSchemaSnapshot,\n type VersionPropertySnapshot,\n type VersionChange,\n} from '@famgia/omnify-core';\nimport {\n writeLockFile,\n readLockFile,\n updateLockFile,\n buildSchemaSnapshots,\n compareSchemasDeep,\n isLockFileV2,\n type SchemaChange,\n} from '@famgia/omnify-atlas';\nimport {\n generateMigrations,\n generateMigrationsFromChanges,\n generateModels,\n getModelPath,\n generateFactories,\n getFactoryPath,\n} from '@famgia/omnify-laravel';\nimport { generateTypeScript } from '@famgia/omnify-typescript';\nimport type {\n OmnifyPlugin,\n SchemaCollection,\n GeneratorOutput,\n} from '@famgia/omnify-types';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { generateAIGuides } from '../guides/index.js';\n\n/**\n * Generate command options.\n */\ninterface GenerateOptions {\n verbose?: boolean;\n migrationsOnly?: boolean;\n typesOnly?: boolean;\n force?: boolean;\n}\n\n/**\n * Checks if plugins have generators configured.\n */\nfunction hasPluginGenerators(plugins: readonly OmnifyPlugin[]): boolean {\n return plugins.some((p) => p.generators && p.generators.length > 0);\n}\n\n/**\n * Scans a directory for existing migration files and returns tables that already have CREATE migrations.\n */\nfunction getExistingMigrationTables(migrationsDir: string): Set<string> {\n const existingTables = new Set<string>();\n\n if (!existsSync(migrationsDir)) {\n return existingTables;\n }\n\n try {\n const files = readdirSync(migrationsDir);\n // Match pattern: YYYY_MM_DD_HHMMSS_create_<table>_table.php\n const createMigrationPattern = /^\\d{4}_\\d{2}_\\d{2}_\\d{6}_create_(.+)_table\\.php$/;\n\n for (const file of files) {\n const match = file.match(createMigrationPattern);\n if (match) {\n existingTables.add(match[1]); // table name\n }\n }\n } catch {\n // Ignore errors reading directory\n }\n\n return existingTables;\n}\n\n/**\n * Logs detailed schema change information.\n */\nfunction logSchemaChange(change: SchemaChange, verbose: boolean): void {\n logger.debug(` ${change.changeType}: ${change.schemaName}`);\n\n if (!verbose || change.changeType !== 'modified') {\n return;\n }\n\n // Log column changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n logger.debug(` + column: ${col.column} (${col.currentDef?.type})`);\n } else if (col.changeType === 'removed') {\n logger.debug(` - column: ${col.column}`);\n } else if (col.changeType === 'modified' && col.modifications) {\n logger.debug(` ~ column: ${col.column} [${col.modifications.join(', ')}]`);\n } else if (col.changeType === 'renamed' && col.previousColumn) {\n const mods = col.modifications?.length ? ` [${col.modifications.join(', ')}]` : '';\n logger.debug(` → column: ${col.previousColumn} → ${col.column}${mods}`);\n }\n }\n }\n\n // Log index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n const type = idx.index.unique ? 'unique' : 'index';\n if (idx.changeType === 'added') {\n logger.debug(` + ${type}: (${idx.index.columns.join(', ')})`);\n } else {\n logger.debug(` - ${type}: (${idx.index.columns.join(', ')})`);\n }\n }\n }\n\n // Log option changes\n if (change.optionChanges) {\n if (change.optionChanges.timestamps) {\n const { from, to } = change.optionChanges.timestamps;\n logger.debug(` ~ timestamps: ${from} → ${to}`);\n }\n if (change.optionChanges.softDelete) {\n const { from, to } = change.optionChanges.softDelete;\n logger.debug(` ~ softDelete: ${from} → ${to}`);\n }\n if (change.optionChanges.idType) {\n const { from, to } = change.optionChanges.idType;\n logger.debug(` ~ idType: ${from} → ${to}`);\n }\n }\n}\n\n/**\n * Convert property to version snapshot format.\n */\nfunction propertyToVersionSnapshot(prop: Record<string, unknown>): VersionPropertySnapshot {\n return {\n type: prop.type as string,\n ...(prop.displayName !== undefined && { displayName: prop.displayName as string }),\n ...(prop.description !== undefined && { description: prop.description as string }),\n ...(prop.nullable !== undefined && { nullable: prop.nullable as boolean }),\n ...(prop.unique !== undefined && { unique: prop.unique as boolean }),\n ...(prop.default !== undefined && { default: prop.default }),\n ...(prop.length !== undefined && { length: prop.length as number }),\n ...(prop.unsigned !== undefined && { unsigned: prop.unsigned as boolean }),\n ...(prop.precision !== undefined && { precision: prop.precision as number }),\n ...(prop.scale !== undefined && { scale: prop.scale as number }),\n ...(prop.enum !== undefined && { enum: prop.enum as readonly string[] }),\n ...(prop.relation !== undefined && { relation: prop.relation as string }),\n ...(prop.target !== undefined && { target: prop.target as string }),\n ...(prop.targets !== undefined && { targets: prop.targets as readonly string[] }),\n ...(prop.morphName !== undefined && { morphName: prop.morphName as string }),\n ...(prop.onDelete !== undefined && { onDelete: prop.onDelete as string }),\n ...(prop.onUpdate !== undefined && { onUpdate: prop.onUpdate as string }),\n ...(prop.mappedBy !== undefined && { mappedBy: prop.mappedBy as string }),\n ...(prop.inversedBy !== undefined && { inversedBy: prop.inversedBy as string }),\n ...(prop.joinTable !== undefined && { joinTable: prop.joinTable as string }),\n ...(prop.owning !== undefined && { owning: prop.owning as boolean }),\n // Laravel-specific properties\n ...(prop.hidden !== undefined && { hidden: prop.hidden as boolean }),\n ...(prop.fillable !== undefined && { fillable: prop.fillable as boolean }),\n // Per-field overrides for compound types\n ...(prop.fields !== undefined && { fields: prop.fields as Record<string, { nullable?: boolean; hidden?: boolean; fillable?: boolean }> }),\n };\n}\n\n/**\n * Convert schemas to version snapshot format.\n */\nfunction schemasToVersionSnapshot(\n schemas: SchemaCollection\n): Record<string, VersionSchemaSnapshot> {\n const snapshot: Record<string, VersionSchemaSnapshot> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n const properties: Record<string, VersionPropertySnapshot> = {};\n if (schema.properties) {\n for (const [propName, prop] of Object.entries(schema.properties)) {\n properties[propName] = propertyToVersionSnapshot(prop as unknown as Record<string, unknown>);\n }\n }\n\n const opts = schema.options;\n snapshot[name] = {\n name: schema.name,\n kind: (schema.kind ?? 'object') as 'object' | 'enum',\n ...(Object.keys(properties).length > 0 && { properties }),\n ...(schema.values && { values: schema.values }),\n ...(opts && {\n options: {\n ...(opts.id !== undefined && { id: opts.id }),\n ...(opts.idType !== undefined && { idType: opts.idType }),\n ...(opts.timestamps !== undefined && { timestamps: opts.timestamps }),\n ...(opts.softDelete !== undefined && { softDelete: opts.softDelete }),\n ...(opts.tableName !== undefined && { tableName: opts.tableName }),\n ...(opts.translations !== undefined && { translations: opts.translations }),\n ...(opts.authenticatable !== undefined && { authenticatable: opts.authenticatable }),\n },\n }),\n };\n }\n\n return snapshot;\n}\n\n/**\n * Convert SchemaChange to VersionChange format.\n */\nfunction schemaChangeToVersionChange(change: SchemaChange): VersionChange[] {\n const changes: VersionChange[] = [];\n\n if (change.changeType === 'added') {\n changes.push({ action: 'schema_added', schema: change.schemaName });\n } else if (change.changeType === 'removed') {\n changes.push({ action: 'schema_removed', schema: change.schemaName });\n } else if (change.changeType === 'modified') {\n // Add property-level changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n changes.push({\n action: 'property_added',\n schema: change.schemaName,\n property: col.column,\n to: col.currentDef,\n });\n } else if (col.changeType === 'removed') {\n changes.push({\n action: 'property_removed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n });\n } else if (col.changeType === 'modified') {\n changes.push({\n action: 'property_modified',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n to: col.currentDef,\n });\n } else if (col.changeType === 'renamed') {\n changes.push({\n action: 'property_renamed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousColumn,\n to: col.column,\n });\n }\n }\n }\n\n // Add option changes\n if (change.optionChanges) {\n changes.push({\n action: 'option_changed',\n schema: change.schemaName,\n from: change.optionChanges,\n to: change.optionChanges,\n });\n }\n\n // Add index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n if (idx.changeType === 'added') {\n changes.push({\n action: 'index_added',\n schema: change.schemaName,\n to: idx.index,\n });\n } else {\n changes.push({\n action: 'index_removed',\n schema: change.schemaName,\n from: idx.index,\n });\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Writes generator outputs to disk.\n */\nfunction writeGeneratorOutputs(\n outputs: readonly GeneratorOutput[],\n rootDir: string\n): { migrations: number; types: number; models: number; factories: number; other: number } {\n const counts = { migrations: 0, types: 0, models: 0, factories: 0, other: 0 };\n\n for (const output of outputs) {\n const filePath = resolve(rootDir, output.path);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n logger.debug(`Created directory: ${dir}`);\n }\n\n // Skip writing if file exists and skipIfExists is true\n if (output.skipIfExists && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${output.path}`);\n continue;\n }\n\n writeFileSync(filePath, output.content);\n logger.debug(`Created: ${output.path}`);\n\n if (output.type === 'migration') counts.migrations++;\n else if (output.type === 'type') counts.types++;\n else if (output.type === 'model') counts.models++;\n else if (output.type === 'factory') counts.factories++;\n else counts.other++;\n }\n\n return counts;\n}\n\n/**\n * Runs generation using the plugin system.\n */\nasync function runPluginGeneration(\n plugins: readonly OmnifyPlugin[],\n schemas: SchemaCollection,\n rootDir: string,\n verbose: boolean,\n changes?: readonly SchemaChange[]\n): Promise<{ migrations: number; types: number; models: number; factories: number; other: number }> {\n const pluginManager = new PluginManager({\n cwd: rootDir,\n verbose,\n logger: {\n debug: (msg) => logger.debug(msg),\n info: (msg) => logger.info(msg),\n warn: (msg) => logger.warn(msg),\n error: (msg) => logger.error(msg),\n },\n });\n\n // Register plugins\n for (const plugin of plugins) {\n await pluginManager.register(plugin);\n }\n\n // Run generators with schema changes\n const result = await pluginManager.runGenerators(schemas, changes);\n\n if (!result.success) {\n for (const error of result.errors) {\n logger.error(`Generator ${error.generatorName} failed: ${error.message}`);\n }\n throw new Error('Generator execution failed');\n }\n\n // Write outputs\n return writeGeneratorOutputs(result.outputs, rootDir);\n}\n\n/**\n * Runs generation using direct function calls (legacy mode).\n */\nfunction runDirectGeneration(\n schemas: SchemaCollection,\n config: ResolvedOmnifyConfig,\n rootDir: string,\n options: GenerateOptions,\n changes: readonly SchemaChange[]\n): { migrations: number; types: number; models: number; factories: number } {\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Generate Laravel migrations\n if (!options.typesOnly && config.output.laravel) {\n logger.step('Generating Laravel migrations...');\n\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n logger.debug(`Created directory: ${migrationsDir}`);\n }\n\n // Separate added schemas from modified/removed\n const addedSchemaNames = new Set(\n changes.filter((c) => c.changeType === 'added').map((c) => c.schemaName)\n );\n const alterChanges = changes.filter(\n (c) => c.changeType === 'modified' || c.changeType === 'removed'\n );\n\n // Get existing migration tables to avoid duplicates\n const existingTables = getExistingMigrationTables(migrationsDir);\n\n // Generate CREATE migrations only for added schemas\n if (addedSchemaNames.size > 0) {\n const addedSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => addedSchemaNames.has(name))\n ) as SchemaCollection;\n\n const createMigrations = generateMigrations(addedSchemas, { customTypes: customTypesMap });\n for (const migration of createMigrations) {\n const tableName = migration.tables[0];\n // Skip if table already has a create migration\n if (existingTables.has(tableName)) {\n logger.debug(`Skipped CREATE for ${tableName} (already exists)`);\n continue;\n }\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n // Generate ALTER/DROP migrations for modified/removed schemas\n if (alterChanges.length > 0) {\n const alterMigrations = generateMigrationsFromChanges(alterChanges);\n for (const migration of alterMigrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate Laravel models\n if (!options.typesOnly && config.output.laravel?.modelsPath) {\n logger.step('Generating Laravel models...');\n\n const modelsPath = config.output.laravel.modelsPath;\n const baseModelsPath = config.output.laravel.baseModelsPath ?? `${modelsPath}/OmnifyBase`;\n\n // Ensure directories exist\n const modelsDir = resolve(rootDir, modelsPath);\n const baseModelsDir = resolve(rootDir, baseModelsPath);\n if (!existsSync(modelsDir)) {\n mkdirSync(modelsDir, { recursive: true });\n }\n if (!existsSync(baseModelsDir)) {\n mkdirSync(baseModelsDir, { recursive: true });\n }\n\n const providersPath = config.output.laravel.providersPath ?? 'app/Providers';\n\n const models = generateModels(schemas, {\n modelPath: modelsPath,\n baseModelPath: baseModelsPath,\n providersPath: providersPath,\n customTypes: customTypesMap,\n });\n\n for (const model of models) {\n const filePath = resolve(rootDir, getModelPath(model));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user models if they exist (don't overwrite customizations)\n // Always overwrite base models (overwrite: true)\n if (!model.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getModelPath(model)}`);\n continue;\n }\n\n writeFileSync(filePath, model.content);\n logger.debug(`Created: ${getModelPath(model)}`);\n modelsGenerated++;\n }\n\n logger.success(`Generated ${modelsGenerated} model(s)`);\n }\n\n // Generate Laravel factories\n if (!options.typesOnly && config.output.laravel?.factoriesPath) {\n logger.step('Generating Laravel factories...');\n\n const factoriesPath = config.output.laravel.factoriesPath;\n const factoriesDir = resolve(rootDir, factoriesPath);\n if (!existsSync(factoriesDir)) {\n mkdirSync(factoriesDir, { recursive: true });\n }\n\n const factories = generateFactories(schemas, {\n factoryPath: factoriesPath,\n });\n\n for (const factory of factories) {\n const filePath = resolve(rootDir, getFactoryPath(factory));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user factories if they exist (don't overwrite customizations)\n if (!factory.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getFactoryPath(factory)}`);\n continue;\n }\n\n writeFileSync(filePath, factory.content);\n logger.debug(`Created: ${getFactoryPath(factory)}`);\n factoriesGenerated++;\n }\n\n logger.success(`Generated ${factoriesGenerated} factory(ies)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly && config.output.typescript) {\n logger.step('Generating TypeScript types...');\n\n const typesDir = resolve(rootDir, config.output.typescript.path);\n if (!existsSync(typesDir)) {\n mkdirSync(typesDir, { recursive: true });\n logger.debug(`Created directory: ${typesDir}`);\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typescriptConfig = config.output.typescript as { generateRules?: boolean; validationTemplates?: Record<string, Record<string, string>> };\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: typescriptConfig.generateRules ?? true,\n validationTemplates: typescriptConfig.validationTemplates,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.filePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n return { migrations: migrationsGenerated, types: typesGenerated, models: modelsGenerated, factories: factoriesGenerated };\n}\n\n/**\n * Runs the generate command.\n */\nexport async function runGenerate(options: GenerateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Generating Outputs');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (devUrl not required for generate)\n validateConfig(config, rootDir);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Extract custom type names from plugins for validation\n const customTypeNames: string[] = [];\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypeNames.push(typeDef.name);\n }\n }\n }\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas, {\n customTypes: customTypeNames,\n });\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before generating.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Check for changes by comparing lock file with current schemas\n logger.step('Checking for changes...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const existingLock = await readLockFile(lockPath);\n const currentSnapshots = await buildSchemaSnapshots(schemas);\n\n // Use v2 format for deep diff\n const v2Lock = existingLock && isLockFileV2(existingLock) ? existingLock : null;\n const comparison = compareSchemasDeep(currentSnapshots, v2Lock);\n\n // Only skip if no changes AND no models to regenerate\n // Models with overwrite: true (OmnifyServiceProvider, BaseModel, etc.) should always be regenerated\n const skipMigrations = !comparison.hasChanges && !options.force;\n\n if (skipMigrations && !config.output.laravel?.modelsPath) {\n logger.success('No changes to generate');\n return;\n }\n\n if (comparison.hasChanges) {\n logger.debug(`Detected ${comparison.changes.length} change(s)`);\n for (const change of comparison.changes) {\n logSchemaChange(change, options.verbose ?? false);\n }\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Check if plugins have generators\n const usePlugins = hasPluginGenerators(config.plugins);\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n if (usePlugins) {\n // Use plugin system for generation\n logger.step('Running plugin generators...');\n const counts = await runPluginGeneration(\n config.plugins,\n schemas,\n rootDir,\n options.verbose ?? false,\n comparison.changes\n );\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n\n if (counts.migrations > 0) {\n logger.success(`Generated ${counts.migrations} migration(s)`);\n }\n if (counts.types > 0) {\n logger.success(`Generated ${counts.types} TypeScript file(s)`);\n }\n if (counts.models > 0) {\n logger.success(`Generated ${counts.models} model(s)`);\n }\n if (counts.factories > 0) {\n logger.success(`Generated ${counts.factories} factory(ies)`);\n }\n if (counts.other > 0) {\n logger.success(`Generated ${counts.other} other file(s)`);\n }\n\n // Generate TypeScript from output.typescript config (even when using plugins)\n if (!options.migrationsOnly && config.output.typescript && typesGenerated === 0) {\n logger.step('Generating TypeScript types...');\n\n const typesDir = resolve(rootDir, config.output.typescript.path);\n if (!existsSync(typesDir)) {\n mkdirSync(typesDir, { recursive: true });\n logger.debug(`Created directory: ${typesDir}`);\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typescriptConfig = config.output.typescript as { generateRules?: boolean; validationTemplates?: Record<string, Record<string, string>> };\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: typescriptConfig.generateRules ?? true,\n validationTemplates: typescriptConfig.validationTemplates,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.filePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n } else {\n // Use direct generation (legacy mode)\n const counts = runDirectGeneration(schemas, config, rootDir, options, comparison.changes);\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n modelsGenerated = counts.models;\n factoriesGenerated = counts.factories;\n }\n\n // Update lock file (v2 with snapshots)\n logger.step('Updating lock file...');\n const newLockFile = updateLockFile(existingLock, currentSnapshots, config.database.driver);\n await writeLockFile(lockPath, newLockFile);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n // Save version history\n logger.step('Saving version history...');\n const versionStore = createVersionStore({ baseDir: rootDir, maxVersions: 100 });\n const versionSnapshot = schemasToVersionSnapshot(schemas);\n const versionChanges: VersionChange[] = comparison.changes.flatMap(schemaChangeToVersionChange);\n\n // Get migration file name for version description\n const migrationFileName = migrationsGenerated > 0\n ? `${migrationsGenerated} migration(s)`\n : undefined;\n\n try {\n const newVersion = await versionStore.createVersion(\n versionSnapshot,\n versionChanges,\n {\n driver: config.database.driver,\n ...(migrationFileName !== undefined && { migration: migrationFileName }),\n description: `Generated ${comparison.changes.length} change(s)`,\n }\n );\n logger.debug(`Created version ${newVersion.version}`);\n } catch (versionError) {\n // Version history is optional, log but don't fail\n logger.debug(`Could not save version history: ${(versionError as Error).message}`);\n }\n\n // Generate AI guides\n try {\n const guidesWritten = generateAIGuides(rootDir, config.plugins);\n if (guidesWritten > 0) {\n logger.debug(`Updated ${guidesWritten} AI guide file(s)`);\n }\n } catch (guideError) {\n // AI guides are optional, log but don't fail\n logger.debug(`Could not generate AI guides: ${(guideError as Error).message}`);\n }\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0 && config.output.laravel) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (modelsGenerated > 0 && config.output.laravel?.modelsPath) {\n logger.info(` Models: ${config.output.laravel.modelsPath}/`);\n }\n if (typesGenerated > 0 && config.output.typescript) {\n logger.info(` Types: ${config.output.typescript.path}/`);\n }\n}\n\n/**\n * Registers the generate command.\n */\nexport function registerGenerateCommand(program: Command): void {\n program\n .command('generate')\n .description('Generate Laravel migrations and TypeScript types')\n .option('-v, --verbose', 'Show detailed output')\n .option('--migrations-only', 'Only generate migrations')\n .option('--types-only', 'Only generate TypeScript types')\n .option('-f, --force', 'Generate even if no changes detected')\n .action(async (options: GenerateOptions) => {\n try {\n await runGenerate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - AI Guide Generator\n *\n * Generates documentation files for AI assistants (Claude, etc.)\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { OmnifyPlugin } from '@famgia/omnify-types';\n\n/**\n * CLAUDE.md content for project root\n */\nconst CLAUDE_MD = `## Omnify\n\nThis project uses Omnify for schema-driven code generation.\n\n**Documentation**: \\`.claude/omnify/\\`\n- \\`schema-guide.md\\` - Schema format and property types\n- \\`laravel-guide.md\\` - Laravel generator (if installed)\n- \\`typescript-guide.md\\` - TypeScript generator (if installed)\n- \\`japan-guide.md\\` - Japan plugin types (if installed)\n\n**Commands**:\n- \\`npx omnify generate\\` - Generate code from schemas\n- \\`npx omnify validate\\` - Validate schemas\n`;\n\n/**\n * Schema guide content\n */\nconst SCHEMA_GUIDE = `# Omnify Schema Guide\n\n## Schema File Format\n\nSchemas are YAML files defining data models. Each file represents one entity.\n\n\\`\\`\\`yaml\nname: User\ndisplayName:\n ja: ユーザー\n en: User\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n name:\n type: String\n bio:\n type: Text\n nullable: true\n\noptions:\n timestamps: true\n softDelete: true\n\\`\\`\\`\n\n## Property Types\n\n### String Types\n- \\`String\\` - VARCHAR(255)\n- \\`Text\\` - TEXT\n- \\`LongText\\` - LONGTEXT\n- \\`Email\\` - VARCHAR(255) for email addresses\n- \\`Password\\` - VARCHAR(255), hidden in serialization\n\n### Numeric Types\n- \\`Int\\` - INTEGER\n- \\`BigInt\\` - BIGINT\n- \\`TinyInt\\` - TINYINT\n- \\`Float\\` - DOUBLE\n- \\`Decimal\\` - DECIMAL(precision, scale)\n\n### Date/Time Types\n- \\`Date\\` - DATE\n- \\`Time\\` - TIME\n- \\`DateTime\\` - DATETIME\n- \\`Timestamp\\` - TIMESTAMP\n\n### Other Types\n- \\`Boolean\\` - BOOLEAN\n- \\`Json\\` - JSON\n- \\`Enum\\` - ENUM with values\n- \\`EnumRef\\` - Reference to enum schema\n\n## Property Options\n\n\\`\\`\\`yaml\npropertyName:\n type: String\n nullable: true # Can be NULL\n unique: true # Unique constraint\n default: \"value\" # Default value\n length: 100 # VARCHAR length\n hidden: true # Hide from JSON output\n fillable: false # Exclude from mass assignment\n\\`\\`\\`\n\n## Associations\n\n\\`\\`\\`yaml\n# Many-to-One (belongsTo)\nauthor:\n type: Association\n relation: ManyToOne\n target: User\n onDelete: CASCADE\n\n# One-to-Many (hasMany)\nposts:\n type: Association\n relation: OneToMany\n target: Post\n\n# Many-to-Many (belongsToMany)\ntags:\n type: Association\n relation: ManyToMany\n target: Tag\n joinTable: post_tags\n\n# Polymorphic\ncommentable:\n type: Association\n relation: MorphTo\n\\`\\`\\`\n\n## Indexes\n\n\\`\\`\\`yaml\nindexes:\n - columns: [status, published_at]\n - columns: [email]\n unique: true\n\\`\\`\\`\n\n## Schema Options\n\n\\`\\`\\`yaml\noptions:\n timestamps: true # Add created_at, updated_at\n softDelete: true # Add deleted_at\n idType: BigInt # Primary key type (Int, BigInt, Uuid)\n\\`\\`\\`\n`;\n\n/**\n * Laravel guide content\n */\nconst LARAVEL_GUIDE = `# Laravel Generator Guide\n\n## Generated Files\n\n### Migrations\nLocated in \\`database/migrations/omnify/\\`\n- Auto-generated from schema changes\n- Handles column additions, modifications, removals\n- Preserves manual migrations outside omnify folder\n\n### Models\nTwo-tier model structure:\n- \\`app/Models/OmnifyBase/*BaseModel.php\\` - Auto-generated, DO NOT EDIT\n- \\`app/Models/*.php\\` - User models, extend base models, safe to customize\n\n### Factories\nLocated in \\`database/factories/\\`\n- Generated once, safe to customize\n- Uses appropriate Faker methods for each type\n\n## Model Features\n\n### Fillable\nAll schema properties are mass-assignable by default.\nUse \\`fillable: false\\` to exclude.\n\n### Hidden\nUse \\`hidden: true\\` to exclude from JSON/array output.\n\n\\`\\`\\`yaml\npassword:\n type: Password\n hidden: true\n\\`\\`\\`\n\n### Casts\nAuto-generated based on property types:\n- \\`Boolean\\` → \\`'boolean'\\`\n- \\`Json\\` → \\`'array'\\`\n- \\`Timestamp\\` → \\`'datetime'\\`\n\n### Relationships\nGenerated from Association properties:\n- \\`ManyToOne\\` → \\`belongsTo()\\`\n- \\`OneToMany\\` → \\`hasMany()\\`\n- \\`ManyToMany\\` → \\`belongsToMany()\\`\n- \\`MorphTo\\` → \\`morphTo()\\`\n- \\`MorphMany\\` → \\`morphMany()\\`\n\n## Commands\n\n\\`\\`\\`bash\n# Generate migrations and models\nnpx omnify generate\n\n# Force regeneration\nnpx omnify generate --force\n\n# Validate schemas\nnpx omnify validate\n\\`\\`\\`\n`;\n\n/**\n * TypeScript guide content\n */\nconst TYPESCRIPT_GUIDE = `# TypeScript Generator Guide\n\n## Generated Types\n\nTypes are generated in the configured output directory.\n\n### Interface Generation\n\nEach schema generates a TypeScript interface:\n\n\\`\\`\\`typescript\nexport interface User {\n id: number;\n email: string;\n name: string;\n bio: string | null;\n created_at: string;\n updated_at: string;\n}\n\\`\\`\\`\n\n### Type Mappings\n\n| Omnify Type | TypeScript Type |\n|-------------|-----------------|\n| String, Text | string |\n| Int, BigInt | number |\n| Float, Decimal | number |\n| Boolean | boolean |\n| Date, DateTime | string |\n| Json | Record<string, unknown> |\n| Enum | union of literals |\n\n### Nullable Types\n\nNullable properties become \\`T | null\\`:\n\n\\`\\`\\`typescript\nbio: string | null;\n\\`\\`\\`\n\n### Associations\n\nAssociations generate optional relation properties:\n\n\\`\\`\\`typescript\nexport interface Post {\n id: number;\n title: string;\n author_id: number;\n author?: User; // Optional relation\n comments?: Comment[]; // Optional array relation\n}\n\\`\\`\\`\n`;\n\n/**\n * Japan plugin guide content\n */\nconst JAPAN_GUIDE = `# Japan Plugin Types Guide\n\nThis project uses \\`@famgia/omnify-japan\\` plugin which provides Japan-specific types.\n\n## Available Types\n\n### Simple Types\n\n#### JapanesePhone\nJapanese phone number format (e.g., \\`090-1234-5678\\`, \\`03-1234-5678\\`)\n- SQL: \\`VARCHAR(15)\\`\n- Accepts with or without hyphens\n\n\\`\\`\\`yaml\nphone:\n type: JapanesePhone\n\\`\\`\\`\n\n#### JapanesePostalCode\nJapanese postal code format (e.g., \\`123-4567\\`)\n- SQL: \\`VARCHAR(8)\\`\n- Accepts with or without hyphen\n\n\\`\\`\\`yaml\npostal_code:\n type: JapanesePostalCode\n nullable: true\n\\`\\`\\`\n\n### Compound Types\n\nCompound types expand into multiple database columns automatically.\n\n#### JapaneseName\nJapanese name with kanji and kana variants.\n\n**Expands to 4 columns:**\n- \\`{property}_lastname\\` - VARCHAR(50) - Family name (姓)\n- \\`{property}_firstname\\` - VARCHAR(50) - Given name (名)\n- \\`{property}_kana_lastname\\` - VARCHAR(100) - Family name in katakana\n- \\`{property}_kana_firstname\\` - VARCHAR(100) - Given name in katakana\n\n**Accessors generated:**\n- \\`{property}_full_name\\` - \"姓 名\" (space-separated)\n- \\`{property}_full_name_kana\\` - \"セイ メイ\" (space-separated)\n\n\\`\\`\\`yaml\nname:\n type: JapaneseName\n displayName:\n ja: 氏名\n en: Full Name\n # Per-field overrides\n fields:\n KanaLastname:\n nullable: true\n hidden: true\n KanaFirstname:\n nullable: true\n hidden: true\n\\`\\`\\`\n\n#### JapaneseAddress\nJapanese address with postal code and prefecture ID.\n\n**Expands to 5 columns:**\n- \\`{property}_postal_code\\` - VARCHAR(8) - Postal code (郵便番号)\n- \\`{property}_prefecture_id\\` - TINYINT UNSIGNED - Prefecture ID 1-47 (都道府県)\n- \\`{property}_address1\\` - VARCHAR(255) - City/Ward (市区町村)\n- \\`{property}_address2\\` - VARCHAR(255) - Street address (丁目番地号)\n- \\`{property}_address3\\` - VARCHAR(255) NULLABLE - Building name (ビル・マンション名)\n\n**Accessors generated:**\n- \\`{property}_full_address\\` - Concatenation of address1 + address2 + address3\n\n\\`\\`\\`yaml\naddress:\n type: JapaneseAddress\n displayName:\n ja: 住所\n en: Address\n fields:\n Address3:\n nullable: true\n\\`\\`\\`\n\n**Prefecture IDs (JIS X 0401):**\n| ID | Prefecture | ID | Prefecture | ID | Prefecture |\n|----|-----------|----|-----------|----|-----------|\n| 1 | 北海道 | 17 | 石川県 | 33 | 岡山県 |\n| 2 | 青森県 | 18 | 福井県 | 34 | 広島県 |\n| 3 | 岩手県 | 19 | 山梨県 | 35 | 山口県 |\n| 4 | 宮城県 | 20 | 長野県 | 36 | 徳島県 |\n| 5 | 秋田県 | 21 | 岐阜県 | 37 | 香川県 |\n| 6 | 山形県 | 22 | 静岡県 | 38 | 愛媛県 |\n| 7 | 福島県 | 23 | 愛知県 | 39 | 高知県 |\n| 8 | 茨城県 | 24 | 三重県 | 40 | 福岡県 |\n| 9 | 栃木県 | 25 | 滋賀県 | 41 | 佐賀県 |\n| 10 | 群馬県 | 26 | 京都府 | 42 | 長崎県 |\n| 11 | 埼玉県 | 27 | 大阪府 | 43 | 熊本県 |\n| 12 | 千葉県 | 28 | 兵庫県 | 44 | 大分県 |\n| 13 | 東京都 | 29 | 奈良県 | 45 | 宮崎県 |\n| 14 | 神奈川県 | 30 | 和歌山県 | 46 | 鹿児島県 |\n| 15 | 新潟県 | 31 | 鳥取県 | 47 | 沖縄県 |\n| 16 | 富山県 | 32 | 島根県 | | |\n\n#### JapaneseBankAccount\nJapanese bank account information.\n\n**Expands to 5 columns:**\n- \\`{property}_bank_code\\` - VARCHAR(4) - Bank code (銀行コード)\n- \\`{property}_branch_code\\` - VARCHAR(3) - Branch code (支店コード)\n- \\`{property}_account_type\\` - ENUM - Account type: 1=普通, 2=当座, 4=貯蓄\n- \\`{property}_account_number\\` - VARCHAR(7) - Account number (口座番号)\n- \\`{property}_account_holder\\` - VARCHAR(100) - Account holder name (口座名義)\n\n\\`\\`\\`yaml\nbank_account:\n type: JapaneseBankAccount\n\\`\\`\\`\n\n## Per-field Overrides\n\nAll compound types support per-field overrides:\n\n\\`\\`\\`yaml\nname:\n type: JapaneseName\n fields:\n Lastname:\n length: 100 # Override default VARCHAR length\n Firstname:\n length: 100\n KanaLastname:\n length: 200\n nullable: true\n hidden: true\n KanaFirstname:\n length: 200\n nullable: true\n hidden: true\n\\`\\`\\`\n\n**Available overrides:**\n- \\`length\\` - VARCHAR length (override default)\n- \\`nullable\\` - Whether the field can be NULL\n- \\`hidden\\` - Exclude from JSON/array output\n- \\`fillable\\` - Control mass assignment\n\n## Factory Examples\n\n\\`\\`\\`php\n$faker = fake('ja_JP');\n\nreturn [\n // JapaneseName\n 'name_lastname' => $faker->lastName(),\n 'name_firstname' => $faker->firstName(),\n 'name_kana_lastname' => $faker->lastKanaName(),\n 'name_kana_firstname' => $faker->firstKanaName(),\n\n // JapanesePhone\n 'phone' => $faker->phoneNumber(),\n\n // JapanesePostalCode\n 'postal_code' => $faker->postcode(),\n\n // JapaneseAddress\n 'address_postal_code' => $faker->postcode(),\n 'address_prefecture_id' => $faker->numberBetween(1, 47),\n 'address_address1' => $faker->city(),\n 'address_address2' => $faker->streetAddress(),\n 'address_address3' => $faker->optional(0.5)->secondaryAddress(),\n];\n\\`\\`\\`\n\n## Model Accessors\n\n\\`\\`\\`php\n// JapaneseName accessors\n$customer->name_full_name; // \"田中 太郎\"\n$customer->name_full_name_kana; // \"タナカ タロウ\"\n\n// JapaneseAddress accessor\n$customer->address_full_address; // \"千代田区丸の内1-1-1ビル5F\"\n\\`\\`\\`\n`;\n\n/**\n * Checks if a plugin is the Japan types plugin\n */\nfunction isJapanPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-japan';\n}\n\n/**\n * Checks if a plugin is the Laravel plugin\n */\nfunction isLaravelPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-laravel';\n}\n\n/**\n * Checks if a plugin is the TypeScript plugin\n */\nfunction isTypeScriptPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-typescript';\n}\n\n/**\n * Generates AI guide files based on installed plugins\n */\nexport function generateAIGuides(\n rootDir: string,\n plugins: readonly OmnifyPlugin[]\n): number {\n const guidesDir = resolve(rootDir, '.claude/omnify');\n let filesWritten = 0;\n\n // Create guides directory\n if (!existsSync(guidesDir)) {\n mkdirSync(guidesDir, { recursive: true });\n }\n\n // Always write CLAUDE.md in root\n const claudeMdPath = resolve(rootDir, 'CLAUDE.md');\n if (!existsSync(claudeMdPath)) {\n writeFileSync(claudeMdPath, CLAUDE_MD);\n filesWritten++;\n }\n\n // Always write schema guide\n const schemaGuidePath = resolve(guidesDir, 'schema-guide.md');\n writeFileSync(schemaGuidePath, SCHEMA_GUIDE);\n filesWritten++;\n\n // Write plugin-specific guides\n for (const plugin of plugins) {\n if (isLaravelPlugin(plugin)) {\n const laravelGuidePath = resolve(guidesDir, 'laravel-guide.md');\n writeFileSync(laravelGuidePath, LARAVEL_GUIDE);\n filesWritten++;\n }\n\n if (isTypeScriptPlugin(plugin)) {\n const tsGuidePath = resolve(guidesDir, 'typescript-guide.md');\n writeFileSync(tsGuidePath, TYPESCRIPT_GUIDE);\n filesWritten++;\n }\n\n if (isJapanPlugin(plugin)) {\n const japanGuidePath = resolve(guidesDir, 'japan-guide.md');\n writeFileSync(japanGuidePath, JAPAN_GUIDE);\n filesWritten++;\n }\n }\n\n return filesWritten;\n}\n","/**\n * @famgia/omnify-cli - Reset Command\n *\n * Cleans up generated files: OmnifyBase models, migrations, and lock files.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport type { Command } from 'commander';\nimport { loadConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Reset command options.\n */\ninterface ResetOptions {\n verbose?: boolean;\n yes?: boolean;\n}\n\n/**\n * Prompts user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\n/**\n * Recursively counts files in a directory.\n */\nfunction countFiles(dir: string): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Recursively deletes a directory.\n */\nfunction deleteDir(dir: string, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n const count = countFiles(dir);\n rmSync(dir, { recursive: true, force: true });\n\n if (verbose) {\n logger.debug(`Deleted: ${dir}`);\n }\n\n return count;\n}\n\n/**\n * Deletes files matching a pattern in a directory.\n */\nfunction deleteFilesInDir(dir: string, pattern: RegExp, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && pattern.test(entry)) {\n rmSync(fullPath);\n if (verbose) {\n logger.debug(`Deleted: ${fullPath}`);\n }\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Runs the reset command.\n */\nexport async function runReset(options: ResetOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Reset Omnify Generated Files');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Determine paths to clean\n const paths: { name: string; path: string; type: 'dir' | 'file' | 'files'; pattern?: RegExp }[] = [];\n\n // Common OmnifyBase locations (check both with and without backend prefix)\n const omnifyBasePaths = [\n 'app/Models/OmnifyBase',\n 'backend/app/Models/OmnifyBase',\n 'src/Models/OmnifyBase',\n ];\n\n for (const relPath of omnifyBasePaths) {\n const omnifyBasePath = resolve(rootDir, relPath);\n if (existsSync(omnifyBasePath)) {\n paths.push({ name: 'OmnifyBase models', path: omnifyBasePath, type: 'dir' });\n break; // Only add the first match\n }\n }\n\n // Common migration locations\n const migrationPaths = [\n 'database/migrations/omnify',\n 'backend/database/migrations/omnify',\n ];\n\n for (const relPath of migrationPaths) {\n const migrationsPath = resolve(rootDir, relPath);\n if (existsSync(migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n break; // Only add the first match\n }\n }\n\n // Also check config.output.laravel if available\n const laravelConfig = config.output.laravel;\n if (laravelConfig?.modelsPath) {\n const modelsPath = resolve(rootDir, laravelConfig.modelsPath);\n const omnifyBasePath = join(modelsPath, 'OmnifyBase');\n if (existsSync(omnifyBasePath) && !paths.some(p => p.path === omnifyBasePath)) {\n paths.push({ name: 'OmnifyBase models', path: omnifyBasePath, type: 'dir' });\n }\n }\n\n if (laravelConfig?.migrationsPath) {\n const migrationsPath = resolve(rootDir, laravelConfig.migrationsPath);\n if (existsSync(migrationsPath) && !paths.some(p => p.path === migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n }\n }\n\n // Lock files\n const lockFilePath = resolve(rootDir, config.lockFilePath);\n if (existsSync(lockFilePath)) {\n paths.push({ name: 'Lock file', path: lockFilePath, type: 'file' });\n }\n\n // Version history directory (.omnify-versions)\n const versionsDir = resolve(rootDir, '.omnify-versions');\n if (existsSync(versionsDir)) {\n paths.push({ name: 'Version history', path: versionsDir, type: 'dir' });\n }\n\n // Also check for versions inside .omnify directory (but NOT schemas!)\n const omnifyVersionsDir = resolve(rootDir, '.omnify/versions');\n if (existsSync(omnifyVersionsDir)) {\n paths.push({ name: 'Version history (.omnify/versions)', path: omnifyVersionsDir, type: 'dir' });\n }\n\n // Logs directory\n const logsDir = resolve(rootDir, '.omnify/logs');\n if (existsSync(logsDir)) {\n paths.push({ name: 'Logs', path: logsDir, type: 'dir' });\n }\n\n // Check if anything to clean\n if (paths.length === 0) {\n logger.info('Nothing to clean. No generated files found.');\n return;\n }\n\n // Show what will be deleted\n logger.newline();\n logger.warn('The following will be deleted:');\n logger.newline();\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = countFiles(item.path);\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = readdirSync(item.path).filter((f) => item.pattern!.test(f)).length;\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else {\n logger.info(` • ${item.name}: ${item.path}`);\n }\n }\n\n logger.newline();\n\n // Ask for confirmation\n if (!options.yes) {\n const confirmed = await confirm('Are you sure you want to delete these files?');\n if (!confirmed) {\n logger.info('Reset cancelled.');\n return;\n }\n }\n\n logger.newline();\n logger.step('Deleting files...');\n\n // Delete files\n let totalDeleted = 0;\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = deleteDir(item.path, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = deleteFilesInDir(item.path, item.pattern, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else {\n rmSync(item.path, { force: true });\n if (options.verbose) {\n logger.debug(`Deleted: ${item.path}`);\n }\n totalDeleted++;\n logger.info(` ✓ Deleted ${item.name}`);\n }\n }\n\n logger.newline();\n logger.success(`Reset complete! Deleted ${totalDeleted} file(s).`);\n logger.newline();\n logger.info('Run `omnify generate` to regenerate files.');\n}\n\n/**\n * Registers the reset command.\n */\nexport function registerResetCommand(program: Command): void {\n program\n .command('reset')\n .description('Delete all generated files (OmnifyBase, migrations, locks)')\n .option('-v, --verbose', 'Show detailed output')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: ResetOptions) => {\n try {\n await runReset(options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Create Laravel Project Command\n *\n * Creates a new Laravel project from the boilerplate template.\n */\n\nimport { execSync, spawn } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Default boilerplate repository URL\n */\nconst BOILERPLATE_REPO = 'https://github.com/omnifyjp/omnify-laravel-boilerplate.git';\n\n/**\n * Check if git is installed\n */\nfunction checkGit(): boolean {\n try {\n execSync('git --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Entries to remove from .gitignore for consumer projects\n * These are ignored in boilerplate but should be tracked in real projects\n */\nconst GITIGNORE_ENTRIES_TO_REMOVE = [\n // Auto-generated projects (consumers need to track these)\n '# Auto-generated projects',\n 'backend/',\n 'frontend/',\n // Lock files (consumers should track their lock state)\n '# Lock files',\n '.omnify.lock',\n '.omnify/versions/',\n '.omnify/current.lock',\n // Omnify auto-generated docs (consumers should track these)\n '# Omnify auto-generated docs',\n '.cursor/rules/omnify.md',\n '.claude/omnify/',\n];\n\n/**\n * Clean up .gitignore for consumer project\n * Removes entries that should be tracked in consumer projects\n */\nfunction cleanupGitignore(targetDir: string): void {\n const gitignorePath = resolve(targetDir, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = content.split('\\n');\n\n // Remove entries that consumers should track\n const cleanedLines = lines.filter((line) => {\n const trimmed = line.trim();\n return !GITIGNORE_ENTRIES_TO_REMOVE.includes(trimmed);\n });\n\n // Remove leading empty lines\n while (cleanedLines.length > 0 && cleanedLines[0].trim() === '') {\n cleanedLines.shift();\n }\n\n writeFileSync(gitignorePath, cleanedLines.join('\\n'));\n}\n\n/**\n * Clone the boilerplate repository\n */\nfunction cloneRepo(repo: string, targetDir: string): void {\n logger.step(`Cloning boilerplate from ${repo}...`);\n execSync(`git clone --depth 1 ${repo} \"${targetDir}\"`, { stdio: 'inherit' });\n\n // Remove .git directory to start fresh\n const gitDir = resolve(targetDir, '.git');\n if (existsSync(gitDir)) {\n rmSync(gitDir, { recursive: true, force: true });\n }\n\n // Clean up .gitignore for consumer\n cleanupGitignore(targetDir);\n\n // Initialize new git repository\n execSync('git init', { cwd: targetDir, stdio: 'ignore' });\n logger.success('Repository cloned successfully');\n}\n\n/**\n * Run a command and wait for completion\n */\nfunction runCommand(command: string, targetDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, [], {\n cwd: targetDir,\n shell: true,\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Run setup script\n */\nasync function runSetup(targetDir: string): Promise<void> {\n // Step 1: Install dependencies\n logger.step('Installing dependencies...');\n await runCommand('pnpm install', targetDir);\n logger.success('Dependencies installed');\n\n // Step 2: Run setup script\n logger.step('Running setup...');\n const isWindows = process.platform === 'win32';\n const setupScript = isWindows ? 'pnpm run setup:win' : 'pnpm run setup';\n await runCommand(setupScript, targetDir);\n}\n\n/**\n * Run the create-laravel-project command\n */\nexport async function runCreateProject(\n projectName: string,\n options: { repo?: string; skipSetup?: boolean }\n): Promise<void> {\n const targetDir = resolve(process.cwd(), projectName);\n const repo = options.repo ?? BOILERPLATE_REPO;\n\n // Check if git is available\n if (!checkGit()) {\n logger.error('Git is not installed. Please install git first.');\n process.exit(1);\n }\n\n // Check if target directory already exists\n if (existsSync(targetDir)) {\n logger.error(`Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n logger.newline();\n logger.info(`Creating new Laravel project: ${projectName}`);\n logger.newline();\n\n try {\n // Clone the repository\n cloneRepo(repo, targetDir);\n\n // Run setup if not skipped\n if (!options.skipSetup) {\n process.chdir(targetDir);\n await runSetup(targetDir);\n }\n\n logger.newline();\n logger.success('Project created successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.info(` cd ${projectName}`);\n if (options.skipSetup) {\n logger.info(' pnpm run setup');\n }\n logger.info(' pnpm run dev');\n logger.newline();\n } catch (error) {\n // Clean up on error\n if (existsSync(targetDir)) {\n rmSync(targetDir, { recursive: true, force: true });\n }\n throw error;\n }\n}\n\n/**\n * Register the create-laravel-project command\n */\nexport function registerCreateProjectCommand(program: Command): void {\n program\n .command('create-laravel-project <project-name>')\n .description('Create a new Laravel project from boilerplate')\n .option('-r, --repo <url>', 'Custom boilerplate repository URL', BOILERPLATE_REPO)\n .option('--skip-setup', 'Skip running the setup script')\n .action(async (projectName: string, options: { repo?: string; skipSetup?: boolean }) => {\n try {\n await runCreateProject(projectName, options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwHrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEtB,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DzB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["existsSync","resolve","OmnifyError","configPath","schemasDir","program","resolve","dirname","OmnifyError","existsSync","resolve","configPath","configPath","dirname","resolve","OmnifyError","program","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","pc","configPath","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","existsSync","mkdirSync","writeFileSync","resolve","existsSync","resolve","dirname","mkdirSync","writeFileSync","configPath","loadSchemas","validateSchemas","OmnifyError","program","existsSync","readdirSync","resolve","dirname","confirm","resolve","existsSync","readdirSync","configPath","dirname","program","existsSync","rmSync","writeFileSync","resolve","resolve","existsSync","writeFileSync","rmSync","program","OmnifyError","resolve","existsSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/output/logger.ts","../src/commands/validate.ts","../src/config/loader.ts","../src/commands/diff.ts","../src/operations/diff.ts","../src/commands/generate.ts","../src/guides/index.ts","../src/commands/reset.ts","../src/commands/create-project.ts"],"sourcesContent":["/**\n * @famgia/omnify-cli - CLI Runner\n * This file contains the actual CLI execution logic.\n * Import this file to run the CLI (has side effects).\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n registerResetCommand,\n registerCreateProjectCommand,\n runInit,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.5';\n\n/**\n * Main CLI program.\n */\nconst program = new Command();\n\nprogram\n .name('omnify')\n .description('Schema-first database migrations for Laravel and TypeScript')\n .version(VERSION);\n\n// Register commands\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterDiffCommand(program);\nregisterGenerateCommand(program);\nregisterResetCommand(program);\nregisterCreateProjectCommand(program);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else {\n logger.error(error.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n if (reason instanceof OmnifyError) {\n logger.formatError(reason);\n process.exit(logger.getExitCode(reason));\n } else if (reason instanceof Error) {\n logger.error(reason.message);\n } else {\n logger.error(String(reason));\n }\n process.exit(1);\n});\n\n// Check if we should auto-run init\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst hasCommand = firstArg !== undefined && !firstArg.startsWith('-');\nconst configPath = resolve(process.cwd(), 'omnify.config.ts');\nconst hasConfig = existsSync(configPath);\n\nif (!hasCommand && !hasConfig) {\n // No command specified and no config exists → run init\n runInit({}).catch((error) => {\n if (error instanceof Error) {\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n });\n} else {\n // Parse CLI arguments normally\n program.parse();\n}\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with interactive configuration.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { logger } from '../output/logger.js';\n\n/**\n * Migration tool options.\n */\ntype MigrationTool = 'laravel' | 'prisma' | 'drizzle' | 'none';\n\n/**\n * Project configuration from prompts.\n */\ninterface ProjectConfig {\n database: 'mysql' | 'postgres' | 'sqlite';\n migrationTool: MigrationTool;\n generateTypes: boolean;\n migrationsPath: string;\n typesPath: string;\n schemasDir: string;\n}\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://github.com/famgia/omnify for documentation\n\nname: User\ndisplayName: User Account\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n displayName: Email Address\n\n name:\n type: String\n displayName: Full Name\n\n bio:\n type: Text\n nullable: true\n displayName: Biography\n\noptions:\n timestamps: true\n softDelete: true\n`;\n\n/**\n * Generates config file content based on project configuration.\n */\nfunction generateConfig(config: ProjectConfig): string {\n const imports: string[] = [`import { defineConfig } from '@famgia/omnify';`];\n const plugins: string[] = [];\n\n // Add Laravel plugin\n if (config.migrationTool === 'laravel') {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n migrationsPath: '${config.migrationsPath}',\n typesPath: '${config.typesPath}',\n singleFile: true,\n generateMigrations: true,\n generateTypes: ${config.generateTypes},\n }),`);\n }\n\n // Prisma plugin (coming soon)\n if (config.migrationTool === 'prisma') {\n plugins.push(` // Prisma plugin coming soon!\n // prisma({ schemaPath: 'prisma/schema.prisma' }),`);\n }\n\n // Drizzle plugin (coming soon)\n if (config.migrationTool === 'drizzle') {\n plugins.push(` // Drizzle plugin coming soon!\n // drizzle({ schemaPath: 'src/db/schema.ts' }),`);\n }\n\n // TypeScript-only (no migration tool)\n if (config.migrationTool === 'none' && config.generateTypes) {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n typesPath: '${config.typesPath}',\n generateMigrations: false,\n generateTypes: true,\n }),`);\n }\n\n // Database URL examples\n const dbUrlExamples: Record<string, string> = {\n mysql: 'mysql://root:password@localhost:3306/omnify_dev',\n postgres: 'postgres://postgres:password@localhost:5432/omnify_dev',\n sqlite: 'sqlite://./omnify_dev.db',\n };\n\n return `${imports.join('\\n')}\n\nexport default defineConfig({\n // Schema files location\n schemasDir: '${config.schemasDir}',\n\n // Lock file for tracking schema changes\n lockFilePath: './omnify.lock',\n\n // Database configuration\n database: {\n driver: '${config.database}',\n // REQUIRED: Set your development database URL\n // devUrl: '${dbUrlExamples[config.database]}',\n },\n\n // Generator plugins\n plugins: [\n${plugins.join('\\n\\n')}\n ],\n});\n`;\n}\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n yes?: boolean;\n}\n\n/**\n * Runs the init command with interactive prompts.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Omnify Project Setup');\n logger.newline();\n\n // Check if config already exists\n const configPath = resolve(cwd, 'omnify.config.ts');\n if (existsSync(configPath) && !options.force) {\n logger.warn('omnify.config.ts already exists. Use --force to overwrite.');\n return;\n }\n\n let config: ProjectConfig;\n\n if (options.yes) {\n // Use defaults (Laravel)\n config = {\n database: 'mysql',\n migrationTool: 'laravel',\n generateTypes: true,\n migrationsPath: 'database/migrations',\n typesPath: 'resources/js/types',\n schemasDir: './schemas',\n };\n logger.info('Using default configuration...');\n } else {\n // Interactive prompts\n logger.info('Answer a few questions to configure your project:\\n');\n\n // 1. Database selection\n const database = await select({\n message: 'Which database?',\n choices: [\n { name: 'MySQL / MariaDB', value: 'mysql' as const },\n { name: 'PostgreSQL', value: 'postgres' as const },\n { name: 'SQLite', value: 'sqlite' as const },\n ],\n default: 'mysql',\n });\n\n // 2. Migration tool selection\n const migrationTool = await select({\n message: 'Which migration tool?',\n choices: [\n { name: 'Laravel (PHP)', value: 'laravel' as const },\n { name: 'Prisma (coming soon)', value: 'prisma' as const, disabled: true },\n { name: 'Drizzle (coming soon)', value: 'drizzle' as const, disabled: true },\n { name: 'None (types only)', value: 'none' as const },\n ],\n default: 'laravel',\n });\n\n // 3. TypeScript types\n const generateTypes = await confirm({\n message: 'Generate TypeScript types?',\n default: true,\n });\n\n // Default paths based on migration tool\n const defaultPaths: Record<MigrationTool, { migrations: string; types: string }> = {\n laravel: { migrations: 'database/migrations', types: 'resources/js/types' },\n prisma: { migrations: 'prisma/migrations', types: 'src/types' },\n drizzle: { migrations: 'drizzle', types: 'src/types' },\n none: { migrations: '', types: 'types' },\n };\n\n const defaults = defaultPaths[migrationTool];\n let migrationsPath = defaults.migrations;\n let typesPath = defaults.types;\n\n if (migrationTool !== 'none') {\n migrationsPath = await input({\n message: 'Migrations output path:',\n default: defaults.migrations,\n });\n }\n\n if (generateTypes) {\n typesPath = await input({\n message: 'TypeScript types path:',\n default: defaults.types,\n });\n }\n\n // Schemas directory\n const schemasDir = await input({\n message: 'Schemas directory:',\n default: './schemas',\n });\n\n config = {\n database,\n migrationTool,\n generateTypes,\n migrationsPath,\n typesPath,\n schemasDir,\n };\n }\n\n logger.newline();\n logger.step('Creating project files...');\n\n // Create schemas directory\n const schemasDir = resolve(cwd, config.schemasDir);\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created ${config.schemasDir}/ directory`);\n }\n\n // Create example schema\n const examplePath = resolve(schemasDir, 'User.yaml');\n if (!existsSync(examplePath) || options.force) {\n writeFileSync(examplePath, EXAMPLE_SCHEMA);\n logger.debug('Created example schema: User.yaml');\n }\n\n // Create config file\n const configContent = generateConfig(config);\n writeFileSync(configPath, configContent);\n logger.debug('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized!');\n logger.newline();\n\n // Summary\n const toolName =\n config.migrationTool === 'laravel'\n ? 'Laravel'\n : config.migrationTool === 'prisma'\n ? 'Prisma'\n : config.migrationTool === 'drizzle'\n ? 'Drizzle'\n : 'None';\n\n logger.info('Configuration:');\n logger.list([\n `Database: ${config.database}`,\n `Migration tool: ${toolName}`,\n `TypeScript types: ${config.generateTypes ? 'Yes' : 'No'}`,\n ]);\n\n logger.newline();\n logger.info('Files created:');\n logger.list(['omnify.config.ts', `${config.schemasDir}/User.yaml`]);\n\n logger.newline();\n logger.info('Next steps:');\n logger.newline();\n\n logger.step('1. Set database URL in omnify.config.ts');\n logger.newline();\n\n logger.step('2. Define schemas in ' + config.schemasDir + '/');\n logger.newline();\n\n logger.step('3. Generate:');\n logger.info(' npx omnify validate');\n logger.info(' npx omnify generate');\n logger.newline();\n}\n\n/**\n * Registers the init command.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new omnify project')\n .option('-f, --force', 'Overwrite existing files')\n .option('-y, --yes', 'Use default configuration (skip prompts)')\n .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\n // Handle Ctrl+C gracefully\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Logger\n *\n * CLI output and logging utilities.\n */\n\nimport pc from 'picocolors';\nimport { OmnifyError, formatError, getExitCode } from '@famgia/omnify-core';\n\n/**\n * Logger options.\n */\nexport interface LoggerOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Suppress all output except errors */\n quiet?: boolean;\n}\n\n/**\n * CLI Logger for formatted output.\n */\nexport class Logger {\n private _verbose: boolean;\n private _quiet: boolean;\n private _startTime: number;\n\n constructor(options: LoggerOptions = {}) {\n this._verbose = options.verbose ?? false;\n this._quiet = options.quiet ?? false;\n this._startTime = Date.now();\n }\n\n /**\n * Enable or disable verbose mode.\n */\n setVerbose(verbose: boolean): void {\n this._verbose = verbose;\n }\n\n /**\n * Enable or disable quiet mode.\n */\n setQuiet(quiet: boolean): void {\n this._quiet = quiet;\n }\n\n /**\n * Log an info message.\n */\n info(message: string): void {\n if (!this._quiet) {\n console.log(message);\n }\n }\n\n /**\n * Log a success message.\n */\n success(message: string): void {\n if (!this._quiet) {\n console.log(pc.green('✓') + ' ' + message);\n }\n }\n\n /**\n * Log a warning message.\n */\n warn(message: string): void {\n if (!this._quiet) {\n console.log(pc.yellow('⚠') + ' ' + pc.yellow(message));\n }\n }\n\n /**\n * Log an error message.\n */\n error(message: string): void {\n console.error(pc.red('✗') + ' ' + pc.red(message));\n }\n\n /**\n * Log a debug message (only in verbose mode).\n */\n debug(message: string): void {\n if (this._verbose && !this._quiet) {\n console.log(pc.dim(' ' + message));\n }\n }\n\n /**\n * Log a step message.\n */\n step(message: string): void {\n if (!this._quiet) {\n console.log(pc.cyan('→') + ' ' + message);\n }\n }\n\n /**\n * Log a header.\n */\n header(message: string): void {\n if (!this._quiet) {\n console.log();\n console.log(pc.bold(message));\n console.log();\n }\n }\n\n /**\n * Log a list item.\n */\n list(items: string[]): void {\n if (!this._quiet) {\n for (const item of items) {\n console.log(' • ' + item);\n }\n }\n }\n\n /**\n * Log a timing message.\n */\n timing(message: string): void {\n if (this._verbose && !this._quiet) {\n const elapsed = Date.now() - this._startTime;\n console.log(pc.dim(` [${elapsed}ms] ${message}`));\n }\n }\n\n /**\n * Log an empty line.\n */\n newline(): void {\n if (!this._quiet) {\n console.log();\n }\n }\n\n /**\n * Format and log an OmnifyError.\n */\n formatError(error: OmnifyError): void {\n const formatted = formatError(error, { color: true });\n console.error(formatted);\n }\n\n /**\n * Get exit code for an error.\n */\n getExitCode(error: OmnifyError): number {\n return getExitCode(error);\n }\n}\n\n/**\n * Global logger instance.\n */\nexport const logger = new Logger();\n","/**\n * @famgia/omnify-cli - Validate Command\n *\n * Validates schema files for syntax and semantic errors.\n */\n\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Validate command options.\n */\ninterface ValidateOptions {\n verbose?: boolean;\n}\n\n/**\n * Runs the validate command.\n */\nexport async function runValidate(options: ValidateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Validating Schemas');\n\n // Load configuration\n logger.debug('Loading configuration...');\n logger.timing('Config load start');\n const { config, configPath } = await loadConfig();\n logger.timing('Config loaded');\n\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (checks schema directory exists)\n validateConfig(config, rootDir);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n logger.timing('Schema load start');\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n logger.timing('Schemas loaded');\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Validate schemas\n logger.step('Validating schemas...');\n logger.timing('Validation start');\n\n const result = validateSchemas(schemas);\n logger.timing('Validation complete');\n\n if (result.valid) {\n logger.success(`All ${schemaCount} schema(s) are valid`);\n } else {\n logger.error(`Found ${result.errors.length} validation error(s)`);\n logger.newline();\n\n for (const error of result.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n logger.newline();\n }\n\n process.exit(2);\n }\n}\n\n/**\n * Registers the validate command.\n */\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate')\n .description('Validate schema files')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (options: ValidateOptions) => {\n try {\n await runValidate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Configuration Loader\n *\n * Loads and resolves omnify.config.ts configuration.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { createJiti } from 'jiti';\nimport type { OmnifyConfig, ResolvedOmnifyConfig, OmnifyPlugin } from '@famgia/omnify-types';\nimport type { ConfigLoadResult } from './types.js';\nimport { configError, configNotFoundError } from '@famgia/omnify-core';\n\n/**\n * Configuration file names to search for (in order of priority).\n */\nconst CONFIG_FILES = [\n 'omnify.config.ts',\n 'omnify.config.js',\n 'omnify.config.mjs',\n 'omnify.config.cjs',\n];\n\n/**\n * Finds configuration file in directory.\n */\nexport function findConfigFile(startDir: string): string | null {\n const cwd = resolve(startDir);\n\n for (const filename of CONFIG_FILES) {\n const configPath = resolve(cwd, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Loads configuration from file using jiti.\n */\nasync function loadConfigFile(configPath: string): Promise<OmnifyConfig> {\n const jiti = createJiti(configPath, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(configPath);\n const config = module as OmnifyConfig;\n\n // Handle default export\n if ('default' in config) {\n return (config as { default: OmnifyConfig }).default;\n }\n\n return config;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load config file: ${message}. Check your omnify.config.ts for syntax errors.`,\n 'E002'\n );\n }\n}\n\n/**\n * Resolves plugins from configuration.\n * Handles both string (npm package) and object plugins.\n */\nasync function resolvePlugins(\n plugins: readonly (string | OmnifyPlugin)[] | undefined,\n configPath: string | null\n): Promise<OmnifyPlugin[]> {\n if (!plugins || plugins.length === 0) {\n return [];\n }\n\n const resolved: OmnifyPlugin[] = [];\n const configDir = configPath ? dirname(configPath) : process.cwd();\n\n for (const plugin of plugins) {\n if (typeof plugin === 'string') {\n // Load plugin from npm package\n const jiti = createJiti(configDir, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(plugin);\n const loadedPlugin = (module as { default?: OmnifyPlugin }).default ?? module;\n resolved.push(loadedPlugin as OmnifyPlugin);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load plugin '${plugin}': ${message}. Ensure the plugin is installed: npm install ${plugin}`,\n 'E301'\n );\n }\n } else {\n // Direct plugin object\n resolved.push(plugin);\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolves configuration with defaults.\n */\nexport async function resolveConfig(\n userConfig: OmnifyConfig,\n configPath: string | null\n): Promise<ResolvedOmnifyConfig> {\n const plugins = await resolvePlugins(userConfig.plugins, configPath);\n\n // Build database config, only including defined optional properties\n const databaseConfig = {\n driver: userConfig.database.driver,\n enableFieldComments: userConfig.database.enableFieldComments ?? false,\n };\n // Only add devUrl if defined\n const database = userConfig.database.devUrl !== undefined\n ? { ...databaseConfig, devUrl: userConfig.database.devUrl }\n : databaseConfig;\n\n // Build laravel output config\n const laravelConfig = {\n migrationsPath: userConfig.output?.laravel?.migrationsPath ?? 'database/migrations',\n };\n // Only add optional properties if they are defined\n const laravel = buildLaravelConfig(laravelConfig, userConfig.output?.laravel);\n\n // Build typescript output config\n const typescript = {\n path: userConfig.output?.typescript?.path ?? 'types',\n singleFile: userConfig.output?.typescript?.singleFile ?? true,\n generateEnums: userConfig.output?.typescript?.generateEnums ?? true,\n generateRelationships: userConfig.output?.typescript?.generateRelationships ?? true,\n };\n\n const result: ResolvedOmnifyConfig = {\n schemasDir: userConfig.schemasDir ?? './schemas',\n database: database as ResolvedOmnifyConfig['database'],\n output: {\n laravel,\n typescript,\n } as ResolvedOmnifyConfig['output'],\n plugins,\n verbose: userConfig.verbose ?? false,\n lockFilePath: userConfig.lockFilePath ?? '.omnify.lock',\n ...(userConfig.locale && { locale: userConfig.locale }),\n };\n\n return result;\n}\n\n/**\n * Builds Laravel config with only defined optional properties.\n */\nfunction buildLaravelConfig(\n base: { migrationsPath: string },\n userLaravel?: Readonly<{\n migrationsPath?: string;\n modelsPath?: string;\n baseModelsPath?: string;\n providersPath?: string;\n modelsNamespace?: string;\n factoriesPath?: string;\n enumsPath?: string;\n enumsNamespace?: string;\n }>\n): ResolvedOmnifyConfig['output']['laravel'] {\n const config: ResolvedOmnifyConfig['output']['laravel'] = { ...base };\n\n if (userLaravel?.modelsPath !== undefined) {\n (config as { modelsPath: string }).modelsPath = userLaravel.modelsPath;\n }\n if (userLaravel?.baseModelsPath !== undefined) {\n (config as { baseModelsPath: string }).baseModelsPath = userLaravel.baseModelsPath;\n }\n if (userLaravel?.providersPath !== undefined) {\n (config as { providersPath: string }).providersPath = userLaravel.providersPath;\n }\n if (userLaravel?.modelsNamespace !== undefined) {\n (config as { modelsNamespace: string }).modelsNamespace = userLaravel.modelsNamespace;\n }\n if (userLaravel?.factoriesPath !== undefined) {\n (config as { factoriesPath: string }).factoriesPath = userLaravel.factoriesPath;\n }\n if (userLaravel?.enumsPath !== undefined) {\n (config as { enumsPath: string }).enumsPath = userLaravel.enumsPath;\n }\n if (userLaravel?.enumsNamespace !== undefined) {\n (config as { enumsNamespace: string }).enumsNamespace = userLaravel.enumsNamespace;\n }\n\n return config;\n}\n\n/**\n * Validates required configuration.\n */\nexport function validateConfig(config: ResolvedOmnifyConfig, rootDir: string): void {\n // Validate schema directory exists\n const schemaPath = resolve(rootDir, config.schemasDir);\n if (!existsSync(schemaPath)) {\n throw configError(\n `Schema directory not found: ${schemaPath}. Create the '${config.schemasDir}' directory or update schemasDir in config.`,\n 'E002'\n );\n }\n}\n\n/**\n * Validates that devUrl is configured (required for diff/generate operations).\n */\nexport function requireDevUrl(config: ResolvedOmnifyConfig): void {\n if (!config.database.devUrl) {\n throw configError(\n `database.devUrl is required for diff and generate operations. Add devUrl to your database config, e.g., \"mysql://root@localhost:3306/omnify_dev\"`,\n 'E003'\n );\n }\n}\n\n/**\n * Loads configuration from file or returns defaults.\n */\nexport async function loadConfig(startDir: string = process.cwd()): Promise<ConfigLoadResult> {\n const cwd = resolve(startDir);\n const configPath = findConfigFile(cwd);\n\n if (configPath) {\n const userConfig = await loadConfigFile(configPath);\n const config = await resolveConfig(userConfig, configPath);\n\n return {\n config,\n configPath,\n };\n }\n\n // No config file found - require config file\n throw configNotFoundError(resolve(cwd, 'omnify.config.ts'));\n}\n\n/**\n * Helper function for type-safe configuration.\n * Used in omnify.config.ts files.\n */\nexport function defineConfig(config: OmnifyConfig): OmnifyConfig {\n return config;\n}\n","/**\n * @famgia/omnify-cli - Diff Command\n *\n * Shows pending schema changes without generating migrations.\n */\n\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.js';\nimport pc from 'picocolors';\n\n/**\n * Diff command options.\n */\ninterface DiffOptions {\n verbose?: boolean;\n check?: boolean;\n}\n\n/**\n * Runs the diff command.\n */\nexport async function runDiff(options: DiffOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Checking for Schema Changes');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config and require devUrl for diff\n validateConfig(config, rootDir);\n requireDevUrl(config);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas);\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before running diff.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Run diff operation\n logger.step('Running Atlas diff...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const diffResult = await runDiffOperation({\n schemas,\n devUrl: config.database.devUrl!,\n lockFilePath: lockPath,\n driver: config.database.driver,\n workDir: rootDir,\n });\n\n if (!diffResult.hasChanges) {\n logger.success('No changes detected');\n return;\n }\n\n // Show changes preview\n logger.newline();\n console.log(pc.bold('Changes detected:'));\n console.log();\n console.log(diffResult.formattedPreview);\n\n if (diffResult.hasDestructiveChanges) {\n logger.newline();\n logger.warn('This preview contains destructive changes. Review carefully.');\n }\n\n // Check mode: exit with code 1 if changes exist\n if (options.check) {\n logger.newline();\n logger.info('Changes detected (--check mode)');\n process.exit(1);\n }\n\n logger.newline();\n logger.info('Run \"omnify generate\" to create migrations');\n}\n\n/**\n * Registers the diff command.\n */\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff')\n .description('Show pending schema changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--check', 'Exit with code 1 if changes exist (for CI)')\n .action(async (options: DiffOptions) => {\n try {\n await runDiff(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Diff Operations\n *\n * High-level diff operations combining atlas-adapter functions.\n */\n\nimport type { SchemaCollection, DatabaseDriver } from '@famgia/omnify-types';\nimport {\n generatePreview,\n formatPreview,\n type ChangePreview,\n} from '@famgia/omnify-atlas';\n\n/**\n * Options for running diff.\n */\nexport interface RunDiffOptions {\n schemas: SchemaCollection;\n devUrl: string;\n lockFilePath: string;\n driver: DatabaseDriver;\n workDir: string;\n}\n\n/**\n * Result of diff operation.\n */\nexport interface DiffOperationResult {\n hasChanges: boolean;\n hasDestructiveChanges: boolean;\n preview: ChangePreview;\n formattedPreview: string;\n sql: string;\n}\n\n/**\n * Runs a full diff operation.\n */\nexport async function runDiffOperation(options: RunDiffOptions): Promise<DiffOperationResult> {\n const { schemas, devUrl, driver, workDir } = options;\n\n // Generate preview using atlas-adapter\n const preview = await generatePreview(schemas, {\n driver,\n devUrl,\n workDir,\n }, {\n warnDestructive: true,\n showSql: true,\n });\n\n // Format preview for display\n const formattedPreview = formatPreview(preview, 'text');\n\n return {\n hasChanges: preview.hasChanges,\n hasDestructiveChanges: preview.hasDestructiveChanges,\n preview,\n formattedPreview,\n sql: preview.sql,\n };\n}\n\n/**\n * Re-export for convenience.\n */\nexport { formatPreview };\n","/**\n * @famgia/omnify-cli - Generate Command\n *\n * Generates Laravel migrations and TypeScript types from schemas.\n * Supports both direct generation and plugin-based generation.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n loadSchemas,\n validateSchemas,\n OmnifyError,\n PluginManager,\n createVersionStore,\n type VersionSchemaSnapshot,\n type VersionPropertySnapshot,\n type VersionChange,\n} from '@famgia/omnify-core';\nimport {\n writeLockFile,\n readLockFile,\n updateLockFile,\n buildSchemaSnapshots,\n compareSchemasDeep,\n isLockFileV2,\n type SchemaChange,\n} from '@famgia/omnify-atlas';\nimport {\n generateMigrations,\n generateMigrationsFromChanges,\n generateModels,\n getModelPath,\n generateFactories,\n getFactoryPath,\n} from '@famgia/omnify-laravel';\nimport { generateTypeScript } from '@famgia/omnify-typescript';\nimport type {\n OmnifyPlugin,\n SchemaCollection,\n GeneratorOutput,\n} from '@famgia/omnify-types';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { generateAIGuides } from '../guides/index.js';\n\n/**\n * Generate command options.\n */\ninterface GenerateOptions {\n verbose?: boolean;\n migrationsOnly?: boolean;\n typesOnly?: boolean;\n force?: boolean;\n}\n\n/**\n * Checks if plugins have generators configured.\n */\nfunction hasPluginGenerators(plugins: readonly OmnifyPlugin[]): boolean {\n return plugins.some((p) => p.generators && p.generators.length > 0);\n}\n\n/**\n * Scans a directory for existing migration files and returns tables that already have CREATE migrations.\n */\nfunction getExistingMigrationTables(migrationsDir: string): Set<string> {\n const existingTables = new Set<string>();\n\n if (!existsSync(migrationsDir)) {\n return existingTables;\n }\n\n try {\n const files = readdirSync(migrationsDir);\n // Match pattern: YYYY_MM_DD_HHMMSS_create_<table>_table.php\n const createMigrationPattern = /^\\d{4}_\\d{2}_\\d{2}_\\d{6}_create_(.+)_table\\.php$/;\n\n for (const file of files) {\n const match = file.match(createMigrationPattern);\n if (match) {\n existingTables.add(match[1]); // table name\n }\n }\n } catch {\n // Ignore errors reading directory\n }\n\n return existingTables;\n}\n\n/**\n * Logs detailed schema change information.\n */\nfunction logSchemaChange(change: SchemaChange, verbose: boolean): void {\n logger.debug(` ${change.changeType}: ${change.schemaName}`);\n\n if (!verbose || change.changeType !== 'modified') {\n return;\n }\n\n // Log column changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n logger.debug(` + column: ${col.column} (${col.currentDef?.type})`);\n } else if (col.changeType === 'removed') {\n logger.debug(` - column: ${col.column}`);\n } else if (col.changeType === 'modified' && col.modifications) {\n logger.debug(` ~ column: ${col.column} [${col.modifications.join(', ')}]`);\n } else if (col.changeType === 'renamed' && col.previousColumn) {\n const mods = col.modifications?.length ? ` [${col.modifications.join(', ')}]` : '';\n logger.debug(` → column: ${col.previousColumn} → ${col.column}${mods}`);\n }\n }\n }\n\n // Log index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n const type = idx.index.unique ? 'unique' : 'index';\n if (idx.changeType === 'added') {\n logger.debug(` + ${type}: (${idx.index.columns.join(', ')})`);\n } else {\n logger.debug(` - ${type}: (${idx.index.columns.join(', ')})`);\n }\n }\n }\n\n // Log option changes\n if (change.optionChanges) {\n if (change.optionChanges.timestamps) {\n const { from, to } = change.optionChanges.timestamps;\n logger.debug(` ~ timestamps: ${from} → ${to}`);\n }\n if (change.optionChanges.softDelete) {\n const { from, to } = change.optionChanges.softDelete;\n logger.debug(` ~ softDelete: ${from} → ${to}`);\n }\n if (change.optionChanges.idType) {\n const { from, to } = change.optionChanges.idType;\n logger.debug(` ~ idType: ${from} → ${to}`);\n }\n }\n}\n\n/**\n * Convert property to version snapshot format.\n */\nfunction propertyToVersionSnapshot(prop: Record<string, unknown>): VersionPropertySnapshot {\n return {\n type: prop.type as string,\n ...(prop.displayName !== undefined && { displayName: prop.displayName as string }),\n ...(prop.description !== undefined && { description: prop.description as string }),\n ...(prop.nullable !== undefined && { nullable: prop.nullable as boolean }),\n ...(prop.unique !== undefined && { unique: prop.unique as boolean }),\n ...(prop.default !== undefined && { default: prop.default }),\n ...(prop.length !== undefined && { length: prop.length as number }),\n ...(prop.unsigned !== undefined && { unsigned: prop.unsigned as boolean }),\n ...(prop.precision !== undefined && { precision: prop.precision as number }),\n ...(prop.scale !== undefined && { scale: prop.scale as number }),\n ...(prop.enum !== undefined && { enum: prop.enum as readonly string[] }),\n ...(prop.relation !== undefined && { relation: prop.relation as string }),\n ...(prop.target !== undefined && { target: prop.target as string }),\n ...(prop.targets !== undefined && { targets: prop.targets as readonly string[] }),\n ...(prop.morphName !== undefined && { morphName: prop.morphName as string }),\n ...(prop.onDelete !== undefined && { onDelete: prop.onDelete as string }),\n ...(prop.onUpdate !== undefined && { onUpdate: prop.onUpdate as string }),\n ...(prop.mappedBy !== undefined && { mappedBy: prop.mappedBy as string }),\n ...(prop.inversedBy !== undefined && { inversedBy: prop.inversedBy as string }),\n ...(prop.joinTable !== undefined && { joinTable: prop.joinTable as string }),\n ...(prop.owning !== undefined && { owning: prop.owning as boolean }),\n // Laravel-specific properties\n ...(prop.hidden !== undefined && { hidden: prop.hidden as boolean }),\n ...(prop.fillable !== undefined && { fillable: prop.fillable as boolean }),\n // Per-field overrides for compound types\n ...(prop.fields !== undefined && { fields: prop.fields as Record<string, { nullable?: boolean; hidden?: boolean; fillable?: boolean }> }),\n };\n}\n\n/**\n * Convert schemas to version snapshot format.\n */\nfunction schemasToVersionSnapshot(\n schemas: SchemaCollection\n): Record<string, VersionSchemaSnapshot> {\n const snapshot: Record<string, VersionSchemaSnapshot> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n const properties: Record<string, VersionPropertySnapshot> = {};\n if (schema.properties) {\n for (const [propName, prop] of Object.entries(schema.properties)) {\n properties[propName] = propertyToVersionSnapshot(prop as unknown as Record<string, unknown>);\n }\n }\n\n const opts = schema.options;\n snapshot[name] = {\n name: schema.name,\n kind: (schema.kind ?? 'object') as 'object' | 'enum',\n ...(Object.keys(properties).length > 0 && { properties }),\n ...(schema.values && { values: schema.values }),\n ...(opts && {\n options: {\n ...(opts.id !== undefined && { id: opts.id }),\n ...(opts.idType !== undefined && { idType: opts.idType }),\n ...(opts.timestamps !== undefined && { timestamps: opts.timestamps }),\n ...(opts.softDelete !== undefined && { softDelete: opts.softDelete }),\n ...(opts.tableName !== undefined && { tableName: opts.tableName }),\n ...(opts.translations !== undefined && { translations: opts.translations }),\n ...(opts.authenticatable !== undefined && { authenticatable: opts.authenticatable }),\n },\n }),\n };\n }\n\n return snapshot;\n}\n\n/**\n * Convert SchemaChange to VersionChange format.\n */\nfunction schemaChangeToVersionChange(change: SchemaChange): VersionChange[] {\n const changes: VersionChange[] = [];\n\n if (change.changeType === 'added') {\n changes.push({ action: 'schema_added', schema: change.schemaName });\n } else if (change.changeType === 'removed') {\n changes.push({ action: 'schema_removed', schema: change.schemaName });\n } else if (change.changeType === 'modified') {\n // Add property-level changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n changes.push({\n action: 'property_added',\n schema: change.schemaName,\n property: col.column,\n to: col.currentDef,\n });\n } else if (col.changeType === 'removed') {\n changes.push({\n action: 'property_removed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n });\n } else if (col.changeType === 'modified') {\n changes.push({\n action: 'property_modified',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n to: col.currentDef,\n });\n } else if (col.changeType === 'renamed') {\n changes.push({\n action: 'property_renamed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousColumn,\n to: col.column,\n });\n }\n }\n }\n\n // Add option changes\n if (change.optionChanges) {\n changes.push({\n action: 'option_changed',\n schema: change.schemaName,\n from: change.optionChanges,\n to: change.optionChanges,\n });\n }\n\n // Add index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n if (idx.changeType === 'added') {\n changes.push({\n action: 'index_added',\n schema: change.schemaName,\n to: idx.index,\n });\n } else {\n changes.push({\n action: 'index_removed',\n schema: change.schemaName,\n from: idx.index,\n });\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Writes generator outputs to disk.\n */\nfunction writeGeneratorOutputs(\n outputs: readonly GeneratorOutput[],\n rootDir: string\n): { migrations: number; types: number; models: number; factories: number; other: number } {\n const counts = { migrations: 0, types: 0, models: 0, factories: 0, other: 0 };\n\n for (const output of outputs) {\n const filePath = resolve(rootDir, output.path);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n logger.debug(`Created directory: ${dir}`);\n }\n\n // Skip writing if file exists and skipIfExists is true\n if (output.skipIfExists && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${output.path}`);\n continue;\n }\n\n writeFileSync(filePath, output.content);\n logger.debug(`Created: ${output.path}`);\n\n if (output.type === 'migration') counts.migrations++;\n else if (output.type === 'type') counts.types++;\n else if (output.type === 'model') counts.models++;\n else if (output.type === 'factory') counts.factories++;\n else counts.other++;\n }\n\n return counts;\n}\n\n/**\n * Runs generation using the plugin system.\n */\nasync function runPluginGeneration(\n plugins: readonly OmnifyPlugin[],\n schemas: SchemaCollection,\n rootDir: string,\n verbose: boolean,\n changes?: readonly SchemaChange[]\n): Promise<{ migrations: number; types: number; models: number; factories: number; other: number }> {\n const pluginManager = new PluginManager({\n cwd: rootDir,\n verbose,\n logger: {\n debug: (msg) => logger.debug(msg),\n info: (msg) => logger.info(msg),\n warn: (msg) => logger.warn(msg),\n error: (msg) => logger.error(msg),\n },\n });\n\n // Register plugins\n for (const plugin of plugins) {\n await pluginManager.register(plugin);\n }\n\n // Run generators with schema changes\n const result = await pluginManager.runGenerators(schemas, changes);\n\n if (!result.success) {\n for (const error of result.errors) {\n logger.error(`Generator ${error.generatorName} failed: ${error.message}`);\n }\n throw new Error('Generator execution failed');\n }\n\n // Write outputs\n return writeGeneratorOutputs(result.outputs, rootDir);\n}\n\n/**\n * Runs generation using direct function calls (legacy mode).\n */\nfunction runDirectGeneration(\n schemas: SchemaCollection,\n config: ResolvedOmnifyConfig,\n rootDir: string,\n options: GenerateOptions,\n changes: readonly SchemaChange[]\n): { migrations: number; types: number; models: number; factories: number } {\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Generate Laravel migrations\n if (!options.typesOnly && config.output.laravel) {\n logger.step('Generating Laravel migrations...');\n\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n logger.debug(`Created directory: ${migrationsDir}`);\n }\n\n // Separate added schemas from modified/removed\n const addedSchemaNames = new Set(\n changes.filter((c) => c.changeType === 'added').map((c) => c.schemaName)\n );\n const alterChanges = changes.filter(\n (c) => c.changeType === 'modified' || c.changeType === 'removed'\n );\n\n // Get existing migration tables to avoid duplicates\n const existingTables = getExistingMigrationTables(migrationsDir);\n\n // Generate CREATE migrations only for added schemas\n if (addedSchemaNames.size > 0) {\n const addedSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => addedSchemaNames.has(name))\n ) as SchemaCollection;\n\n const createMigrations = generateMigrations(addedSchemas, { customTypes: customTypesMap });\n for (const migration of createMigrations) {\n const tableName = migration.tables[0];\n // Skip if table already has a create migration\n if (existingTables.has(tableName)) {\n logger.debug(`Skipped CREATE for ${tableName} (already exists)`);\n continue;\n }\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n // Generate ALTER/DROP migrations for modified/removed schemas\n if (alterChanges.length > 0) {\n const alterMigrations = generateMigrationsFromChanges(alterChanges);\n for (const migration of alterMigrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate Laravel models\n if (!options.typesOnly && config.output.laravel?.modelsPath) {\n logger.step('Generating Laravel models...');\n\n const modelsPath = config.output.laravel.modelsPath;\n const baseModelsPath = config.output.laravel.baseModelsPath ?? `${modelsPath}/OmnifyBase`;\n\n // Ensure directories exist\n const modelsDir = resolve(rootDir, modelsPath);\n const baseModelsDir = resolve(rootDir, baseModelsPath);\n if (!existsSync(modelsDir)) {\n mkdirSync(modelsDir, { recursive: true });\n }\n if (!existsSync(baseModelsDir)) {\n mkdirSync(baseModelsDir, { recursive: true });\n }\n\n const providersPath = config.output.laravel.providersPath ?? 'app/Providers';\n\n const models = generateModels(schemas, {\n modelPath: modelsPath,\n baseModelPath: baseModelsPath,\n providersPath: providersPath,\n customTypes: customTypesMap,\n });\n\n for (const model of models) {\n const filePath = resolve(rootDir, getModelPath(model));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user models if they exist (don't overwrite customizations)\n // Always overwrite base models (overwrite: true)\n if (!model.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getModelPath(model)}`);\n continue;\n }\n\n writeFileSync(filePath, model.content);\n logger.debug(`Created: ${getModelPath(model)}`);\n modelsGenerated++;\n }\n\n logger.success(`Generated ${modelsGenerated} model(s)`);\n }\n\n // Generate Laravel factories\n if (!options.typesOnly && config.output.laravel?.factoriesPath) {\n logger.step('Generating Laravel factories...');\n\n const factoriesPath = config.output.laravel.factoriesPath;\n const factoriesDir = resolve(rootDir, factoriesPath);\n if (!existsSync(factoriesDir)) {\n mkdirSync(factoriesDir, { recursive: true });\n }\n\n const factories = generateFactories(schemas, {\n factoryPath: factoriesPath,\n });\n\n for (const factory of factories) {\n const filePath = resolve(rootDir, getFactoryPath(factory));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user factories if they exist (don't overwrite customizations)\n if (!factory.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getFactoryPath(factory)}`);\n continue;\n }\n\n writeFileSync(filePath, factory.content);\n logger.debug(`Created: ${getFactoryPath(factory)}`);\n factoriesGenerated++;\n }\n\n logger.success(`Generated ${factoriesGenerated} factory(ies)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly && config.output.typescript) {\n logger.step('Generating TypeScript types...');\n\n const typesDir = resolve(rootDir, config.output.typescript.path);\n if (!existsSync(typesDir)) {\n mkdirSync(typesDir, { recursive: true });\n logger.debug(`Created directory: ${typesDir}`);\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typescriptConfig = config.output.typescript as { generateRules?: boolean; validationTemplates?: Record<string, Record<string, string>> };\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: typescriptConfig.generateRules ?? true,\n validationTemplates: typescriptConfig.validationTemplates,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.filePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n return { migrations: migrationsGenerated, types: typesGenerated, models: modelsGenerated, factories: factoriesGenerated };\n}\n\n/**\n * Runs the generate command.\n */\nexport async function runGenerate(options: GenerateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Generating Outputs');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (devUrl not required for generate)\n validateConfig(config, rootDir);\n\n // Load schemas\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n const schemas = await loadSchemas(schemaPath);\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Found ${schemaCount} schema(s)`);\n\n // Extract custom type names from plugins for validation\n const customTypeNames: string[] = [];\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypeNames.push(typeDef.name);\n }\n }\n }\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas, {\n customTypes: customTypeNames,\n });\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before generating.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Check for changes by comparing lock file with current schemas\n logger.step('Checking for changes...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const existingLock = await readLockFile(lockPath);\n const currentSnapshots = await buildSchemaSnapshots(schemas);\n\n // Use v2 format for deep diff\n const v2Lock = existingLock && isLockFileV2(existingLock) ? existingLock : null;\n const comparison = compareSchemasDeep(currentSnapshots, v2Lock);\n\n // Only skip if no changes AND no models to regenerate\n // Models with overwrite: true (OmnifyServiceProvider, BaseModel, etc.) should always be regenerated\n const skipMigrations = !comparison.hasChanges && !options.force;\n\n if (skipMigrations && !config.output.laravel?.modelsPath) {\n logger.success('No changes to generate');\n return;\n }\n\n if (comparison.hasChanges) {\n logger.debug(`Detected ${comparison.changes.length} change(s)`);\n for (const change of comparison.changes) {\n logSchemaChange(change, options.verbose ?? false);\n }\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Check if plugins have generators\n const usePlugins = hasPluginGenerators(config.plugins);\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n if (usePlugins) {\n // Use plugin system for generation\n logger.step('Running plugin generators...');\n const counts = await runPluginGeneration(\n config.plugins,\n schemas,\n rootDir,\n options.verbose ?? false,\n comparison.changes\n );\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n\n if (counts.migrations > 0) {\n logger.success(`Generated ${counts.migrations} migration(s)`);\n }\n if (counts.types > 0) {\n logger.success(`Generated ${counts.types} TypeScript file(s)`);\n }\n if (counts.models > 0) {\n logger.success(`Generated ${counts.models} model(s)`);\n }\n if (counts.factories > 0) {\n logger.success(`Generated ${counts.factories} factory(ies)`);\n }\n if (counts.other > 0) {\n logger.success(`Generated ${counts.other} other file(s)`);\n }\n\n // Generate TypeScript from output.typescript config (even when using plugins)\n if (!options.migrationsOnly && config.output.typescript && typesGenerated === 0) {\n logger.step('Generating TypeScript types...');\n\n const typesDir = resolve(rootDir, config.output.typescript.path);\n if (!existsSync(typesDir)) {\n mkdirSync(typesDir, { recursive: true });\n logger.debug(`Created directory: ${typesDir}`);\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typescriptConfig = config.output.typescript as { generateRules?: boolean; validationTemplates?: Record<string, Record<string, string>> };\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: typescriptConfig.generateRules ?? true,\n validationTemplates: typescriptConfig.validationTemplates,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.filePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n } else {\n // Use direct generation (legacy mode)\n const counts = runDirectGeneration(schemas, config, rootDir, options, comparison.changes);\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n modelsGenerated = counts.models;\n factoriesGenerated = counts.factories;\n }\n\n // Update lock file (v2 with snapshots)\n logger.step('Updating lock file...');\n const newLockFile = updateLockFile(existingLock, currentSnapshots, config.database.driver);\n await writeLockFile(lockPath, newLockFile);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n // Save version history\n logger.step('Saving version history...');\n const versionStore = createVersionStore({ baseDir: rootDir, maxVersions: 100 });\n const versionSnapshot = schemasToVersionSnapshot(schemas);\n const versionChanges: VersionChange[] = comparison.changes.flatMap(schemaChangeToVersionChange);\n\n // Get migration file name for version description\n const migrationFileName = migrationsGenerated > 0\n ? `${migrationsGenerated} migration(s)`\n : undefined;\n\n try {\n const newVersion = await versionStore.createVersion(\n versionSnapshot,\n versionChanges,\n {\n driver: config.database.driver,\n ...(migrationFileName !== undefined && { migration: migrationFileName }),\n description: `Generated ${comparison.changes.length} change(s)`,\n }\n );\n logger.debug(`Created version ${newVersion.version}`);\n } catch (versionError) {\n // Version history is optional, log but don't fail\n logger.debug(`Could not save version history: ${(versionError as Error).message}`);\n }\n\n // Generate AI guides\n try {\n const guidesWritten = generateAIGuides(rootDir, config.plugins);\n if (guidesWritten > 0) {\n logger.debug(`Updated ${guidesWritten} AI guide file(s)`);\n }\n } catch (guideError) {\n // AI guides are optional, log but don't fail\n logger.debug(`Could not generate AI guides: ${(guideError as Error).message}`);\n }\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0 && config.output.laravel) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (modelsGenerated > 0 && config.output.laravel?.modelsPath) {\n logger.info(` Models: ${config.output.laravel.modelsPath}/`);\n }\n if (typesGenerated > 0 && config.output.typescript) {\n logger.info(` Types: ${config.output.typescript.path}/`);\n }\n}\n\n/**\n * Registers the generate command.\n */\nexport function registerGenerateCommand(program: Command): void {\n program\n .command('generate')\n .description('Generate Laravel migrations and TypeScript types')\n .option('-v, --verbose', 'Show detailed output')\n .option('--migrations-only', 'Only generate migrations')\n .option('--types-only', 'Only generate TypeScript types')\n .option('-f, --force', 'Generate even if no changes detected')\n .action(async (options: GenerateOptions) => {\n try {\n await runGenerate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - AI Guide Generator\n *\n * Generates documentation files for AI assistants (Claude, etc.)\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { OmnifyPlugin } from '@famgia/omnify-types';\n\n/**\n * CLAUDE.md content for project root\n */\nconst CLAUDE_MD = `## Omnify\n\nThis project uses Omnify for schema-driven code generation.\n\n**Documentation**: \\`.claude/omnify/\\`\n- \\`schema-guide.md\\` - Schema format and property types\n- \\`laravel-guide.md\\` - Laravel generator (if installed)\n- \\`typescript-guide.md\\` - TypeScript generator (if installed)\n- \\`japan-guide.md\\` - Japan plugin types (if installed)\n\n**Commands**:\n- \\`npx omnify generate\\` - Generate code from schemas\n- \\`npx omnify validate\\` - Validate schemas\n`;\n\n/**\n * Schema guide content\n */\nconst SCHEMA_GUIDE = `# Omnify Schema Guide\n\n## Schema File Format\n\nSchemas are YAML files defining data models. Each file represents one entity.\n\n\\`\\`\\`yaml\nname: User\ndisplayName:\n ja: ユーザー\n en: User\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n name:\n type: String\n bio:\n type: Text\n nullable: true\n\noptions:\n timestamps: true\n softDelete: true\n\\`\\`\\`\n\n## Property Types\n\n### String Types\n- \\`String\\` - VARCHAR(255)\n- \\`Text\\` - TEXT\n- \\`LongText\\` - LONGTEXT\n- \\`Email\\` - VARCHAR(255) for email addresses\n- \\`Password\\` - VARCHAR(255), hidden in serialization\n\n### Numeric Types\n- \\`Int\\` - INTEGER\n- \\`BigInt\\` - BIGINT\n- \\`TinyInt\\` - TINYINT\n- \\`Float\\` - DOUBLE\n- \\`Decimal\\` - DECIMAL(precision, scale)\n\n### Date/Time Types\n- \\`Date\\` - DATE\n- \\`Time\\` - TIME\n- \\`DateTime\\` - DATETIME\n- \\`Timestamp\\` - TIMESTAMP\n\n### Other Types\n- \\`Boolean\\` - BOOLEAN\n- \\`Json\\` - JSON\n- \\`Enum\\` - ENUM with values\n- \\`EnumRef\\` - Reference to enum schema\n\n## Property Options\n\n\\`\\`\\`yaml\npropertyName:\n type: String\n nullable: true # Can be NULL\n unique: true # Unique constraint\n default: \"value\" # Default value\n length: 100 # VARCHAR length\n hidden: true # Hide from JSON output\n fillable: false # Exclude from mass assignment\n\\`\\`\\`\n\n## Associations\n\n\\`\\`\\`yaml\n# Many-to-One (belongsTo)\nauthor:\n type: Association\n relation: ManyToOne\n target: User\n onDelete: CASCADE\n\n# One-to-Many (hasMany)\nposts:\n type: Association\n relation: OneToMany\n target: Post\n\n# Many-to-Many (belongsToMany)\ntags:\n type: Association\n relation: ManyToMany\n target: Tag\n joinTable: post_tags\n\n# Polymorphic\ncommentable:\n type: Association\n relation: MorphTo\n\\`\\`\\`\n\n## Indexes\n\n\\`\\`\\`yaml\nindexes:\n - columns: [status, published_at]\n - columns: [email]\n unique: true\n\\`\\`\\`\n\n## Schema Options\n\n\\`\\`\\`yaml\noptions:\n timestamps: true # Add created_at, updated_at\n softDelete: true # Add deleted_at\n idType: BigInt # Primary key type (Int, BigInt, Uuid)\n\\`\\`\\`\n`;\n\n/**\n * Laravel guide content\n */\nconst LARAVEL_GUIDE = `# Laravel Generator Guide\n\n## Generated Files\n\n### Migrations\nLocated in \\`database/migrations/omnify/\\`\n- Auto-generated from schema changes\n- Handles column additions, modifications, removals\n- Preserves manual migrations outside omnify folder\n\n### Models\nTwo-tier model structure:\n- \\`app/Models/OmnifyBase/*BaseModel.php\\` - Auto-generated, DO NOT EDIT\n- \\`app/Models/*.php\\` - User models, extend base models, safe to customize\n\n### Factories\nLocated in \\`database/factories/\\`\n- Generated once, safe to customize\n- Uses appropriate Faker methods for each type\n\n## Model Features\n\n### Fillable\nAll schema properties are mass-assignable by default.\nUse \\`fillable: false\\` to exclude.\n\n### Hidden\nUse \\`hidden: true\\` to exclude from JSON/array output.\n\n\\`\\`\\`yaml\npassword:\n type: Password\n hidden: true\n\\`\\`\\`\n\n### Casts\nAuto-generated based on property types:\n- \\`Boolean\\` → \\`'boolean'\\`\n- \\`Json\\` → \\`'array'\\`\n- \\`Timestamp\\` → \\`'datetime'\\`\n\n### Relationships\nGenerated from Association properties:\n- \\`ManyToOne\\` → \\`belongsTo()\\`\n- \\`OneToMany\\` → \\`hasMany()\\`\n- \\`ManyToMany\\` → \\`belongsToMany()\\`\n- \\`MorphTo\\` → \\`morphTo()\\`\n- \\`MorphMany\\` → \\`morphMany()\\`\n\n## Commands\n\n\\`\\`\\`bash\n# Generate migrations and models\nnpx omnify generate\n\n# Force regeneration\nnpx omnify generate --force\n\n# Validate schemas\nnpx omnify validate\n\\`\\`\\`\n`;\n\n/**\n * TypeScript guide content\n */\nconst TYPESCRIPT_GUIDE = `# TypeScript Generator Guide\n\n## Generated Types\n\nTypes are generated in the configured output directory.\n\n### Interface Generation\n\nEach schema generates a TypeScript interface:\n\n\\`\\`\\`typescript\nexport interface User {\n id: number;\n email: string;\n name: string;\n bio: string | null;\n created_at: string;\n updated_at: string;\n}\n\\`\\`\\`\n\n### Type Mappings\n\n| Omnify Type | TypeScript Type |\n|-------------|-----------------|\n| String, Text | string |\n| Int, BigInt | number |\n| Float, Decimal | number |\n| Boolean | boolean |\n| Date, DateTime | string |\n| Json | Record<string, unknown> |\n| Enum | union of literals |\n\n### Nullable Types\n\nNullable properties become \\`T | null\\`:\n\n\\`\\`\\`typescript\nbio: string | null;\n\\`\\`\\`\n\n### Associations\n\nAssociations generate optional relation properties:\n\n\\`\\`\\`typescript\nexport interface Post {\n id: number;\n title: string;\n author_id: number;\n author?: User; // Optional relation\n comments?: Comment[]; // Optional array relation\n}\n\\`\\`\\`\n`;\n\n/**\n * Japan plugin guide content\n */\nconst JAPAN_GUIDE = `# Japan Plugin Types Guide\n\nThis project uses \\`@famgia/omnify-japan\\` plugin which provides Japan-specific types.\n\n## Available Types\n\n### Simple Types\n\n#### JapanesePhone\nJapanese phone number format (e.g., \\`090-1234-5678\\`, \\`03-1234-5678\\`)\n- SQL: \\`VARCHAR(15)\\`\n- Accepts with or without hyphens\n\n\\`\\`\\`yaml\nphone:\n type: JapanesePhone\n\\`\\`\\`\n\n#### JapanesePostalCode\nJapanese postal code format (e.g., \\`123-4567\\`)\n- SQL: \\`VARCHAR(8)\\`\n- Accepts with or without hyphen\n\n\\`\\`\\`yaml\npostal_code:\n type: JapanesePostalCode\n nullable: true\n\\`\\`\\`\n\n### Compound Types\n\nCompound types expand into multiple database columns automatically.\n\n#### JapaneseName\nJapanese name with kanji and kana variants.\n\n**Expands to 4 columns:**\n- \\`{property}_lastname\\` - VARCHAR(50) - Family name (姓)\n- \\`{property}_firstname\\` - VARCHAR(50) - Given name (名)\n- \\`{property}_kana_lastname\\` - VARCHAR(100) - Family name in katakana\n- \\`{property}_kana_firstname\\` - VARCHAR(100) - Given name in katakana\n\n**Accessors generated:**\n- \\`{property}_full_name\\` - \"姓 名\" (space-separated)\n- \\`{property}_full_name_kana\\` - \"セイ メイ\" (space-separated)\n\n\\`\\`\\`yaml\nname:\n type: JapaneseName\n displayName:\n ja: 氏名\n en: Full Name\n # Per-field overrides\n fields:\n KanaLastname:\n nullable: true\n hidden: true\n KanaFirstname:\n nullable: true\n hidden: true\n\\`\\`\\`\n\n#### JapaneseAddress\nJapanese address with postal code and prefecture ID.\n\n**Expands to 5 columns:**\n- \\`{property}_postal_code\\` - VARCHAR(8) - Postal code (郵便番号)\n- \\`{property}_prefecture_id\\` - TINYINT UNSIGNED - Prefecture ID 1-47 (都道府県)\n- \\`{property}_address1\\` - VARCHAR(255) - City/Ward (市区町村)\n- \\`{property}_address2\\` - VARCHAR(255) - Street address (丁目番地号)\n- \\`{property}_address3\\` - VARCHAR(255) NULLABLE - Building name (ビル・マンション名)\n\n**Accessors generated:**\n- \\`{property}_full_address\\` - Concatenation of address1 + address2 + address3\n\n\\`\\`\\`yaml\naddress:\n type: JapaneseAddress\n displayName:\n ja: 住所\n en: Address\n fields:\n Address3:\n nullable: true\n\\`\\`\\`\n\n**Prefecture IDs (JIS X 0401):**\n| ID | Prefecture | ID | Prefecture | ID | Prefecture |\n|----|-----------|----|-----------|----|-----------|\n| 1 | 北海道 | 17 | 石川県 | 33 | 岡山県 |\n| 2 | 青森県 | 18 | 福井県 | 34 | 広島県 |\n| 3 | 岩手県 | 19 | 山梨県 | 35 | 山口県 |\n| 4 | 宮城県 | 20 | 長野県 | 36 | 徳島県 |\n| 5 | 秋田県 | 21 | 岐阜県 | 37 | 香川県 |\n| 6 | 山形県 | 22 | 静岡県 | 38 | 愛媛県 |\n| 7 | 福島県 | 23 | 愛知県 | 39 | 高知県 |\n| 8 | 茨城県 | 24 | 三重県 | 40 | 福岡県 |\n| 9 | 栃木県 | 25 | 滋賀県 | 41 | 佐賀県 |\n| 10 | 群馬県 | 26 | 京都府 | 42 | 長崎県 |\n| 11 | 埼玉県 | 27 | 大阪府 | 43 | 熊本県 |\n| 12 | 千葉県 | 28 | 兵庫県 | 44 | 大分県 |\n| 13 | 東京都 | 29 | 奈良県 | 45 | 宮崎県 |\n| 14 | 神奈川県 | 30 | 和歌山県 | 46 | 鹿児島県 |\n| 15 | 新潟県 | 31 | 鳥取県 | 47 | 沖縄県 |\n| 16 | 富山県 | 32 | 島根県 | | |\n\n#### JapaneseBankAccount\nJapanese bank account information.\n\n**Expands to 5 columns:**\n- \\`{property}_bank_code\\` - VARCHAR(4) - Bank code (銀行コード)\n- \\`{property}_branch_code\\` - VARCHAR(3) - Branch code (支店コード)\n- \\`{property}_account_type\\` - ENUM - Account type: 1=普通, 2=当座, 4=貯蓄\n- \\`{property}_account_number\\` - VARCHAR(7) - Account number (口座番号)\n- \\`{property}_account_holder\\` - VARCHAR(100) - Account holder name (口座名義)\n\n\\`\\`\\`yaml\nbank_account:\n type: JapaneseBankAccount\n\\`\\`\\`\n\n## Per-field Overrides\n\nAll compound types support per-field overrides:\n\n\\`\\`\\`yaml\nname:\n type: JapaneseName\n fields:\n Lastname:\n length: 100 # Override default VARCHAR length\n Firstname:\n length: 100\n KanaLastname:\n length: 200\n nullable: true\n hidden: true\n KanaFirstname:\n length: 200\n nullable: true\n hidden: true\n\\`\\`\\`\n\n**Available overrides:**\n- \\`length\\` - VARCHAR length (override default)\n- \\`nullable\\` - Whether the field can be NULL\n- \\`hidden\\` - Exclude from JSON/array output\n- \\`fillable\\` - Control mass assignment\n\n## Factory Examples\n\n\\`\\`\\`php\n$faker = fake('ja_JP');\n\nreturn [\n // JapaneseName\n 'name_lastname' => $faker->lastName(),\n 'name_firstname' => $faker->firstName(),\n 'name_kana_lastname' => $faker->lastKanaName(),\n 'name_kana_firstname' => $faker->firstKanaName(),\n\n // JapanesePhone\n 'phone' => $faker->phoneNumber(),\n\n // JapanesePostalCode\n 'postal_code' => $faker->postcode(),\n\n // JapaneseAddress\n 'address_postal_code' => $faker->postcode(),\n 'address_prefecture_id' => $faker->numberBetween(1, 47),\n 'address_address1' => $faker->city(),\n 'address_address2' => $faker->streetAddress(),\n 'address_address3' => $faker->optional(0.5)->secondaryAddress(),\n];\n\\`\\`\\`\n\n## Model Accessors\n\n\\`\\`\\`php\n// JapaneseName accessors\n$customer->name_full_name; // \"田中 太郎\"\n$customer->name_full_name_kana; // \"タナカ タロウ\"\n\n// JapaneseAddress accessor\n$customer->address_full_address; // \"千代田区丸の内1-1-1ビル5F\"\n\\`\\`\\`\n`;\n\n/**\n * Checks if a plugin is the Japan types plugin\n */\nfunction isJapanPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-japan';\n}\n\n/**\n * Checks if a plugin is the Laravel plugin\n */\nfunction isLaravelPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-laravel';\n}\n\n/**\n * Checks if a plugin is the TypeScript plugin\n */\nfunction isTypeScriptPlugin(plugin: OmnifyPlugin): boolean {\n return plugin.name === '@famgia/omnify-typescript';\n}\n\n/**\n * Generates AI guide files based on installed plugins\n */\nexport function generateAIGuides(\n rootDir: string,\n plugins: readonly OmnifyPlugin[]\n): number {\n const guidesDir = resolve(rootDir, '.claude/omnify');\n let filesWritten = 0;\n\n // Create guides directory\n if (!existsSync(guidesDir)) {\n mkdirSync(guidesDir, { recursive: true });\n }\n\n // Always write CLAUDE.md in root\n const claudeMdPath = resolve(rootDir, 'CLAUDE.md');\n if (!existsSync(claudeMdPath)) {\n writeFileSync(claudeMdPath, CLAUDE_MD);\n filesWritten++;\n }\n\n // Always write schema guide\n const schemaGuidePath = resolve(guidesDir, 'schema-guide.md');\n writeFileSync(schemaGuidePath, SCHEMA_GUIDE);\n filesWritten++;\n\n // Write plugin-specific guides\n for (const plugin of plugins) {\n if (isLaravelPlugin(plugin)) {\n const laravelGuidePath = resolve(guidesDir, 'laravel-guide.md');\n writeFileSync(laravelGuidePath, LARAVEL_GUIDE);\n filesWritten++;\n }\n\n if (isTypeScriptPlugin(plugin)) {\n const tsGuidePath = resolve(guidesDir, 'typescript-guide.md');\n writeFileSync(tsGuidePath, TYPESCRIPT_GUIDE);\n filesWritten++;\n }\n\n if (isJapanPlugin(plugin)) {\n const japanGuidePath = resolve(guidesDir, 'japan-guide.md');\n writeFileSync(japanGuidePath, JAPAN_GUIDE);\n filesWritten++;\n }\n }\n\n return filesWritten;\n}\n","/**\n * @famgia/omnify-cli - Reset Command\n *\n * Cleans up generated files: OmnifyBase models, migrations, and lock files.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport type { Command } from 'commander';\nimport { loadConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Reset command options.\n */\ninterface ResetOptions {\n verbose?: boolean;\n yes?: boolean;\n}\n\n/**\n * Prompts user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\n/**\n * Recursively counts files in a directory.\n */\nfunction countFiles(dir: string): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Recursively deletes a directory.\n */\nfunction deleteDir(dir: string, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n const count = countFiles(dir);\n rmSync(dir, { recursive: true, force: true });\n\n if (verbose) {\n logger.debug(`Deleted: ${dir}`);\n }\n\n return count;\n}\n\n/**\n * Deletes files matching a pattern in a directory.\n */\nfunction deleteFilesInDir(dir: string, pattern: RegExp, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && pattern.test(entry)) {\n rmSync(fullPath);\n if (verbose) {\n logger.debug(`Deleted: ${fullPath}`);\n }\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Runs the reset command.\n */\nexport async function runReset(options: ResetOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Reset Omnify Generated Files');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Determine paths to clean\n const paths: { name: string; path: string; type: 'dir' | 'file' | 'files'; pattern?: RegExp }[] = [];\n\n // Common OmnifyBase locations (check both with and without backend prefix)\n const omnifyBasePaths = [\n { name: 'OmnifyBase models', paths: ['app/Models/OmnifyBase', 'backend/app/Models/OmnifyBase'] },\n { name: 'OmnifyBase requests', paths: ['app/Http/Requests/OmnifyBase', 'backend/app/Http/Requests/OmnifyBase'] },\n { name: 'OmnifyBase resources', paths: ['app/Http/Resources/OmnifyBase', 'backend/app/Http/Resources/OmnifyBase'] },\n ];\n\n for (const { name, paths: relPaths } of omnifyBasePaths) {\n for (const relPath of relPaths) {\n const omnifyBasePath = resolve(rootDir, relPath);\n if (existsSync(omnifyBasePath)) {\n paths.push({ name, path: omnifyBasePath, type: 'dir' });\n break; // Only add the first match for each type\n }\n }\n }\n\n // Common migration locations\n const migrationPaths = [\n 'database/migrations/omnify',\n 'backend/database/migrations/omnify',\n ];\n\n for (const relPath of migrationPaths) {\n const migrationsPath = resolve(rootDir, relPath);\n if (existsSync(migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n break; // Only add the first match\n }\n }\n\n // Also check config.output.laravel if available\n const laravelConfig = config.output.laravel;\n if (laravelConfig?.modelsPath) {\n const modelsPath = resolve(rootDir, laravelConfig.modelsPath);\n const omnifyBasePath = join(modelsPath, 'OmnifyBase');\n if (existsSync(omnifyBasePath) && !paths.some(p => p.path === omnifyBasePath)) {\n paths.push({ name: 'OmnifyBase models', path: omnifyBasePath, type: 'dir' });\n }\n }\n\n if (laravelConfig?.migrationsPath) {\n const migrationsPath = resolve(rootDir, laravelConfig.migrationsPath);\n if (existsSync(migrationsPath) && !paths.some(p => p.path === migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n }\n }\n\n // TypeScript types - only delete auto-generated subdirectories, not user-editable files\n // Structure: models/base/* (auto), models/enum/* (auto), models/rules/* (auto)\n // Keep: models/*.ts (user-editable)\n const typescriptPath = config.output.typescript?.path;\n const tsBasePath = typescriptPath ? resolve(rootDir, typescriptPath) : null;\n\n // Check common TypeScript locations if not in config\n const commonTsPaths = [\n 'resources/ts/types/models',\n 'frontend/src/types/model',\n 'frontend/src/types/models',\n 'src/types/models',\n ];\n\n let foundTsPath = tsBasePath;\n if (!foundTsPath || !existsSync(foundTsPath)) {\n for (const relPath of commonTsPaths) {\n const tsPath = resolve(rootDir, relPath);\n if (existsSync(tsPath)) {\n foundTsPath = tsPath;\n break;\n }\n }\n }\n\n if (foundTsPath && existsSync(foundTsPath)) {\n // Delete auto-generated subdirectories\n const autoGeneratedDirs = ['base', 'enum', 'rules'];\n for (const subDir of autoGeneratedDirs) {\n const subPath = join(foundTsPath, subDir);\n if (existsSync(subPath)) {\n paths.push({ name: `TypeScript ${subDir}`, path: subPath, type: 'dir' });\n }\n }\n // Delete auto-generated files at root level\n const autoGeneratedFiles = ['common.ts', 'index.ts'];\n for (const fileName of autoGeneratedFiles) {\n const filePath = join(foundTsPath, fileName);\n if (existsSync(filePath)) {\n paths.push({ name: `TypeScript ${fileName}`, path: filePath, type: 'file' });\n }\n }\n }\n\n // Lock files\n const lockFilePath = resolve(rootDir, config.lockFilePath);\n if (existsSync(lockFilePath)) {\n paths.push({ name: 'Lock file', path: lockFilePath, type: 'file' });\n }\n\n // Version history directory (.omnify-versions)\n const versionsDir = resolve(rootDir, '.omnify-versions');\n if (existsSync(versionsDir)) {\n paths.push({ name: 'Version history', path: versionsDir, type: 'dir' });\n }\n\n // Also check for versions inside .omnify directory (but NOT schemas!)\n const omnifyVersionsDir = resolve(rootDir, '.omnify/versions');\n if (existsSync(omnifyVersionsDir)) {\n paths.push({ name: 'Version history (.omnify/versions)', path: omnifyVersionsDir, type: 'dir' });\n }\n\n // Logs directory\n const logsDir = resolve(rootDir, '.omnify/logs');\n if (existsSync(logsDir)) {\n paths.push({ name: 'Logs', path: logsDir, type: 'dir' });\n }\n\n // Check if anything to clean\n if (paths.length === 0) {\n logger.info('Nothing to clean. No generated files found.');\n return;\n }\n\n // Show what will be deleted\n logger.newline();\n logger.warn('The following will be deleted:');\n logger.newline();\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = countFiles(item.path);\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = readdirSync(item.path).filter((f) => item.pattern!.test(f)).length;\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else {\n logger.info(` • ${item.name}: ${item.path}`);\n }\n }\n\n logger.newline();\n\n // Ask for confirmation\n if (!options.yes) {\n const confirmed = await confirm('Are you sure you want to delete these files?');\n if (!confirmed) {\n logger.info('Reset cancelled.');\n return;\n }\n }\n\n logger.newline();\n logger.step('Deleting files...');\n\n // Delete files\n let totalDeleted = 0;\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = deleteDir(item.path, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = deleteFilesInDir(item.path, item.pattern, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else {\n rmSync(item.path, { force: true });\n if (options.verbose) {\n logger.debug(`Deleted: ${item.path}`);\n }\n totalDeleted++;\n logger.info(` ✓ Deleted ${item.name}`);\n }\n }\n\n logger.newline();\n logger.success(`Reset complete! Deleted ${totalDeleted} file(s).`);\n logger.newline();\n logger.info('Run `omnify generate` to regenerate files.');\n}\n\n/**\n * Registers the reset command.\n */\nexport function registerResetCommand(program: Command): void {\n program\n .command('reset')\n .description('Delete all generated files (OmnifyBase, migrations, locks)')\n .option('-v, --verbose', 'Show detailed output')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: ResetOptions) => {\n try {\n await runReset(options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Create Laravel Project Command\n *\n * Creates a new Laravel project from the boilerplate template.\n */\n\nimport { execSync, spawn } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Default boilerplate repository URL\n */\nconst BOILERPLATE_REPO = 'https://github.com/omnifyjp/omnify-laravel-boilerplate.git';\n\n/**\n * Check if git is installed\n */\nfunction checkGit(): boolean {\n try {\n execSync('git --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Entries to remove from .gitignore for consumer projects\n * These are ignored in boilerplate but should be tracked in real projects\n */\nconst GITIGNORE_ENTRIES_TO_REMOVE = [\n // Auto-generated projects (consumers need to track these)\n '# Auto-generated projects',\n 'backend/',\n 'frontend/',\n // Lock files (consumers should track their lock state)\n '# Lock files',\n '.omnify.lock',\n '.omnify/versions/',\n '.omnify/current.lock',\n // Omnify auto-generated docs (consumers should track these)\n '# Omnify auto-generated docs',\n '.cursor/rules/omnify.md',\n '.claude/omnify/',\n];\n\n/**\n * Clean up .gitignore for consumer project\n * Removes entries that should be tracked in consumer projects\n */\nfunction cleanupGitignore(targetDir: string): void {\n const gitignorePath = resolve(targetDir, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = content.split('\\n');\n\n // Remove entries that consumers should track\n const cleanedLines = lines.filter((line) => {\n const trimmed = line.trim();\n return !GITIGNORE_ENTRIES_TO_REMOVE.includes(trimmed);\n });\n\n // Remove leading empty lines\n while (cleanedLines.length > 0 && cleanedLines[0].trim() === '') {\n cleanedLines.shift();\n }\n\n writeFileSync(gitignorePath, cleanedLines.join('\\n'));\n}\n\n/**\n * Clone the boilerplate repository\n */\nfunction cloneRepo(repo: string, targetDir: string): void {\n logger.step(`Cloning boilerplate from ${repo}...`);\n execSync(`git clone --depth 1 ${repo} \"${targetDir}\"`, { stdio: 'inherit' });\n\n // Remove .git directory to start fresh\n const gitDir = resolve(targetDir, '.git');\n if (existsSync(gitDir)) {\n rmSync(gitDir, { recursive: true, force: true });\n }\n\n // Clean up .gitignore for consumer\n cleanupGitignore(targetDir);\n\n // Initialize new git repository\n execSync('git init', { cwd: targetDir, stdio: 'ignore' });\n logger.success('Repository cloned successfully');\n}\n\n/**\n * Run a command and wait for completion\n */\nfunction runCommand(command: string, targetDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, [], {\n cwd: targetDir,\n shell: true,\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Run setup script\n */\nasync function runSetup(targetDir: string): Promise<void> {\n // Step 1: Install dependencies\n logger.step('Installing dependencies...');\n await runCommand('pnpm install', targetDir);\n logger.success('Dependencies installed');\n\n // Step 2: Run setup script\n logger.step('Running setup...');\n const isWindows = process.platform === 'win32';\n const setupScript = isWindows ? 'pnpm run setup:win' : 'pnpm run setup';\n await runCommand(setupScript, targetDir);\n}\n\n/**\n * Run the create-laravel-project command\n */\nexport async function runCreateProject(\n projectName: string,\n options: { repo?: string; skipSetup?: boolean }\n): Promise<void> {\n const targetDir = resolve(process.cwd(), projectName);\n const repo = options.repo ?? BOILERPLATE_REPO;\n\n // Check if git is available\n if (!checkGit()) {\n logger.error('Git is not installed. Please install git first.');\n process.exit(1);\n }\n\n // Check if target directory already exists\n if (existsSync(targetDir)) {\n logger.error(`Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n logger.newline();\n logger.info(`Creating new Laravel project: ${projectName}`);\n logger.newline();\n\n try {\n // Clone the repository\n cloneRepo(repo, targetDir);\n\n // Run setup if not skipped\n if (!options.skipSetup) {\n process.chdir(targetDir);\n await runSetup(targetDir);\n }\n\n logger.newline();\n logger.success('Project created successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.info(` cd ${projectName}`);\n if (options.skipSetup) {\n logger.info(' pnpm run setup');\n }\n logger.info(' pnpm run dev');\n logger.newline();\n } catch (error) {\n // Clean up on error\n if (existsSync(targetDir)) {\n rmSync(targetDir, { recursive: true, force: true });\n }\n throw error;\n }\n}\n\n/**\n * Register the create-laravel-project command\n */\nexport function registerCreateProjectCommand(program: Command): void {\n program\n .command('create-laravel-project <project-name>')\n .description('Create a new Laravel project from boilerplate')\n .option('-r, --repo <url>', 'Custom boilerplate repository URL', BOILERPLATE_REPO)\n .option('--skip-setup', 'Skip running the setup script')\n .action(async (projectName: string, options: { repo?: string; skipSetup?: boolean }) => {\n try {\n await runCreateProject(projectName, options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwHrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEtB,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DzB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+LpB,SAAS,cAAc,QAA+B;AACpD,SAAO,OAAO,SAAS;AACzB;AAKA,SAAS,gBAAgB,QAA+B;AACtD,SAAO,OAAO,SAAS;AACzB;AAKA,SAAS,mBAAmB,QAA+B;AACzD,SAAO,OAAO,SAAS;AACzB;AAKO,SAAS,iBACd,SACA,SACQ;AACR,QAAM,YAAYA,SAAQ,SAAS,gBAAgB;AACnD,MAAI,eAAe;AAGnB,MAAI,CAACH,YAAW,SAAS,GAAG;AAC1B,IAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAGA,QAAM,eAAeE,SAAQ,SAAS,WAAW;AACjD,MAAI,CAACH,YAAW,YAAY,GAAG;AAC7B,IAAAE,eAAc,cAAc,SAAS;AACrC;AAAA,EACF;AAGA,QAAM,kBAAkBC,SAAQ,WAAW,iBAAiB;AAC5D,EAAAD,eAAc,iBAAiB,YAAY;AAC3C;AAGA,aAAW,UAAU,SAAS;AAC5B,QAAI,gBAAgB,MAAM,GAAG;AAC3B,YAAM,mBAAmBC,SAAQ,WAAW,kBAAkB;AAC9D,MAAAD,eAAc,kBAAkB,aAAa;AAC7C;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM,GAAG;AAC9B,YAAM,cAAcC,SAAQ,WAAW,qBAAqB;AAC5D,MAAAD,eAAc,aAAa,gBAAgB;AAC3C;AAAA,IACF;AAEA,QAAI,cAAc,MAAM,GAAG;AACzB,YAAM,iBAAiBC,SAAQ,WAAW,gBAAgB;AAC1D,MAAAD,eAAc,gBAAgB,WAAW;AACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ADzdA,SAAS,oBAAoB,SAA2C;AACtE,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,SAAS,CAAC;AACpE;AAKA,SAAS,2BAA2B,eAAoC;AACtE,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,MAAI,CAACE,YAAW,aAAa,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,QAAQ,YAAY,aAAa;AAEvC,UAAM,yBAAyB;AAE/B,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,MAAM,sBAAsB;AAC/C,UAAI,OAAO;AACT,uBAAe,IAAI,MAAM,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,SAAS,gBAAgB,QAAsB,SAAwB;AACrE,SAAO,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,UAAU,EAAE;AAE3D,MAAI,CAAC,WAAW,OAAO,eAAe,YAAY;AAChD;AAAA,EACF;AAGA,MAAI,OAAO,eAAe;AACxB,eAAW,OAAO,OAAO,eAAe;AACtC,UAAI,IAAI,eAAe,SAAS;AAC9B,eAAO,MAAM,iBAAiB,IAAI,MAAM,KAAK,IAAI,YAAY,IAAI,GAAG;AAAA,MACtE,WAAW,IAAI,eAAe,WAAW;AACvC,eAAO,MAAM,iBAAiB,IAAI,MAAM,EAAE;AAAA,MAC5C,WAAW,IAAI,eAAe,cAAc,IAAI,eAAe;AAC7D,eAAO,MAAM,iBAAiB,IAAI,MAAM,KAAK,IAAI,cAAc,KAAK,IAAI,CAAC,GAAG;AAAA,MAC9E,WAAW,IAAI,eAAe,aAAa,IAAI,gBAAgB;AAC7D,cAAM,OAAO,IAAI,eAAe,SAAS,KAAK,IAAI,cAAc,KAAK,IAAI,CAAC,MAAM;AAChF,eAAO,MAAM,sBAAiB,IAAI,cAAc,WAAM,IAAI,MAAM,GAAG,IAAI,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,cAAc;AACvB,eAAW,OAAO,OAAO,cAAc;AACrC,YAAM,OAAO,IAAI,MAAM,SAAS,WAAW;AAC3C,UAAI,IAAI,eAAe,SAAS;AAC9B,eAAO,MAAM,SAAS,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,MACjE,OAAO;AACL,eAAO,MAAM,SAAS,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,eAAe;AACxB,QAAI,OAAO,cAAc,YAAY;AACnC,YAAM,EAAE,MAAM,GAAG,IAAI,OAAO,cAAc;AAC1C,aAAO,MAAM,qBAAqB,IAAI,WAAM,EAAE,EAAE;AAAA,IAClD;AACA,QAAI,OAAO,cAAc,YAAY;AACnC,YAAM,EAAE,MAAM,GAAG,IAAI,OAAO,cAAc;AAC1C,aAAO,MAAM,qBAAqB,IAAI,WAAM,EAAE,EAAE;AAAA,IAClD;AACA,QAAI,OAAO,cAAc,QAAQ;AAC/B,YAAM,EAAE,MAAM,GAAG,IAAI,OAAO,cAAc;AAC1C,aAAO,MAAM,iBAAiB,IAAI,WAAM,EAAE,EAAE;AAAA,IAC9C;AAAA,EACF;AACF;AAKA,SAAS,0BAA0B,MAAwD;AACzF,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,YAAsB;AAAA,IAChF,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,YAAsB;AAAA,IAChF,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAoB;AAAA,IACxE,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAkB;AAAA,IAClE,GAAI,KAAK,YAAY,UAAa,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1D,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAiB;AAAA,IACjE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAoB;AAAA,IACxE,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,UAAoB;AAAA,IAC1E,GAAI,KAAK,UAAU,UAAa,EAAE,OAAO,KAAK,MAAgB;AAAA,IAC9D,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,KAA0B;AAAA,IACtE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAmB;AAAA,IACvE,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAiB;AAAA,IACjE,GAAI,KAAK,YAAY,UAAa,EAAE,SAAS,KAAK,QAA6B;AAAA,IAC/E,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,UAAoB;AAAA,IAC1E,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAmB;AAAA,IACvE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAmB;AAAA,IACvE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAmB;AAAA,IACvE,GAAI,KAAK,eAAe,UAAa,EAAE,YAAY,KAAK,WAAqB;AAAA,IAC7E,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,UAAoB;AAAA,IAC1E,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAkB;AAAA;AAAA,IAElE,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAkB;AAAA,IAClE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAoB;AAAA;AAAA,IAExE,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAuF;AAAA,EACzI;AACF;AAKA,SAAS,yBACP,SACuC;AACvC,QAAM,WAAkD,CAAC;AAEzD,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,UAAM,aAAsD,CAAC;AAC7D,QAAI,OAAO,YAAY;AACrB,iBAAW,CAAC,UAAU,IAAI,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAChE,mBAAW,QAAQ,IAAI,0BAA0B,IAA0C;AAAA,MAC7F;AAAA,IACF;AAEA,UAAM,OAAO,OAAO;AACpB,aAAS,IAAI,IAAI;AAAA,MACf,MAAM,OAAO;AAAA,MACb,MAAO,OAAO,QAAQ;AAAA,MACtB,GAAI,OAAO,KAAK,UAAU,EAAE,SAAS,KAAK,EAAE,WAAW;AAAA,MACvD,GAAI,OAAO,UAAU,EAAE,QAAQ,OAAO,OAAO;AAAA,MAC7C,GAAI,QAAQ;AAAA,QACV,SAAS;AAAA,UACP,GAAI,KAAK,OAAO,UAAa,EAAE,IAAI,KAAK,GAAG;AAAA,UAC3C,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAO;AAAA,UACvD,GAAI,KAAK,eAAe,UAAa,EAAE,YAAY,KAAK,WAAW;AAAA,UACnE,GAAI,KAAK,eAAe,UAAa,EAAE,YAAY,KAAK,WAAW;AAAA,UACnE,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,UAAU;AAAA,UAChE,GAAI,KAAK,iBAAiB,UAAa,EAAE,cAAc,KAAK,aAAa;AAAA,UACzE,GAAI,KAAK,oBAAoB,UAAa,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,4BAA4B,QAAuC;AAC1E,QAAM,UAA2B,CAAC;AAElC,MAAI,OAAO,eAAe,SAAS;AACjC,YAAQ,KAAK,EAAE,QAAQ,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AAAA,EACpE,WAAW,OAAO,eAAe,WAAW;AAC1C,YAAQ,KAAK,EAAE,QAAQ,kBAAkB,QAAQ,OAAO,WAAW,CAAC;AAAA,EACtE,WAAW,OAAO,eAAe,YAAY;AAE3C,QAAI,OAAO,eAAe;AACxB,iBAAW,OAAO,OAAO,eAAe;AACtC,YAAI,IAAI,eAAe,SAAS;AAC9B,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,UAAU,IAAI;AAAA,YACd,IAAI,IAAI;AAAA,UACV,CAAC;AAAA,QACH,WAAW,IAAI,eAAe,WAAW;AACvC,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,UAAU,IAAI;AAAA,YACd,MAAM,IAAI;AAAA,UACZ,CAAC;AAAA,QACH,WAAW,IAAI,eAAe,YAAY;AACxC,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,UAAU,IAAI;AAAA,YACd,MAAM,IAAI;AAAA,YACV,IAAI,IAAI;AAAA,UACV,CAAC;AAAA,QACH,WAAW,IAAI,eAAe,WAAW;AACvC,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,UAAU,IAAI;AAAA,YACd,MAAM,IAAI;AAAA,YACV,IAAI,IAAI;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,eAAe;AACxB,cAAQ,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,MAAM,OAAO;AAAA,QACb,IAAI,OAAO;AAAA,MACb,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,cAAc;AACvB,iBAAW,OAAO,OAAO,cAAc;AACrC,YAAI,IAAI,eAAe,SAAS;AAC9B,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,IAAI,IAAI;AAAA,UACV,CAAC;AAAA,QACH,OAAO;AACL,kBAAQ,KAAK;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,YACf,MAAM,IAAI;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,sBACP,SACA,SACyF;AACzF,QAAM,SAAS,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,EAAE;AAE5E,aAAW,UAAU,SAAS;AAC5B,UAAM,WAAWC,SAAQ,SAAS,OAAO,IAAI;AAC7C,UAAM,MAAMC,SAAQ,QAAQ;AAE5B,QAAI,CAACF,YAAW,GAAG,GAAG;AACpB,MAAAG,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,aAAO,MAAM,sBAAsB,GAAG,EAAE;AAAA,IAC1C;AAGA,QAAI,OAAO,gBAAgBH,YAAW,QAAQ,GAAG;AAC/C,aAAO,MAAM,qBAAqB,OAAO,IAAI,EAAE;AAC/C;AAAA,IACF;AAEA,IAAAI,eAAc,UAAU,OAAO,OAAO;AACtC,WAAO,MAAM,YAAY,OAAO,IAAI,EAAE;AAEtC,QAAI,OAAO,SAAS,YAAa,QAAO;AAAA,aAC/B,OAAO,SAAS,OAAQ,QAAO;AAAA,aAC/B,OAAO,SAAS,QAAS,QAAO;AAAA,aAChC,OAAO,SAAS,UAAW,QAAO;AAAA,QACtC,QAAO;AAAA,EACd;AAEA,SAAO;AACT;AAKA,eAAe,oBACb,SACA,SACA,SACA,SACA,SACkG;AAClG,QAAM,gBAAgB,IAAI,cAAc;AAAA,IACtC,KAAK;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,OAAO,CAAC,QAAQ,OAAO,MAAM,GAAG;AAAA,MAChC,MAAM,CAAC,QAAQ,OAAO,KAAK,GAAG;AAAA,MAC9B,MAAM,CAAC,QAAQ,OAAO,KAAK,GAAG;AAAA,MAC9B,OAAO,CAAC,QAAQ,OAAO,MAAM,GAAG;AAAA,IAClC;AAAA,EACF,CAAC;AAGD,aAAW,UAAU,SAAS;AAC5B,UAAM,cAAc,SAAS,MAAM;AAAA,EACrC;AAGA,QAAM,SAAS,MAAM,cAAc,cAAc,SAAS,OAAO;AAEjE,MAAI,CAAC,OAAO,SAAS;AACnB,eAAW,SAAS,OAAO,QAAQ;AACjC,aAAO,MAAM,aAAa,MAAM,aAAa,YAAY,MAAM,OAAO,EAAE;AAAA,IAC1E;AACA,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAGA,SAAO,sBAAsB,OAAO,SAAS,OAAO;AACtD;AAKA,SAAS,oBACP,SACA,QACA,SACA,SACA,SAC0E;AAC1E,MAAI,sBAAsB;AAC1B,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,qBAAqB;AAGzB,QAAM,iBAAiB,oBAAI,IAAiE;AAC5F,aAAW,UAAU,OAAO,SAAS;AACnC,QAAI,OAAO,OAAO;AAChB,iBAAW,WAAW,OAAO,OAAO;AAClC,uBAAe,IAAI,QAAQ,MAAM,OAAO;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,SAAS;AAC/C,WAAO,KAAK,kCAAkC;AAE9C,UAAM,gBAAgBH,SAAQ,SAAS,OAAO,OAAO,QAAQ,cAAc;AAC3E,QAAI,CAACD,YAAW,aAAa,GAAG;AAC9B,MAAAG,WAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAC5C,aAAO,MAAM,sBAAsB,aAAa,EAAE;AAAA,IACpD;AAGA,UAAM,mBAAmB,IAAI;AAAA,MAC3B,QAAQ,OAAO,CAAC,MAAM,EAAE,eAAe,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;AAAA,IACzE;AACA,UAAM,eAAe,QAAQ;AAAA,MAC3B,CAAC,MAAM,EAAE,eAAe,cAAc,EAAE,eAAe;AAAA,IACzD;AAGA,UAAM,iBAAiB,2BAA2B,aAAa;AAG/D,QAAI,iBAAiB,OAAO,GAAG;AAC7B,YAAM,eAAe,OAAO;AAAA,QAC1B,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,iBAAiB,IAAI,IAAI,CAAC;AAAA,MACvE;AAEA,YAAM,mBAAmB,mBAAmB,cAAc,EAAE,aAAa,eAAe,CAAC;AACzF,iBAAW,aAAa,kBAAkB;AACxC,cAAM,YAAY,UAAU,OAAO,CAAC;AAEpC,YAAI,eAAe,IAAI,SAAS,GAAG;AACjC,iBAAO,MAAM,sBAAsB,SAAS,mBAAmB;AAC/D;AAAA,QACF;AACA,cAAM,WAAWF,SAAQ,eAAe,UAAU,QAAQ;AAC1D,QAAAG,eAAc,UAAU,UAAU,OAAO;AACzC,eAAO,MAAM,YAAY,UAAU,QAAQ,EAAE;AAC7C;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,kBAAkB,8BAA8B,YAAY;AAClE,iBAAW,aAAa,iBAAiB;AACvC,cAAM,WAAWH,SAAQ,eAAe,UAAU,QAAQ;AAC1D,QAAAG,eAAc,UAAU,UAAU,OAAO;AACzC,eAAO,MAAM,YAAY,UAAU,QAAQ,EAAE;AAC7C;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,aAAa,mBAAmB,eAAe;AAAA,EAChE;AAGA,MAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,SAAS,YAAY;AAC3D,WAAO,KAAK,8BAA8B;AAE1C,UAAM,aAAa,OAAO,OAAO,QAAQ;AACzC,UAAM,iBAAiB,OAAO,OAAO,QAAQ,kBAAkB,GAAG,UAAU;AAG5E,UAAM,YAAYH,SAAQ,SAAS,UAAU;AAC7C,UAAM,gBAAgBA,SAAQ,SAAS,cAAc;AACrD,QAAI,CAACD,YAAW,SAAS,GAAG;AAC1B,MAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AACA,QAAI,CAACH,YAAW,aAAa,GAAG;AAC9B,MAAAG,WAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAEA,UAAM,gBAAgB,OAAO,OAAO,QAAQ,iBAAiB;AAE7D,UAAM,SAAS,eAAe,SAAS;AAAA,MACrC,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAED,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAWF,SAAQ,SAAS,aAAa,KAAK,CAAC;AACrD,YAAM,UAAUC,SAAQ,QAAQ;AAChC,UAAI,CAACF,YAAW,OAAO,GAAG;AACxB,QAAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,MACxC;AAIA,UAAI,CAAC,MAAM,aAAaH,YAAW,QAAQ,GAAG;AAC5C,eAAO,MAAM,qBAAqB,aAAa,KAAK,CAAC,EAAE;AACvD;AAAA,MACF;AAEA,MAAAI,eAAc,UAAU,MAAM,OAAO;AACrC,aAAO,MAAM,YAAY,aAAa,KAAK,CAAC,EAAE;AAC9C;AAAA,IACF;AAEA,WAAO,QAAQ,aAAa,eAAe,WAAW;AAAA,EACxD;AAGA,MAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,SAAS,eAAe;AAC9D,WAAO,KAAK,iCAAiC;AAE7C,UAAM,gBAAgB,OAAO,OAAO,QAAQ;AAC5C,UAAM,eAAeH,SAAQ,SAAS,aAAa;AACnD,QAAI,CAACD,YAAW,YAAY,GAAG;AAC7B,MAAAG,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAEA,UAAM,YAAY,kBAAkB,SAAS;AAAA,MAC3C,aAAa;AAAA,IACf,CAAC;AAED,eAAW,WAAW,WAAW;AAC/B,YAAM,WAAWF,SAAQ,SAAS,eAAe,OAAO,CAAC;AACzD,YAAM,UAAUC,SAAQ,QAAQ;AAChC,UAAI,CAACF,YAAW,OAAO,GAAG;AACxB,QAAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,MACxC;AAGA,UAAI,CAAC,QAAQ,aAAaH,YAAW,QAAQ,GAAG;AAC9C,eAAO,MAAM,qBAAqB,eAAe,OAAO,CAAC,EAAE;AAC3D;AAAA,MACF;AAEA,MAAAI,eAAc,UAAU,QAAQ,OAAO;AACvC,aAAO,MAAM,YAAY,eAAe,OAAO,CAAC,EAAE;AAClD;AAAA,IACF;AAEA,WAAO,QAAQ,aAAa,kBAAkB,eAAe;AAAA,EAC/D;AAGA,MAAI,CAAC,QAAQ,kBAAkB,OAAO,OAAO,YAAY;AACvD,WAAO,KAAK,gCAAgC;AAE5C,UAAM,WAAWH,SAAQ,SAAS,OAAO,OAAO,WAAW,IAAI;AAC/D,QAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,MAAAG,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,aAAO,MAAM,sBAAsB,QAAQ,EAAE;AAAA,IAC/C;AAGA,UAAM,gBAAgB,OAAO,UAAU,OAAO,OAAO,WAAW,OAAO,OAAO,QAAQ,SAAS;AAC/F,UAAM,mBAAmB,OAAO,OAAO;AACvC,UAAM,YAAY,mBAAmB,SAAS;AAAA,MAC5C,aAAa;AAAA,MACb,cAAc,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,eAAe,iBAAiB,iBAAiB;AAAA,MACjD,qBAAqB,iBAAiB;AAAA,IACxC,CAAC;AAED,eAAW,QAAQ,WAAW;AAC5B,YAAM,WAAWF,SAAQ,UAAU,KAAK,QAAQ;AAChD,YAAM,UAAUC,SAAQ,QAAQ;AAChC,UAAI,CAACF,YAAW,OAAO,GAAG;AACxB,QAAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,MACxC;AAEA,UAAI,CAAC,KAAK,aAAaH,YAAW,QAAQ,GAAG;AAC3C,eAAO,MAAM,qBAAqB,KAAK,QAAQ,EAAE;AACjD;AAAA,MACF;AACA,MAAAI,eAAc,UAAU,KAAK,OAAO;AACpC,aAAO,MAAM,YAAY,KAAK,QAAQ,EAAE;AACxC;AAAA,IACF;AAEA,WAAO,QAAQ,aAAa,cAAc,qBAAqB;AAAA,EACjE;AAEA,SAAO,EAAE,YAAY,qBAAqB,OAAO,gBAAgB,QAAQ,iBAAiB,WAAW,mBAAmB;AAC1H;AAKA,eAAsB,YAAY,SAAyC;AACzE,SAAO,WAAW,QAAQ,WAAW,KAAK;AAE1C,SAAO,OAAO,oBAAoB;AAGlC,SAAO,MAAM,0BAA0B;AACvC,QAAM,EAAE,QAAQ,YAAAC,YAAW,IAAI,MAAM,WAAW;AAChD,QAAM,UAAUA,cAAaH,SAAQG,WAAU,IAAI,QAAQ,IAAI;AAG/D,iBAAe,QAAQ,OAAO;AAG9B,QAAM,aAAaJ,SAAQ,SAAS,OAAO,UAAU;AACrD,SAAO,KAAK,wBAAwB,UAAU,EAAE;AAEhD,QAAM,UAAU,MAAMK,aAAY,UAAU;AAC5C,QAAM,cAAc,OAAO,KAAK,OAAO,EAAE;AAEzC,MAAI,gBAAgB,GAAG;AACrB,WAAO,KAAK,uBAAuB;AACnC;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,WAAW,YAAY;AAG7C,QAAM,kBAA4B,CAAC;AACnC,aAAW,UAAU,OAAO,SAAS;AACnC,QAAI,OAAO,OAAO;AAChB,iBAAW,WAAW,OAAO,OAAO;AAClC,wBAAgB,KAAK,QAAQ,IAAI;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAGA,SAAO,KAAK,uBAAuB;AACnC,QAAM,mBAAmBC,iBAAgB,SAAS;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAED,MAAI,CAAC,iBAAiB,OAAO;AAC3B,WAAO,MAAM,yDAAyD;AACtE,eAAW,SAAS,iBAAiB,QAAQ;AAC3C,YAAM,cAAcC,aAAY,SAAS,KAAK;AAC9C,aAAO,YAAY,WAAW;AAAA,IAChC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,SAAO,KAAK,yBAAyB;AACrC,QAAM,WAAWP,SAAQ,SAAS,OAAO,YAAY;AAErD,QAAM,eAAe,MAAM,aAAa,QAAQ;AAChD,QAAM,mBAAmB,MAAM,qBAAqB,OAAO;AAG3D,QAAM,SAAS,gBAAgB,aAAa,YAAY,IAAI,eAAe;AAC3E,QAAM,aAAa,mBAAmB,kBAAkB,MAAM;AAI9D,QAAM,iBAAiB,CAAC,WAAW,cAAc,CAAC,QAAQ;AAE1D,MAAI,kBAAkB,CAAC,OAAO,OAAO,SAAS,YAAY;AACxD,WAAO,QAAQ,wBAAwB;AACvC;AAAA,EACF;AAEA,MAAI,WAAW,YAAY;AACzB,WAAO,MAAM,YAAY,WAAW,QAAQ,MAAM,YAAY;AAC9D,eAAW,UAAU,WAAW,SAAS;AACvC,sBAAgB,QAAQ,QAAQ,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,sBAAsB;AAC1B,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,qBAAqB;AAGzB,QAAM,aAAa,oBAAoB,OAAO,OAAO;AAGrD,QAAM,iBAAiB,oBAAI,IAAiE;AAC5F,aAAW,UAAU,OAAO,SAAS;AACnC,QAAI,OAAO,OAAO;AAChB,iBAAW,WAAW,OAAO,OAAO;AAClC,uBAAe,IAAI,QAAQ,MAAM,OAAO;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AAEd,WAAO,KAAK,8BAA8B;AAC1C,UAAM,SAAS,MAAM;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,WAAW;AAAA,IACb;AACA,0BAAsB,OAAO;AAC7B,qBAAiB,OAAO;AAExB,QAAI,OAAO,aAAa,GAAG;AACzB,aAAO,QAAQ,aAAa,OAAO,UAAU,eAAe;AAAA,IAC9D;AACA,QAAI,OAAO,QAAQ,GAAG;AACpB,aAAO,QAAQ,aAAa,OAAO,KAAK,qBAAqB;AAAA,IAC/D;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,QAAQ,aAAa,OAAO,MAAM,WAAW;AAAA,IACtD;AACA,QAAI,OAAO,YAAY,GAAG;AACxB,aAAO,QAAQ,aAAa,OAAO,SAAS,eAAe;AAAA,IAC7D;AACA,QAAI,OAAO,QAAQ,GAAG;AACpB,aAAO,QAAQ,aAAa,OAAO,KAAK,gBAAgB;AAAA,IAC1D;AAGA,QAAI,CAAC,QAAQ,kBAAkB,OAAO,OAAO,cAAc,mBAAmB,GAAG;AAC/E,aAAO,KAAK,gCAAgC;AAE5C,YAAM,WAAWA,SAAQ,SAAS,OAAO,OAAO,WAAW,IAAI;AAC/D,UAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,QAAAG,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,eAAO,MAAM,sBAAsB,QAAQ,EAAE;AAAA,MAC/C;AAGA,YAAM,gBAAgB,OAAO,UAAU,OAAO,OAAO,WAAW,OAAO,OAAO,QAAQ,SAAS;AAC/F,YAAM,mBAAmB,OAAO,OAAO;AACvC,YAAM,YAAY,mBAAmB,SAAS;AAAA,QAC5C,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,QACrB,aAAa;AAAA,QACb,eAAe,iBAAiB,iBAAiB;AAAA,QACjD,qBAAqB,iBAAiB;AAAA,MACxC,CAAC;AAED,iBAAW,QAAQ,WAAW;AAC5B,cAAM,WAAWF,SAAQ,UAAU,KAAK,QAAQ;AAChD,cAAM,UAAUC,SAAQ,QAAQ;AAChC,YAAI,CAACF,YAAW,OAAO,GAAG;AACxB,UAAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,QACxC;AAEA,YAAI,CAAC,KAAK,aAAaH,YAAW,QAAQ,GAAG;AAC3C,iBAAO,MAAM,qBAAqB,KAAK,QAAQ,EAAE;AACjD;AAAA,QACF;AACA,QAAAI,eAAc,UAAU,KAAK,OAAO;AACpC,eAAO,MAAM,YAAY,KAAK,QAAQ,EAAE;AACxC;AAAA,MACF;AAEA,aAAO,QAAQ,aAAa,cAAc,qBAAqB;AAAA,IACjE;AAAA,EACF,OAAO;AAEL,UAAM,SAAS,oBAAoB,SAAS,QAAQ,SAAS,SAAS,WAAW,OAAO;AACxF,0BAAsB,OAAO;AAC7B,qBAAiB,OAAO;AACxB,sBAAkB,OAAO;AACzB,yBAAqB,OAAO;AAAA,EAC9B;AAGA,SAAO,KAAK,uBAAuB;AACnC,QAAM,cAAc,eAAe,cAAc,kBAAkB,OAAO,SAAS,MAAM;AACzF,QAAM,cAAc,UAAU,WAAW;AACzC,SAAO,MAAM,YAAY,OAAO,YAAY,EAAE;AAG9C,SAAO,KAAK,2BAA2B;AACvC,QAAM,eAAe,mBAAmB,EAAE,SAAS,SAAS,aAAa,IAAI,CAAC;AAC9E,QAAM,kBAAkB,yBAAyB,OAAO;AACxD,QAAM,iBAAkC,WAAW,QAAQ,QAAQ,2BAA2B;AAG9F,QAAM,oBAAoB,sBAAsB,IAC5C,GAAG,mBAAmB,kBACtB;AAEJ,MAAI;AACF,UAAM,aAAa,MAAM,aAAa;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,QACE,QAAQ,OAAO,SAAS;AAAA,QACxB,GAAI,sBAAsB,UAAa,EAAE,WAAW,kBAAkB;AAAA,QACtE,aAAa,aAAa,WAAW,QAAQ,MAAM;AAAA,MACrD;AAAA,IACF;AACA,WAAO,MAAM,mBAAmB,WAAW,OAAO,EAAE;AAAA,EACtD,SAAS,cAAc;AAErB,WAAO,MAAM,mCAAoC,aAAuB,OAAO,EAAE;AAAA,EACnF;AAGA,MAAI;AACF,UAAM,gBAAgB,iBAAiB,SAAS,OAAO,OAAO;AAC9D,QAAI,gBAAgB,GAAG;AACrB,aAAO,MAAM,WAAW,aAAa,mBAAmB;AAAA,IAC1D;AAAA,EACF,SAAS,YAAY;AAEnB,WAAO,MAAM,iCAAkC,WAAqB,OAAO,EAAE;AAAA,EAC/E;AAEA,SAAO,QAAQ;AACf,SAAO,QAAQ,sBAAsB;AAErC,MAAI,sBAAsB,KAAK,OAAO,OAAO,SAAS;AACpD,WAAO,KAAK,iBAAiB,OAAO,OAAO,QAAQ,cAAc,GAAG;AAAA,EACtE;AACA,MAAI,kBAAkB,KAAK,OAAO,OAAO,SAAS,YAAY;AAC5D,WAAO,KAAK,aAAa,OAAO,OAAO,QAAQ,UAAU,GAAG;AAAA,EAC9D;AACA,MAAI,iBAAiB,KAAK,OAAO,OAAO,YAAY;AAClD,WAAO,KAAK,YAAY,OAAO,OAAO,WAAW,IAAI,GAAG;AAAA,EAC1D;AACF;AAKO,SAAS,wBAAwBK,UAAwB;AAC9D,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,kDAAkD,EAC9D,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,eAAe,sCAAsC,EAC5D,OAAO,OAAO,YAA6B;AAC1C,QAAI;AACF,YAAM,YAAY,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,UAAI,iBAAiBD,cAAa;AAChC,eAAO,YAAY,KAAK;AACxB,gBAAQ,KAAK,OAAO,YAAY,KAAK,CAAC;AAAA,MACxC,WAAW,iBAAiB,OAAO;AACjC,eAAO,MAAM,MAAM,OAAO;AAC1B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AEx0BA,SAAS,cAAAE,aAAY,eAAAC,cAAa,QAAQ,gBAAgB;AAC1D,SAAS,WAAAC,UAAS,WAAAC,UAAS,YAAY;AACvC,SAAS,uBAAuB;AAgBhC,eAAeC,SAAQ,SAAmC;AACxD,QAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,SAAO,IAAI,QAAQ,CAACC,cAAY;AAC9B,OAAG,SAAS,GAAG,OAAO,WAAW,CAAC,WAAW;AAC3C,SAAG,MAAM;AACT,MAAAA,UAAQ,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAKA,SAAS,WAAW,KAAqB;AACvC,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO;AAE7B,MAAI,QAAQ;AACZ,QAAM,UAAUC,aAAY,GAAG;AAE/B,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,KAAK,KAAK,KAAK;AAChC,UAAM,OAAO,SAAS,QAAQ;AAC9B,QAAI,KAAK,YAAY,GAAG;AACtB,eAAS,WAAW,QAAQ;AAAA,IAC9B,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,KAAa,SAA0B;AACxD,MAAI,CAACD,YAAW,GAAG,EAAG,QAAO;AAE7B,QAAM,QAAQ,WAAW,GAAG;AAC5B,SAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAE5C,MAAI,SAAS;AACX,WAAO,MAAM,YAAY,GAAG,EAAE;AAAA,EAChC;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,KAAa,SAAiB,SAA0B;AAChF,MAAI,CAACA,YAAW,GAAG,EAAG,QAAO;AAE7B,MAAI,QAAQ;AACZ,QAAM,UAAUC,aAAY,GAAG;AAE/B,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,KAAK,KAAK,KAAK;AAChC,UAAM,OAAO,SAAS,QAAQ;AAE9B,QAAI,KAAK,OAAO,KAAK,QAAQ,KAAK,KAAK,GAAG;AACxC,aAAO,QAAQ;AACf,UAAI,SAAS;AACX,eAAO,MAAM,YAAY,QAAQ,EAAE;AAAA,MACrC;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,SAAS,SAAsC;AACnE,SAAO,WAAW,QAAQ,WAAW,KAAK;AAE1C,SAAO,OAAO,8BAA8B;AAG5C,SAAO,MAAM,0BAA0B;AACvC,QAAM,EAAE,QAAQ,YAAAC,YAAW,IAAI,MAAM,WAAW;AAChD,QAAM,UAAUA,cAAaC,SAAQD,WAAU,IAAI,QAAQ,IAAI;AAG/D,QAAM,QAA4F,CAAC;AAGnG,QAAM,kBAAkB;AAAA,IACtB,EAAE,MAAM,qBAAqB,OAAO,CAAC,yBAAyB,+BAA+B,EAAE;AAAA,IAC/F,EAAE,MAAM,uBAAuB,OAAO,CAAC,gCAAgC,sCAAsC,EAAE;AAAA,IAC/G,EAAE,MAAM,wBAAwB,OAAO,CAAC,iCAAiC,uCAAuC,EAAE;AAAA,EACpH;AAEA,aAAW,EAAE,MAAM,OAAO,SAAS,KAAK,iBAAiB;AACvD,eAAW,WAAW,UAAU;AAC9B,YAAM,iBAAiBH,SAAQ,SAAS,OAAO;AAC/C,UAAIC,YAAW,cAAc,GAAG;AAC9B,cAAM,KAAK,EAAE,MAAM,MAAM,gBAAgB,MAAM,MAAM,CAAC;AACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,gBAAgB;AACpC,UAAM,iBAAiBD,SAAQ,SAAS,OAAO;AAC/C,QAAIC,YAAW,cAAc,GAAG;AAC9B,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,OAAO;AACpC,MAAI,eAAe,YAAY;AAC7B,UAAM,aAAaD,SAAQ,SAAS,cAAc,UAAU;AAC5D,UAAM,iBAAiB,KAAK,YAAY,YAAY;AACpD,QAAIC,YAAW,cAAc,KAAK,CAAC,MAAM,KAAK,OAAK,EAAE,SAAS,cAAc,GAAG;AAC7E,YAAM,KAAK,EAAE,MAAM,qBAAqB,MAAM,gBAAgB,MAAM,MAAM,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,MAAI,eAAe,gBAAgB;AACjC,UAAM,iBAAiBD,SAAQ,SAAS,cAAc,cAAc;AACpE,QAAIC,YAAW,cAAc,KAAK,CAAC,MAAM,KAAK,OAAK,EAAE,SAAS,cAAc,GAAG;AAC7E,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAKA,QAAM,iBAAiB,OAAO,OAAO,YAAY;AACjD,QAAM,aAAa,iBAAiBD,SAAQ,SAAS,cAAc,IAAI;AAGvE,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI,CAAC,eAAe,CAACC,YAAW,WAAW,GAAG;AAC5C,eAAW,WAAW,eAAe;AACnC,YAAM,SAASD,SAAQ,SAAS,OAAO;AACvC,UAAIC,YAAW,MAAM,GAAG;AACtB,sBAAc;AACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAeA,YAAW,WAAW,GAAG;AAE1C,UAAM,oBAAoB,CAAC,QAAQ,QAAQ,OAAO;AAClD,eAAW,UAAU,mBAAmB;AACtC,YAAM,UAAU,KAAK,aAAa,MAAM;AACxC,UAAIA,YAAW,OAAO,GAAG;AACvB,cAAM,KAAK,EAAE,MAAM,cAAc,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,aAAa,UAAU;AACnD,eAAW,YAAY,oBAAoB;AACzC,YAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,UAAIA,YAAW,QAAQ,GAAG;AACxB,cAAM,KAAK,EAAE,MAAM,cAAc,QAAQ,IAAI,MAAM,UAAU,MAAM,OAAO,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAeD,SAAQ,SAAS,OAAO,YAAY;AACzD,MAAIC,YAAW,YAAY,GAAG;AAC5B,UAAM,KAAK,EAAE,MAAM,aAAa,MAAM,cAAc,MAAM,OAAO,CAAC;AAAA,EACpE;AAGA,QAAM,cAAcD,SAAQ,SAAS,kBAAkB;AACvD,MAAIC,YAAW,WAAW,GAAG;AAC3B,UAAM,KAAK,EAAE,MAAM,mBAAmB,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EACxE;AAGA,QAAM,oBAAoBD,SAAQ,SAAS,kBAAkB;AAC7D,MAAIC,YAAW,iBAAiB,GAAG;AACjC,UAAM,KAAK,EAAE,MAAM,sCAAsC,MAAM,mBAAmB,MAAM,MAAM,CAAC;AAAA,EACjG;AAGA,QAAM,UAAUD,SAAQ,SAAS,cAAc;AAC/C,MAAIC,YAAW,OAAO,GAAG;AACvB,UAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,EACzD;AAGA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,6CAA6C;AACzD;AAAA,EACF;AAGA,SAAO,QAAQ;AACf,SAAO,KAAK,gCAAgC;AAC5C,SAAO,QAAQ;AAEf,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,OAAO;AACvB,YAAM,QAAQ,WAAW,KAAK,IAAI;AAClC,aAAO,KAAK,YAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA,IAC/D,WAAW,KAAK,SAAS,WAAW,KAAK,SAAS;AAChD,YAAM,QAAQC,aAAY,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,QAAS,KAAK,CAAC,CAAC,EAAE;AAC1E,aAAO,KAAK,YAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA,IAC/D,OAAO;AACL,aAAO,KAAK,YAAO,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,QAAQ;AAGf,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,YAAY,MAAMH,SAAQ,8CAA8C;AAC9E,QAAI,CAAC,WAAW;AACd,aAAO,KAAK,kBAAkB;AAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ;AACf,SAAO,KAAK,mBAAmB;AAG/B,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,OAAO;AACvB,YAAM,QAAQ,UAAU,KAAK,MAAM,QAAQ,WAAW,KAAK;AAC3D,sBAAgB;AAChB,aAAO,KAAK,oBAAe,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA,IACzD,WAAW,KAAK,SAAS,WAAW,KAAK,SAAS;AAChD,YAAM,QAAQ,iBAAiB,KAAK,MAAM,KAAK,SAAS,QAAQ,WAAW,KAAK;AAChF,sBAAgB;AAChB,aAAO,KAAK,oBAAe,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA,IACzD,OAAO;AACL,aAAO,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC;AACjC,UAAI,QAAQ,SAAS;AACnB,eAAO,MAAM,YAAY,KAAK,IAAI,EAAE;AAAA,MACtC;AACA;AACA,aAAO,KAAK,oBAAe,KAAK,IAAI,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,SAAO,QAAQ;AACf,SAAO,QAAQ,2BAA2B,YAAY,WAAW;AACjE,SAAO,QAAQ;AACf,SAAO,KAAK,4CAA4C;AAC1D;AAKO,SAAS,qBAAqBM,UAAwB;AAC3D,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,4DAA4D,EACxE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,aAAa,0BAA0B,EAC9C,OAAO,OAAO,YAA0B;AACvC,QAAI;AACF,YAAM,SAAS,OAAO;AAAA,IACxB,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,eAAO,MAAM,MAAM,OAAO;AAC1B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AClUA,SAAS,UAAU,aAAa;AAChC,SAAS,cAAAC,aAAY,UAAAC,SAAQ,cAAc,iBAAAC,sBAAqB;AAChE,SAAS,WAAAC,gBAAe;AAOxB,IAAM,mBAAmB;AAKzB,SAAS,WAAoB;AAC3B,MAAI;AACF,aAAS,iBAAiB,EAAE,OAAO,SAAS,CAAC;AAC7C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,IAAM,8BAA8B;AAAA;AAAA,EAElC;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF;AAMA,SAAS,iBAAiB,WAAyB;AACjD,QAAM,gBAAgBC,SAAQ,WAAW,YAAY;AACrD,MAAI,CAACC,YAAW,aAAa,EAAG;AAEhC,QAAM,UAAU,aAAa,eAAe,OAAO;AACnD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAGhC,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS;AAC1C,UAAM,UAAU,KAAK,KAAK;AAC1B,WAAO,CAAC,4BAA4B,SAAS,OAAO;AAAA,EACtD,CAAC;AAGD,SAAO,aAAa,SAAS,KAAK,aAAa,CAAC,EAAE,KAAK,MAAM,IAAI;AAC/D,iBAAa,MAAM;AAAA,EACrB;AAEA,EAAAC,eAAc,eAAe,aAAa,KAAK,IAAI,CAAC;AACtD;AAKA,SAAS,UAAU,MAAc,WAAyB;AACxD,SAAO,KAAK,4BAA4B,IAAI,KAAK;AACjD,WAAS,uBAAuB,IAAI,KAAK,SAAS,KAAK,EAAE,OAAO,UAAU,CAAC;AAG3E,QAAM,SAASF,SAAQ,WAAW,MAAM;AACxC,MAAIC,YAAW,MAAM,GAAG;AACtB,IAAAE,QAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACjD;AAGA,mBAAiB,SAAS;AAG1B,WAAS,YAAY,EAAE,KAAK,WAAW,OAAO,SAAS,CAAC;AACxD,SAAO,QAAQ,gCAAgC;AACjD;AAKA,SAAS,WAAW,SAAiB,WAAkC;AACrE,SAAO,IAAI,QAAQ,CAACH,WAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,SAAS,CAAC,GAAG;AAAA,MAC/B,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,QAAAA,UAAQ;AAAA,MACV,OAAO;AACL,eAAO,IAAI,MAAM,iCAAiC,IAAI,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAe,SAAS,WAAkC;AAExD,SAAO,KAAK,4BAA4B;AACxC,QAAM,WAAW,gBAAgB,SAAS;AAC1C,SAAO,QAAQ,wBAAwB;AAGvC,SAAO,KAAK,kBAAkB;AAC9B,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,cAAc,YAAY,uBAAuB;AACvD,QAAM,WAAW,aAAa,SAAS;AACzC;AAKA,eAAsB,iBACpB,aACA,SACe;AACf,QAAM,YAAYA,SAAQ,QAAQ,IAAI,GAAG,WAAW;AACpD,QAAM,OAAO,QAAQ,QAAQ;AAG7B,MAAI,CAAC,SAAS,GAAG;AACf,WAAO,MAAM,iDAAiD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAIC,YAAW,SAAS,GAAG;AACzB,WAAO,MAAM,cAAc,WAAW,mBAAmB;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,QAAQ;AACf,SAAO,KAAK,iCAAiC,WAAW,EAAE;AAC1D,SAAO,QAAQ;AAEf,MAAI;AAEF,cAAU,MAAM,SAAS;AAGzB,QAAI,CAAC,QAAQ,WAAW;AACtB,cAAQ,MAAM,SAAS;AACvB,YAAM,SAAS,SAAS;AAAA,IAC1B;AAEA,WAAO,QAAQ;AACf,WAAO,QAAQ,+BAA+B;AAC9C,WAAO,QAAQ;AACf,WAAO,KAAK,aAAa;AACzB,WAAO,KAAK,QAAQ,WAAW,EAAE;AACjC,QAAI,QAAQ,WAAW;AACrB,aAAO,KAAK,kBAAkB;AAAA,IAChC;AACA,WAAO,KAAK,gBAAgB;AAC5B,WAAO,QAAQ;AAAA,EACjB,SAAS,OAAO;AAEd,QAAIA,YAAW,SAAS,GAAG;AACzB,MAAAE,QAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AACA,UAAM;AAAA,EACR;AACF;AAKO,SAAS,6BAA6BC,UAAwB;AACnE,EAAAA,SACG,QAAQ,uCAAuC,EAC/C,YAAY,+CAA+C,EAC3D,OAAO,oBAAoB,qCAAqC,gBAAgB,EAChF,OAAO,gBAAgB,+BAA+B,EACtD,OAAO,OAAO,aAAqB,YAAoD;AACtF,QAAI;AACF,YAAM,iBAAiB,aAAa,OAAO;AAAA,IAC7C,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,eAAO,MAAM,MAAM,OAAO;AAAA,MAC5B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AV1LA,IAAM,UAAU;AAKhB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,QAAQ,EACb,YAAY,6DAA6D,EACzE,QAAQ,OAAO;AAGlB,oBAAoB,OAAO;AAC3B,wBAAwB,OAAO;AAC/B,oBAAoB,OAAO;AAC3B,wBAAwB,OAAO;AAC/B,qBAAqB,OAAO;AAC5B,6BAA6B,OAAO;AAGpC,QAAQ,GAAG,qBAAqB,CAAC,UAAU;AACzC,MAAI,iBAAiBC,cAAa;AAChC,WAAO,YAAY,KAAK;AACxB,YAAQ,KAAK,OAAO,YAAY,KAAK,CAAC;AAAA,EACxC,OAAO;AACL,WAAO,MAAM,MAAM,OAAO;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAED,QAAQ,GAAG,sBAAsB,CAAC,WAAW;AAC3C,MAAI,kBAAkBA,cAAa;AACjC,WAAO,YAAY,MAAM;AACzB,YAAQ,KAAK,OAAO,YAAY,MAAM,CAAC;AAAA,EACzC,WAAW,kBAAkB,OAAO;AAClC,WAAO,MAAM,OAAO,OAAO;AAAA,EAC7B,OAAO;AACL,WAAO,MAAM,OAAO,MAAM,CAAC;AAAA,EAC7B;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,WAAW,KAAK,CAAC;AACvB,IAAM,aAAa,aAAa,UAAa,CAAC,SAAS,WAAW,GAAG;AACrE,IAAM,aAAaC,SAAQ,QAAQ,IAAI,GAAG,kBAAkB;AAC5D,IAAM,YAAYC,YAAW,UAAU;AAEvC,IAAI,CAAC,cAAc,CAAC,WAAW;AAE7B,UAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU;AAC3B,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AAC/C,eAAO,QAAQ;AACf,eAAO,KAAK,kBAAkB;AAC9B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,aAAO,MAAM,MAAM,OAAO;AAAA,IAC5B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,OAAO;AAEL,UAAQ,MAAM;AAChB;","names":["existsSync","resolve","OmnifyError","configPath","schemasDir","program","resolve","dirname","OmnifyError","existsSync","resolve","configPath","configPath","dirname","resolve","OmnifyError","program","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","pc","configPath","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","existsSync","mkdirSync","writeFileSync","resolve","existsSync","resolve","dirname","mkdirSync","writeFileSync","configPath","loadSchemas","validateSchemas","OmnifyError","program","existsSync","readdirSync","resolve","dirname","confirm","resolve","existsSync","readdirSync","configPath","dirname","program","existsSync","rmSync","writeFileSync","resolve","resolve","existsSync","writeFileSync","rmSync","program","OmnifyError","resolve","existsSync"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@famgia/omnify-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.78",
|
|
4
4
|
"description": "CLI interface for omnify-schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"commander": "^14.0.2",
|
|
29
29
|
"jiti": "^2.6.1",
|
|
30
30
|
"picocolors": "^1.1.1",
|
|
31
|
-
"@famgia/omnify-
|
|
32
|
-
"@famgia/omnify-
|
|
33
|
-
"@famgia/omnify-types": "0.0.
|
|
34
|
-
"@famgia/omnify-
|
|
35
|
-
"@famgia/omnify-
|
|
31
|
+
"@famgia/omnify-atlas": "0.0.66",
|
|
32
|
+
"@famgia/omnify-laravel": "0.0.81",
|
|
33
|
+
"@famgia/omnify-types": "0.0.70",
|
|
34
|
+
"@famgia/omnify-typescript": "0.0.60",
|
|
35
|
+
"@famgia/omnify-core": "0.0.72"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsup",
|