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.

171 lines 14.3 kB
import { BaseFormatter } from '../classes.baseformatter.js'; import * as plugins from '../mod.plugins.js'; import * as paths from '../../paths.js'; import { logger, logVerbose } from '../../gitzone.logging.js'; /** * Ensures a certain dependency exists or is excluded */ const ensureDependency = async (packageJsonObject, position, constraint, dependencyArg) => { // Parse package name and version, handling scoped packages like @scope/name@version const isScoped = dependencyArg.startsWith('@'); const lastAtIndex = dependencyArg.lastIndexOf('@'); // For scoped packages, the version @ must come after the / // For unscoped packages, any @ indicates a version const hasVersion = isScoped ? lastAtIndex > dependencyArg.indexOf('/') : lastAtIndex >= 0; const packageName = hasVersion ? dependencyArg.slice(0, lastAtIndex) : dependencyArg; const version = hasVersion ? dependencyArg.slice(lastAtIndex + 1) : 'latest'; const targetSections = []; switch (position) { case 'dep': targetSections.push('dependencies'); break; case 'devDep': targetSections.push('devDependencies'); break; case 'everywhere': targetSections.push('dependencies', 'devDependencies'); break; } for (const section of targetSections) { if (!packageJsonObject[section]) { packageJsonObject[section] = {}; } switch (constraint) { case 'exclude': delete packageJsonObject[section][packageName]; break; case 'include': if (!packageJsonObject[section][packageName]) { packageJsonObject[section][packageName] = version === 'latest' ? '^1.0.0' : version; } break; case 'latest': try { const registry = new plugins.smartnpm.NpmRegistry(); const packageInfo = await registry.getPackageInfo(packageName); const latestVersion = packageInfo['dist-tags'].latest; packageJsonObject[section][packageName] = `^${latestVersion}`; } catch (error) { logVerbose(`Could not fetch latest version for ${packageName}, using existing or default`); if (!packageJsonObject[section][packageName]) { packageJsonObject[section][packageName] = version === 'latest' ? '^1.0.0' : version; } } break; } } }; export class PackageJsonFormatter extends BaseFormatter { get name() { return 'packagejson'; } async analyze() { const changes = []; const packageJsonPath = 'package.json'; // Check if file exists const exists = await plugins.smartfs.file(packageJsonPath).exists(); if (!exists) { logVerbose('package.json does not exist, skipping'); return changes; } // Read current content const currentContent = (await plugins.smartfs .file(packageJsonPath) .encoding('utf8') .read()); // Parse and compute new content const packageJson = JSON.parse(currentContent); // Get gitzone config from npmextra const npmextraConfig = new plugins.npmextra.Npmextra(paths.cwd); const gitzoneData = npmextraConfig.dataFor('@git.zone/cli', {}); // Set metadata from gitzone config if (gitzoneData.module) { packageJson.repository = { type: 'git', url: `https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}.git`, }; packageJson.bugs = { url: `https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}/issues`, }; packageJson.homepage = `https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}#readme`; } // Ensure module type if (!packageJson.type) { packageJson.type = 'module'; } // Ensure private field exists if (packageJson.private === undefined) { packageJson.private = true; } // Ensure license field exists if (!packageJson.license) { packageJson.license = 'UNLICENSED'; } // Ensure scripts object exists if (!packageJson.scripts) { packageJson.scripts = {}; } // Ensure build script exists if (!packageJson.scripts.build) { packageJson.scripts.build = `echo "Not needed for now"`; } // Ensure buildDocs script exists if (!packageJson.scripts.buildDocs) { packageJson.scripts.buildDocs = `tsdoc`; } // Set files array packageJson.files = [ 'ts/**/*', 'ts_web/**/*', 'dist/**/*', 'dist_*/**/*', 'dist_ts/**/*', 'dist_ts_web/**/*', 'assets/**/*', 'cli.js', 'npmextra.json', 'readme.md', ]; // Handle dependencies await ensureDependency(packageJson, 'devDep', 'exclude', '@push.rocks/tapbundle'); await ensureDependency(packageJson, 'devDep', 'latest', '@git.zone/tstest'); await ensureDependency(packageJson, 'devDep', 'latest', '@git.zone/tsbuild'); // Set pnpm overrides from assets try { const overridesContent = (await plugins.smartfs .file(plugins.path.join(paths.assetsDir, 'overrides.json')) .encoding('utf8') .read()); const overrides = JSON.parse(overridesContent); packageJson.pnpm = packageJson.pnpm || {}; packageJson.pnpm.overrides = overrides; } catch (error) { logVerbose(`Could not read overrides.json: ${error.message}`); } const newContent = JSON.stringify(packageJson, null, 2); // Only add change if content differs if (newContent !== currentContent) { changes.push({ type: 'modify', path: packageJsonPath, module: this.name, description: 'Format package.json', content: newContent, }); } return changes; } async applyChange(change) { if (change.type !== 'modify' || !change.content) return; await this.modifyFile(change.path, change.content); logger.log('info', 'Updated package.json'); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZWpzb24uZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvbW9kX2Zvcm1hdC9mb3JtYXR0ZXJzL3BhY2thZ2Vqc29uLmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFNUQsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDNUIsaUJBQXNCLEVBQ3RCLFFBQXlDLEVBQ3pDLFVBQTRDLEVBQzVDLGFBQXFCLEVBQ04sRUFBRTtJQUNqQixvRkFBb0Y7SUFDcEYsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRW5ELDJEQUEyRDtJQUMzRCxtREFBbUQ7SUFDbkQsTUFBTSxVQUFVLEdBQUcsUUFBUTtRQUN6QixDQUFDLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBRXJCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUNyRixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxR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