@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
JavaScript
#!/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