@famgia/omnify-cli 0.0.2 → 0.0.4
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/index.cjs +0 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.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"],"sourcesContent":["#!/usr/bin/env node\n/**\n * @famgia/omnify-cli\n * Command-line interface for omnify-schema\n */\n\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n// Re-export for programmatic usage\nexport { defineConfig, loadConfig } from './config/index.js';\nexport type {\n OmnifyConfig,\n ResolvedOmnifyConfig,\n DatabaseConfig,\n OutputConfig,\n} from './config/types.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.1';\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);\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// Parse CLI arguments\nprogram.parse();\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with configuration and example schema.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://omnify.dev/docs/schemas 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 * Example config file content.\n */\nconst EXAMPLE_CONFIG = `import { defineConfig } from '@famgia/omnify-cli';\n\nexport default defineConfig({\n // Schema files location\n schemasDir: './schemas',\n\n // Database configuration\n database: {\n driver: 'mysql',\n // Development database URL for Atlas diff operations\n // devUrl: 'mysql://root@localhost:3306/omnify_dev',\n },\n\n // Output configuration\n output: {\n laravel: {\n migrationsPath: 'database/migrations',\n },\n typescript: {\n path: 'types',\n singleFile: true,\n },\n },\n\n // Plugins for custom types\n plugins: [\n // '@famgia/omnify-japan',\n ],\n});\n`;\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n}\n\n/**\n * Runs the init command.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Initializing Omnify Project');\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 // Create schemas directory\n const schemasDir = resolve(cwd, 'schemas');\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.step('Created schemas/ directory');\n } else {\n logger.debug('schemas/ directory already exists');\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.step('Created example schema: schemas/User.yaml');\n } else {\n logger.debug('Example schema already exists');\n }\n\n // Create config file\n writeFileSync(configPath, EXAMPLE_CONFIG);\n logger.step('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.list([\n 'Edit omnify.config.ts to configure your database',\n 'Add your schema files to the schemas/ directory',\n 'Run \"omnify validate\" to check your schemas',\n 'Run \"omnify diff\" to preview changes',\n 'Run \"omnify generate\" to create migrations and types',\n ]);\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 .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\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 };\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 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?.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 */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { updateLockFile } from '@famgia/omnify-atlas';\nimport { generateMigrations, generateTypeScript } from '@famgia/omnify-laravel';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.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 * 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 and require devUrl for generate\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 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 // Run diff to check for changes\n logger.step('Checking for changes...');\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 && !options.force) {\n logger.success('No changes to generate');\n return;\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n\n // Generate Laravel migrations\n if (!options.typesOnly) {\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 const migrations = generateMigrations(schemas);\n\n for (const migration of migrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly) {\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 const typeFiles = generateTypeScript(schemas, {\n singleFile: config.output.typescript.singleFile,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.fileName);\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.fileName}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n // Update lock file\n logger.step('Updating lock file...');\n await updateLockFile(lockPath, schemas);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (typesGenerated > 0) {\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"],"mappings":"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","names":["import_omnify_core","pc","program","import_node_path","import_omnify_core","import_node_fs","import_node_path","import_omnify_core","module","program","import_node_path","import_omnify_core","import_picocolors","pc","program","import_node_fs","import_node_path","import_omnify_core","import_omnify_atlas","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.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"],"sourcesContent":["/**\n * @famgia/omnify-cli\n * Command-line interface for omnify-schema\n */\n\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n// Re-export for programmatic usage\nexport { defineConfig, loadConfig } from './config/index.js';\nexport type {\n OmnifyConfig,\n ResolvedOmnifyConfig,\n DatabaseConfig,\n OutputConfig,\n} from './config/types.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.1';\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);\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// Parse CLI arguments\nprogram.parse();\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with configuration and example schema.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://omnify.dev/docs/schemas 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 * Example config file content.\n */\nconst EXAMPLE_CONFIG = `import { defineConfig } from '@famgia/omnify-cli';\n\nexport default defineConfig({\n // Schema files location\n schemasDir: './schemas',\n\n // Database configuration\n database: {\n driver: 'mysql',\n // Development database URL for Atlas diff operations\n // devUrl: 'mysql://root@localhost:3306/omnify_dev',\n },\n\n // Output configuration\n output: {\n laravel: {\n migrationsPath: 'database/migrations',\n },\n typescript: {\n path: 'types',\n singleFile: true,\n },\n },\n\n // Plugins for custom types\n plugins: [\n // '@famgia/omnify-japan',\n ],\n});\n`;\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n}\n\n/**\n * Runs the init command.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Initializing Omnify Project');\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 // Create schemas directory\n const schemasDir = resolve(cwd, 'schemas');\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.step('Created schemas/ directory');\n } else {\n logger.debug('schemas/ directory already exists');\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.step('Created example schema: schemas/User.yaml');\n } else {\n logger.debug('Example schema already exists');\n }\n\n // Create config file\n writeFileSync(configPath, EXAMPLE_CONFIG);\n logger.step('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.list([\n 'Edit omnify.config.ts to configure your database',\n 'Add your schema files to the schemas/ directory',\n 'Run \"omnify validate\" to check your schemas',\n 'Run \"omnify diff\" to preview changes',\n 'Run \"omnify generate\" to create migrations and types',\n ]);\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 .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\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 };\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 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?.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 */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { updateLockFile } from '@famgia/omnify-atlas';\nimport { generateMigrations, generateTypeScript } from '@famgia/omnify-laravel';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.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 * 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 and require devUrl for generate\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 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 // Run diff to check for changes\n logger.step('Checking for changes...');\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 && !options.force) {\n logger.success('No changes to generate');\n return;\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n\n // Generate Laravel migrations\n if (!options.typesOnly) {\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 const migrations = generateMigrations(schemas);\n\n for (const migration of migrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly) {\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 const typeFiles = generateTypeScript(schemas, {\n singleFile: config.output.typescript.singleFile,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.fileName);\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.fileName}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n // Update lock file\n logger.step('Updating lock file...');\n await updateLockFile(lockPath, schemas);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (typesGenerated > 0) {\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"],"mappings":"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","names":["import_omnify_core","pc","program","import_node_path","import_omnify_core","import_node_fs","import_node_path","import_omnify_core","module","program","import_node_path","import_omnify_core","import_picocolors","pc","program","import_node_fs","import_node_path","import_omnify_core","import_omnify_atlas","program"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.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"],"sourcesContent":["#!/usr/bin/env node\n/**\n * @famgia/omnify-cli\n * Command-line interface for omnify-schema\n */\n\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n// Re-export for programmatic usage\nexport { defineConfig, loadConfig } from './config/index.js';\nexport type {\n OmnifyConfig,\n ResolvedOmnifyConfig,\n DatabaseConfig,\n OutputConfig,\n} from './config/types.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.1';\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);\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// Parse CLI arguments\nprogram.parse();\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with configuration and example schema.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://omnify.dev/docs/schemas 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 * Example config file content.\n */\nconst EXAMPLE_CONFIG = `import { defineConfig } from '@famgia/omnify-cli';\n\nexport default defineConfig({\n // Schema files location\n schemasDir: './schemas',\n\n // Database configuration\n database: {\n driver: 'mysql',\n // Development database URL for Atlas diff operations\n // devUrl: 'mysql://root@localhost:3306/omnify_dev',\n },\n\n // Output configuration\n output: {\n laravel: {\n migrationsPath: 'database/migrations',\n },\n typescript: {\n path: 'types',\n singleFile: true,\n },\n },\n\n // Plugins for custom types\n plugins: [\n // '@famgia/omnify-japan',\n ],\n});\n`;\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n}\n\n/**\n * Runs the init command.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Initializing Omnify Project');\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 // Create schemas directory\n const schemasDir = resolve(cwd, 'schemas');\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.step('Created schemas/ directory');\n } else {\n logger.debug('schemas/ directory already exists');\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.step('Created example schema: schemas/User.yaml');\n } else {\n logger.debug('Example schema already exists');\n }\n\n // Create config file\n writeFileSync(configPath, EXAMPLE_CONFIG);\n logger.step('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.list([\n 'Edit omnify.config.ts to configure your database',\n 'Add your schema files to the schemas/ directory',\n 'Run \"omnify validate\" to check your schemas',\n 'Run \"omnify diff\" to preview changes',\n 'Run \"omnify generate\" to create migrations and types',\n ]);\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 .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\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 };\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 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?.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 */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { updateLockFile } from '@famgia/omnify-atlas';\nimport { generateMigrations, generateTypeScript } from '@famgia/omnify-laravel';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.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 * 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 and require devUrl for generate\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 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 // Run diff to check for changes\n logger.step('Checking for changes...');\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 && !options.force) {\n logger.success('No changes to generate');\n return;\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n\n // Generate Laravel migrations\n if (!options.typesOnly) {\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 const migrations = generateMigrations(schemas);\n\n for (const migration of migrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly) {\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 const typeFiles = generateTypeScript(schemas, {\n singleFile: config.output.typescript.singleFile,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.fileName);\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.fileName}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n // Update lock file\n logger.step('Updating lock file...');\n await updateLockFile(lockPath, schemas);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (typesGenerated > 0) {\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"],"mappings":"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","names":["OmnifyError","program","resolve","dirname","OmnifyError","existsSync","resolve","dirname","resolve","OmnifyError","program","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","pc","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","existsSync","mkdirSync","writeFileSync","program","OmnifyError"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.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"],"sourcesContent":["/**\n * @famgia/omnify-cli\n * Command-line interface for omnify-schema\n */\n\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n// Re-export for programmatic usage\nexport { defineConfig, loadConfig } from './config/index.js';\nexport type {\n OmnifyConfig,\n ResolvedOmnifyConfig,\n DatabaseConfig,\n OutputConfig,\n} from './config/types.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.1';\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);\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// Parse CLI arguments\nprogram.parse();\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with configuration and example schema.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://omnify.dev/docs/schemas 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 * Example config file content.\n */\nconst EXAMPLE_CONFIG = `import { defineConfig } from '@famgia/omnify-cli';\n\nexport default defineConfig({\n // Schema files location\n schemasDir: './schemas',\n\n // Database configuration\n database: {\n driver: 'mysql',\n // Development database URL for Atlas diff operations\n // devUrl: 'mysql://root@localhost:3306/omnify_dev',\n },\n\n // Output configuration\n output: {\n laravel: {\n migrationsPath: 'database/migrations',\n },\n typescript: {\n path: 'types',\n singleFile: true,\n },\n },\n\n // Plugins for custom types\n plugins: [\n // '@famgia/omnify-japan',\n ],\n});\n`;\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n}\n\n/**\n * Runs the init command.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Initializing Omnify Project');\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 // Create schemas directory\n const schemasDir = resolve(cwd, 'schemas');\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.step('Created schemas/ directory');\n } else {\n logger.debug('schemas/ directory already exists');\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.step('Created example schema: schemas/User.yaml');\n } else {\n logger.debug('Example schema already exists');\n }\n\n // Create config file\n writeFileSync(configPath, EXAMPLE_CONFIG);\n logger.step('Created omnify.config.ts');\n\n logger.newline();\n logger.success('Project initialized successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.list([\n 'Edit omnify.config.ts to configure your database',\n 'Add your schema files to the schemas/ directory',\n 'Run \"omnify validate\" to check your schemas',\n 'Run \"omnify diff\" to preview changes',\n 'Run \"omnify generate\" to create migrations and types',\n ]);\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 .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\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 };\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 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?.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 */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { updateLockFile } from '@famgia/omnify-atlas';\nimport { generateMigrations, generateTypeScript } from '@famgia/omnify-laravel';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.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 * 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 and require devUrl for generate\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 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 // Run diff to check for changes\n logger.step('Checking for changes...');\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 && !options.force) {\n logger.success('No changes to generate');\n return;\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n\n // Generate Laravel migrations\n if (!options.typesOnly) {\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 const migrations = generateMigrations(schemas);\n\n for (const migration of migrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly) {\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 const typeFiles = generateTypeScript(schemas, {\n singleFile: config.output.typescript.singleFile,\n });\n\n for (const file of typeFiles) {\n const filePath = resolve(typesDir, file.fileName);\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.fileName}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n }\n\n // Update lock file\n logger.step('Updating lock file...');\n await updateLockFile(lockPath, schemas);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (typesGenerated > 0) {\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"],"mappings":"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","names":["OmnifyError","program","resolve","dirname","OmnifyError","existsSync","resolve","dirname","resolve","OmnifyError","program","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","pc","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","resolve","dirname","loadSchemas","validateSchemas","OmnifyError","dirname","resolve","loadSchemas","validateSchemas","OmnifyError","existsSync","mkdirSync","writeFileSync","program","OmnifyError"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@famgia/omnify-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "CLI interface for omnify-schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"commander": "^14.0.2",
|
|
25
25
|
"jiti": "^2.6.1",
|
|
26
26
|
"picocolors": "^1.1.1",
|
|
27
|
-
"@famgia/omnify-atlas": "0.0.
|
|
28
|
-
"@famgia/omnify-core": "0.0.
|
|
29
|
-
"@famgia/omnify-laravel": "0.0.
|
|
30
|
-
"@famgia/omnify-types": "0.0.
|
|
27
|
+
"@famgia/omnify-atlas": "0.0.4",
|
|
28
|
+
"@famgia/omnify-core": "0.0.4",
|
|
29
|
+
"@famgia/omnify-laravel": "0.0.4",
|
|
30
|
+
"@famgia/omnify-types": "0.0.4"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "tsup",
|