UNPKG

@git.zone/cli

Version:

A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.

186 lines 14.7 kB
import * as plugins from './mod.plugins.js'; import * as paths from '../paths.js'; import { logger } from '../gitzone.logging.js'; import * as ui from './mod.ui.js'; /** * Detects the current git branch * @returns The current branch name, defaults to 'master' if detection fails */ export async function detectCurrentBranch() { try { const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', sourceFilePaths: [], }); const result = await smartshellInstance.exec('git branch --show-current'); const branchName = result.stdout.trim(); if (!branchName) { logger.log('warn', 'Could not detect current branch, falling back to "master"'); return 'master'; } logger.log('info', `Detected current branch: ${branchName}`); return branchName; } catch (error) { logger.log('warn', `Failed to detect branch: ${error.message}, falling back to "master"`); return 'master'; } } /** * Detects the project type based on presence of package.json and/or deno.json * @returns The project type */ export async function detectProjectType() { const packageJsonPath = plugins.path.join(paths.cwd, 'package.json'); const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json'); const hasPackageJson = await plugins.smartfs.file(packageJsonPath).exists(); const hasDenoJson = await plugins.smartfs.file(denoJsonPath).exists(); if (hasPackageJson && hasDenoJson) { logger.log('info', 'Detected dual project (npm + deno)'); return 'both'; } else if (hasPackageJson) { logger.log('info', 'Detected npm project'); return 'npm'; } else if (hasDenoJson) { logger.log('info', 'Detected deno project'); return 'deno'; } else { throw new Error('No package.json or deno.json found in current directory'); } } /** * Parses a semantic version string and bumps it according to the version type * @param currentVersion Current version string (e.g., "1.2.3") * @param versionType Type of version bump * @returns New version string */ function calculateNewVersion(currentVersion, versionType) { const versionMatch = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)/); if (!versionMatch) { throw new Error(`Invalid version format: ${currentVersion}`); } let [, major, minor, patch] = versionMatch.map(Number); switch (versionType) { case 'major': major += 1; minor = 0; patch = 0; break; case 'minor': minor += 1; patch = 0; break; case 'patch': patch += 1; break; } return `${major}.${minor}.${patch}`; } /** * Reads the current version from package.json or deno.json * @param projectType The project type to determine which file to read * @returns The current version string */ async function readCurrentVersion(projectType) { if (projectType === 'npm' || projectType === 'both') { const packageJsonPath = plugins.path.join(paths.cwd, 'package.json'); const content = (await plugins.smartfs .file(packageJsonPath) .encoding('utf8') .read()); const packageJson = JSON.parse(content); if (!packageJson.version) { throw new Error('package.json does not contain a version field'); } return packageJson.version; } else { const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json'); const content = (await plugins.smartfs .file(denoJsonPath) .encoding('utf8') .read()); const denoConfig = JSON.parse(content); if (!denoConfig.version) { throw new Error('deno.json does not contain a version field'); } return denoConfig.version; } } /** * Updates the version field in a JSON file (package.json or deno.json) * @param filePath Path to the JSON file * @param newVersion The new version to write */ async function updateVersionFile(filePath, newVersion) { const content = (await plugins.smartfs .file(filePath) .encoding('utf8') .read()); const config = JSON.parse(content); config.version = newVersion; await plugins.smartfs .file(filePath) .encoding('utf8') .write(JSON.stringify(config, null, 2) + '\n'); } /** * Bumps the project version based on project type * Handles npm-only, deno-only, and dual projects with unified logic * @param projectType The detected project type * @param versionType The type of version bump * @param currentStep The current step number for progress display * @param totalSteps The total number of steps for progress display * @returns The new version string */ export async function bumpProjectVersion(projectType, versionType, currentStep, totalSteps) { if (projectType === 'none') { throw new Error('Cannot bump version: no package.json or deno.json found'); } const projectEmoji = projectType === 'npm' ? '📦' : projectType === 'deno' ? '🦕' : '🔀'; const description = `🏷️ Bumping version (${projectEmoji} ${projectType})`; if (currentStep && totalSteps) { ui.printStep(currentStep, totalSteps, description, 'in-progress'); } const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', sourceFilePaths: [], }); try { // 1. Read current version const currentVersion = await readCurrentVersion(projectType); // 2. Calculate new version (reuse existing function!) const newVersion = calculateNewVersion(currentVersion, versionType); logger.log('info', `Bumping version: ${currentVersion}${newVersion}`); // 3. Determine which files to update const filesToUpdate = []; const packageJsonPath = plugins.path.join(paths.cwd, 'package.json'); const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json'); if (projectType === 'npm' || projectType === 'both') { await updateVersionFile(packageJsonPath, newVersion); filesToUpdate.push('package.json'); } if (projectType === 'deno' || projectType === 'both') { await updateVersionFile(denoJsonPath, newVersion); filesToUpdate.push('deno.json'); } // 4. Stage all updated files await smartshellInstance.exec(`git add ${filesToUpdate.join(' ')}`); // 5. Create version commit await smartshellInstance.exec(`git commit -m "v${newVersion}"`); // 6. Create version tag await smartshellInstance.exec(`git tag v${newVersion} -m "v${newVersion}"`); logger.log('info', `Created commit and tag v${newVersion}`); if (currentStep && totalSteps) { ui.printStep(currentStep, totalSteps, description, 'done'); } return newVersion; } catch (error) { throw new Error(`Failed to bump project version: ${error.message}`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L21vZC5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS2xDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLElBQUksQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUMzRCxRQUFRLEVBQUUsTUFBTTtZQUNoQixlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDJEQUEyRCxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRCQUE0QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLDRCQUE0QixDQUFDLENBQUM7UUFDMUYsT0FBTyxRQUFRLENB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