UNPKG

@milkmaccya2/hostswitch

Version:

A simple CLI tool to manage and switch between multiple hosts file profiles for different development environments

134 lines 5.55 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const update_notifier_1 = __importDefault(require("update-notifier")); const package_json_1 = __importDefault(require("../package.json")); const CliController_1 = require("./cli/CliController"); const HostSwitchFacade_1 = require("./cli/HostSwitchFacade"); const CliUserInterface_1 = require("./cli/ui/CliUserInterface"); const InteractiveUserInterface_1 = require("./cli/ui/InteractiveUserInterface"); const config_1 = require("./config"); const HostSwitchService_1 = require("./core/HostSwitchService"); const ChalkLogger_1 = require("./infrastructure/ChalkLogger"); const FileSystemAdapter_1 = require("./infrastructure/FileSystemAdapter"); const PermissionChecker_1 = require("./infrastructure/PermissionChecker"); const ProcessManager_1 = require("./infrastructure/ProcessManager"); // 依存性の組み立て const config = (0, config_1.createConfig)(); const fileSystem = new FileSystemAdapter_1.FileSystemAdapter(); const logger = new ChalkLogger_1.ChalkLogger(); const processManager = new ProcessManager_1.ProcessManager(); const permissionChecker = new PermissionChecker_1.PermissionChecker(); // サービス層の初期化 const hostSwitchService = new HostSwitchService_1.HostSwitchService(fileSystem, logger, config, permissionChecker); // Facade層の初期化 const facade = new HostSwitchFacade_1.HostSwitchFacade(hostSwitchService, processManager, permissionChecker); // コマンドライン引数の解析 function parseCommands() { const program = new commander_1.Command(); program .name('hostswitch') .description('A CLI tool for switching hosts file profiles') .version(package_json_1.default.version); // List profiles command program .command('list') .alias('ls') .description('List all profiles') .action(async () => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('list'); }); // Create profile command program .command('create') .argument('<name>', 'Profile name') .option('--from-current', 'Copy current hosts file content') .description('Create a new profile') .action(async (name, options) => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('create', { name, fromCurrent: options.fromCurrent || false, }); }); // Switch profile command program .command('switch') .alias('use') .argument('<name>', 'Profile name') .description('Switch to a profile (requires sudo)') .action(async (name) => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('switch', { name }); }); // Show profile command program .command('show') .alias('cat') .argument('<name>', 'Profile name') .description('Show profile contents') .action(async (name) => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('show', { name }); }); // Edit profile command program .command('edit') .argument('<name>', 'Profile name') .description('Edit a profile') .action(async (name) => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('edit', { name }); }); // Delete profile command program .command('delete') .alias('rm') .argument('<name>', 'Profile name') .option('--force', 'Skip confirmation') .description('Delete a profile') .action(async (name, options) => { const ui = new CliUserInterface_1.CliUserInterface(logger); const controller = new CliController_1.CliController(facade, ui); await controller.executeCommand('delete', { name, force: options.force || false, }); }); return program; } // アプリケーション起動 async function main() { // アップデートチェック (0, update_notifier_1.default)({ pkg: package_json_1.default, updateCheckInterval: 0, shouldNotifyInNpmScript: true, }).notify({ isGlobal: true }); const program = parseCommands(); // 引数が無い場合はインタラクティブモードを起動 if (process.argv.length <= 2) { const ui = new InteractiveUserInterface_1.InteractiveUserInterface(facade, logger); await ui.run(); } else { // コマンドライン引数がある場合は通常のCLIモードで処理 await program.parseAsync(process.argv); } } // エラーハンドリング付きで実行 main().catch((error) => { logger.error(`Fatal error: ${error.message}`); process.exit(1); }); //# sourceMappingURL=hostswitch.js.map