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.

194 lines (175 loc) 5.82 kB
import * as plugins from './mod.plugins.js'; import * as paths from '../paths.js'; import * as gulpFunction from '@push.rocks/gulp-function'; import { Project } from '../classes.project.js'; import { logger } from '../gitzone.logging.js'; /** * ensures a certain dependency */ const ensureDependency = async ( packageJsonObjectArg: any, position: 'dep' | 'devDep' | 'everywhere', constraint: 'exclude' | 'include' | 'latest', dependencyArg: string, ) => { const [packageName, version] = dependencyArg.includes('@') ? dependencyArg.split('@').filter(Boolean) : [dependencyArg, 'latest']; const targetSections: string[] = []; 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 (!packageJsonObjectArg[section]) { packageJsonObjectArg[section] = {}; } switch (constraint) { case 'exclude': delete packageJsonObjectArg[section][packageName]; break; case 'include': if (!packageJsonObjectArg[section][packageName]) { packageJsonObjectArg[section][packageName] = version === 'latest' ? '^1.0.0' : version; } break; case 'latest': // Fetch latest version from npm try { const registry = new plugins.smartnpm.NpmRegistry(); const packageInfo = await registry.getPackageInfo(packageName); const latestVersion = packageInfo['dist-tags'].latest; packageJsonObjectArg[section][packageName] = `^${latestVersion}`; } catch (error) { logger.log( 'warn', `Could not fetch latest version for ${packageName}, using existing or default`, ); if (!packageJsonObjectArg[section][packageName]) { packageJsonObjectArg[section][packageName] = version === 'latest' ? '^1.0.0' : version; } } break; } } }; export const run = async (projectArg: Project) => { const formatStreamWrapper = new plugins.smartstream.StreamWrapper([ plugins.smartgulp.src([`package.json`]), gulpFunction.forEach(async (fileArg: plugins.smartfile.SmartFile) => { const npmextraConfig = new plugins.npmextra.Npmextra(paths.cwd); const gitzoneData: any = npmextraConfig.dataFor('gitzone', {}); const fileString = fileArg.contents.toString(); const packageJson = JSON.parse(fileString); // metadata 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`)); // Check for module type if (!packageJson.type) { logger.log('info', `setting packageJson.type to "module"`); packageJson.type = 'module'; } // Check for private or public if (packageJson.private !== undefined) { logger.log( 'info', 'Success -> found private/public info in package.json!', ); } else { logger.log( 'error', 'found no private boolean! Setting it to private for now!', ); packageJson.private = true; } // Check for license if (packageJson.license) { logger.log('info', 'Success -> found license in package.json!'); } else { logger.log( 'error', 'found no license! Setting it to UNLICENSED for now!', ); packageJson.license = 'UNLICENSED'; } // Check for build script if (packageJson.scripts.build) { logger.log('info', 'Success -> found build script in package.json!'); } else { logger.log( 'error', 'found no build script! Putting a placeholder there for now!', ); packageJson.scripts.build = `echo "Not needed for now"`; } // Check for buildDocs script if (!packageJson.scripts.buildDocs) { logger.log( 'info', 'found no buildDocs script! Putting tsdoc script there now.', ); packageJson.scripts.buildDocs = `tsdoc`; } // check for files packageJson.files = [ 'ts/**/*', 'ts_web/**/*', 'dist/**/*', 'dist_*/**/*', 'dist_ts/**/*', 'dist_ts_web/**/*', 'assets/**/*', 'cli.js', 'npmextra.json', 'readme.md', ]; // check for dependencies await ensureDependency( packageJson, 'devDep', 'latest', '@push.rocks/tapbundle', ); await ensureDependency( packageJson, 'devDep', 'latest', '@git.zone/tstest', ); await ensureDependency( packageJson, 'devDep', 'latest', '@git.zone/tsbuild', ); // set overrides const overrides = plugins.smartfile.fs.toObjectSync( plugins.path.join(paths.assetsDir, 'overrides.json'), ); packageJson.pnpm = packageJson.pnpm || {}; packageJson.pnpm.overrides = overrides; // exclude // TODO fileArg.setContentsFromString(JSON.stringify(packageJson, null, 2)); }), plugins.smartgulp.replace(), ]); await formatStreamWrapper.run().catch((error) => { console.log(error); }); };