update
This commit is contained in:
144
ts/mod_config/classes.releaseconfig.ts
Normal file
144
ts/mod_config/classes.releaseconfig.ts
Normal file
@@ -0,0 +1,144 @@
|
||||
import * as plugins from './mod.plugins.js';
|
||||
|
||||
export interface IReleaseConfig {
|
||||
registries: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages release configuration stored in npmextra.json
|
||||
* under @git.zone/cli.release namespace
|
||||
*/
|
||||
export class ReleaseConfig {
|
||||
private cwd: string;
|
||||
private config: IReleaseConfig;
|
||||
|
||||
constructor(cwd: string = process.cwd()) {
|
||||
this.cwd = cwd;
|
||||
this.config = { registries: [] };
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ReleaseConfig instance from current working directory
|
||||
*/
|
||||
public static async fromCwd(cwd: string = process.cwd()): Promise<ReleaseConfig> {
|
||||
const instance = new ReleaseConfig(cwd);
|
||||
await instance.load();
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load configuration from npmextra.json
|
||||
*/
|
||||
public async load(): Promise<void> {
|
||||
const npmextraInstance = new plugins.npmextra.Npmextra(this.cwd);
|
||||
const gitzoneConfig = npmextraInstance.dataFor<any>('@git.zone/cli', {});
|
||||
|
||||
this.config = {
|
||||
registries: gitzoneConfig?.release?.registries || [],
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Save configuration to npmextra.json
|
||||
*/
|
||||
public async save(): Promise<void> {
|
||||
const npmextraPath = plugins.path.join(this.cwd, 'npmextra.json');
|
||||
let npmextraData: any = {};
|
||||
|
||||
// Read existing npmextra.json
|
||||
if (await plugins.smartfs.file(npmextraPath).exists()) {
|
||||
const content = await plugins.smartfs.file(npmextraPath).encoding('utf8').read();
|
||||
npmextraData = JSON.parse(content as string);
|
||||
}
|
||||
|
||||
// Ensure @git.zone/cli namespace exists
|
||||
if (!npmextraData['@git.zone/cli']) {
|
||||
npmextraData['@git.zone/cli'] = {};
|
||||
}
|
||||
|
||||
// Ensure release object exists
|
||||
if (!npmextraData['@git.zone/cli'].release) {
|
||||
npmextraData['@git.zone/cli'].release = {};
|
||||
}
|
||||
|
||||
// Update registries
|
||||
npmextraData['@git.zone/cli'].release.registries = this.config.registries;
|
||||
|
||||
// Write back to file
|
||||
await plugins.smartfs
|
||||
.file(npmextraPath)
|
||||
.encoding('utf8')
|
||||
.write(JSON.stringify(npmextraData, null, 2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all configured registries
|
||||
*/
|
||||
public getRegistries(): string[] {
|
||||
return [...this.config.registries];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any registries are configured
|
||||
*/
|
||||
public hasRegistries(): boolean {
|
||||
return this.config.registries.length > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a registry URL
|
||||
* @returns true if added, false if already exists
|
||||
*/
|
||||
public addRegistry(url: string): boolean {
|
||||
const normalizedUrl = this.normalizeUrl(url);
|
||||
|
||||
if (this.config.registries.includes(normalizedUrl)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.config.registries.push(normalizedUrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a registry URL
|
||||
* @returns true if removed, false if not found
|
||||
*/
|
||||
public removeRegistry(url: string): boolean {
|
||||
const normalizedUrl = this.normalizeUrl(url);
|
||||
const index = this.config.registries.indexOf(normalizedUrl);
|
||||
|
||||
if (index === -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.config.registries.splice(index, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all registries
|
||||
*/
|
||||
public clearRegistries(): void {
|
||||
this.config.registries = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize a registry URL (ensure it has https:// prefix)
|
||||
*/
|
||||
private normalizeUrl(url: string): string {
|
||||
let normalized = url.trim();
|
||||
|
||||
// Add https:// if no protocol specified
|
||||
if (!normalized.startsWith('http://') && !normalized.startsWith('https://')) {
|
||||
normalized = `https://${normalized}`;
|
||||
}
|
||||
|
||||
// Remove trailing slash
|
||||
if (normalized.endsWith('/')) {
|
||||
normalized = normalized.slice(0, -1);
|
||||
}
|
||||
|
||||
return normalized;
|
||||
}
|
||||
}
|
||||
169
ts/mod_config/index.ts
Normal file
169
ts/mod_config/index.ts
Normal file
@@ -0,0 +1,169 @@
|
||||
// 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;
|
||||
default:
|
||||
showHelp();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Show current registry configuration
|
||||
*/
|
||||
async function handleShow(): Promise<void> {
|
||||
const config = await ReleaseConfig.fromCwd();
|
||||
const registries = config.getRegistries();
|
||||
|
||||
console.log('');
|
||||
console.log('╭─────────────────────────────────────────────────────────────╮');
|
||||
console.log('│ Release Registry Configuration │');
|
||||
console.log('╰─────────────────────────────────────────────────────────────╯');
|
||||
console.log('');
|
||||
|
||||
if (registries.length === 0) {
|
||||
plugins.logger.log('info', 'No release registries configured.');
|
||||
console.log('');
|
||||
console.log(' Run `gitzone config add <registry-url>` 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<void> {
|
||||
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<void> {
|
||||
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<void> {
|
||||
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.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show help for config command
|
||||
*/
|
||||
function showHelp(): void {
|
||||
console.log('');
|
||||
console.log('Usage: gitzone config <command> [options]');
|
||||
console.log('');
|
||||
console.log('Commands:');
|
||||
console.log(' show Display current registry 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('');
|
||||
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('');
|
||||
}
|
||||
3
ts/mod_config/mod.plugins.ts
Normal file
3
ts/mod_config/mod.plugins.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
// mod_config plugins
|
||||
export * from '../plugins.js';
|
||||
export { logger } from '../gitzone.logging.js';
|
||||
Reference in New Issue
Block a user