// gitzone config - manage release registry configuration import * as plugins from './mod.plugins.js'; import { ReleaseConfig } from './classes.releaseconfig.js'; export { ReleaseConfig }; export const run = async (argvArg: any) => { const command = argvArg._?.[1] || 'show'; const value = argvArg._?.[2]; switch (command) { case 'show': await handleShow(); break; case 'add': await handleAdd(value); break; case 'remove': await handleRemove(value); break; case 'clear': await handleClear(); break; case 'access': case 'accessLevel': await handleAccessLevel(value); break; default: showHelp(); } }; /** * Show current registry configuration */ async function handleShow(): Promise { const config = await ReleaseConfig.fromCwd(); const registries = config.getRegistries(); const accessLevel = config.getAccessLevel(); console.log(''); console.log('╭─────────────────────────────────────────────────────────────╮'); console.log('│ Release Configuration │'); console.log('╰─────────────────────────────────────────────────────────────╯'); console.log(''); // Show access level plugins.logger.log('info', `Access Level: ${accessLevel}`); console.log(''); if (registries.length === 0) { plugins.logger.log('info', 'No release registries configured.'); console.log(''); console.log(' Run `gitzone config add ` to add one.'); console.log(''); } else { plugins.logger.log('info', `Configured registries (${registries.length}):`); console.log(''); registries.forEach((url, index) => { console.log(` ${index + 1}. ${url}`); }); console.log(''); } } /** * Add a registry URL */ async function handleAdd(url?: string): Promise { if (!url) { // Interactive mode const interactInstance = new plugins.smartinteract.SmartInteract(); const response = await interactInstance.askQuestion({ type: 'input', name: 'registryUrl', message: 'Enter registry URL:', default: 'https://registry.npmjs.org', validate: (input: string) => { return !!(input && input.trim() !== ''); }, }); url = (response as any).value; } const config = await ReleaseConfig.fromCwd(); const added = config.addRegistry(url!); if (added) { await config.save(); plugins.logger.log('success', `Added registry: ${url}`); } else { plugins.logger.log('warn', `Registry already exists: ${url}`); } } /** * Remove a registry URL */ async function handleRemove(url?: string): Promise { const config = await ReleaseConfig.fromCwd(); const registries = config.getRegistries(); if (registries.length === 0) { plugins.logger.log('warn', 'No registries configured to remove.'); return; } if (!url) { // Interactive mode - show list to select from const interactInstance = new plugins.smartinteract.SmartInteract(); const response = await interactInstance.askQuestion({ type: 'list', name: 'registryUrl', message: 'Select registry to remove:', choices: registries, default: registries[0], }); url = (response as any).value; } const removed = config.removeRegistry(url!); if (removed) { await config.save(); plugins.logger.log('success', `Removed registry: ${url}`); } else { plugins.logger.log('warn', `Registry not found: ${url}`); } } /** * Clear all registries */ async function handleClear(): Promise { const config = await ReleaseConfig.fromCwd(); if (!config.hasRegistries()) { plugins.logger.log('info', 'No registries to clear.'); return; } // Confirm before clearing const confirmed = await plugins.smartinteract.SmartInteract.getCliConfirmation( 'Clear all configured registries?', false ); if (confirmed) { config.clearRegistries(); await config.save(); plugins.logger.log('success', 'All registries cleared.'); } else { plugins.logger.log('info', 'Operation cancelled.'); } } /** * Set or toggle access level */ async function handleAccessLevel(level?: string): Promise { const config = await ReleaseConfig.fromCwd(); const currentLevel = config.getAccessLevel(); if (!level) { // Interactive mode - toggle or ask const interactInstance = new plugins.smartinteract.SmartInteract(); const response = await interactInstance.askQuestion({ type: 'list', name: 'accessLevel', message: 'Select npm access level for publishing:', choices: ['public', 'private'], default: currentLevel, }); level = (response as any).value; } // Validate the level if (level !== 'public' && level !== 'private') { plugins.logger.log('error', `Invalid access level: ${level}. Must be 'public' or 'private'.`); return; } if (level === currentLevel) { plugins.logger.log('info', `Access level is already set to: ${level}`); return; } config.setAccessLevel(level as 'public' | 'private'); await config.save(); plugins.logger.log('success', `Access level set to: ${level}`); } /** * Show help for config command */ function showHelp(): void { console.log(''); console.log('Usage: gitzone config [options]'); console.log(''); console.log('Commands:'); console.log(' show Display current release configuration'); console.log(' add [url] Add a registry URL'); console.log(' remove [url] Remove a registry URL'); console.log(' clear Clear all registries'); console.log(' access [public|private] Set npm access level for publishing'); console.log(''); console.log('Examples:'); console.log(' gitzone config show'); console.log(' gitzone config add https://registry.npmjs.org'); console.log(' gitzone config add https://verdaccio.example.com'); console.log(' gitzone config remove https://registry.npmjs.org'); console.log(' gitzone config clear'); console.log(' gitzone config access public'); console.log(' gitzone config access private'); console.log(''); }