UNPKG

freshland

Version:

Freshland is a CLI tool that lets you clone GitHub repositories without the git history.

240 lines (239 loc) 11.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.initEPAForJS = exports.initEPAForTS = exports.installDeps = exports.updatePackageJSON = exports.deleteAndInitGit = exports.cloneGithubRepo = void 0; const shelljs_1 = __importDefault(require("shelljs")); const promises_1 = __importDefault(require("node:fs/promises")); const logger_1 = require("./logger"); const dir_1 = require("./dir"); const types_1 = require("../types"); function cloneGithubRepo(repo, destination) { if (!shelljs_1.default.which('git')) { logger_1.logger.error('Sorry, this script requires "git"'); shelljs_1.default.exit(1); } let repoURI = `https://github.com/${repo}`; if (repo.startsWith('http') || repo.startsWith('git@')) { repoURI = repo; } logger_1.logger.info('Cloning into', destination); if (shelljs_1.default.exec(`git clone ${repoURI} ${destination}`).code !== 0) { logger_1.logger.error('Cannot clone the repository'); shelljs_1.default.exit(1); } logger_1.logger.info('Repo cloned'); } exports.cloneGithubRepo = cloneGithubRepo; function deleteAndInitGit(pth) { shelljs_1.default.cd(pth); if (shelljs_1.default.rm('-rf', '.git/').code !== 0) { logger_1.logger.error('Cannot delete ".git" folder'); shelljs_1.default.exit(1); } logger_1.logger.info('Initializing git'); if (shelljs_1.default.exec('git init').code !== 0) { logger_1.logger.error('"git init" command failed'); shelljs_1.default.exit(1); } if (shelljs_1.default.exec('git add .').code !== 0) { logger_1.logger.error('"git add" command failed'); shelljs_1.default.exit(1); } if (shelljs_1.default.exec('git commit -am "Auto-commit by Freshland"').code !== 0) { logger_1.logger.error('"git commit" command failed'); shelljs_1.default.exit(1); } logger_1.logger.info('Git initialized'); } exports.deleteAndInitGit = deleteAndInitGit; function updatePackageJSON(packageName, packageVersion, pth) { shelljs_1.default.cd(pth); if (shelljs_1.default.test('-e', './package.json')) { logger_1.logger.info('Updating "package.json"'); shelljs_1.default.ls('package.json').forEach((file) => { shelljs_1.default.sed('-i', /"name":\s*"(.*?)"/gi, `"name": "${packageName}"`, file); shelljs_1.default.sed('-i', /"version":\s*"(.*?)"/gi, `"version": "${packageVersion}"`, file); }); } else { logger_1.logger.warn('File not found: package.json'); } if (shelljs_1.default.test('-e', './package-lock.json')) { logger_1.logger.info('Updating "package-lock.json"'); shelljs_1.default.ls('package-lock.json').forEach((file) => { shelljs_1.default.sed('-i', /"name":\s*"(.*?)"/i, `"name": "${packageName}"`, file); shelljs_1.default.sed('-i', /"version":\s*"(.*?)"/i, `"version": "${packageVersion}"`, file); }); } else { logger_1.logger.warn('File not found: package-lock.json'); } } exports.updatePackageJSON = updatePackageJSON; function installDeps(packageManager, pth) { shelljs_1.default.cd(pth); switch (packageManager) { case types_1.PackageManagerEnum.npm: { if (!shelljs_1.default.which('npm')) { logger_1.logger.error('Sorry, you need to install "npm" to install dependencies'); return; } logger_1.logger.info('Installing dependencies...'); if (shelljs_1.default.exec('npm install').code === 0) { logger_1.logger.info('Dependencies installed'); } else { logger_1.logger.error('"npm install" command failed'); logger_1.logger.warn('You need to install dependencies manually!'); } break; } case types_1.PackageManagerEnum.yarn: { if (!shelljs_1.default.which('yarn')) { logger_1.logger.error('Sorry, you need to install "yarn" to install dependencies'); return; } logger_1.logger.info('Installing dependencies...'); if (shelljs_1.default.exec('yarn install').code === 0) { logger_1.logger.info('Dependencies installed'); } else { logger_1.logger.error('"yarn install" command failed'); logger_1.logger.warn('You need to install dependencies manually!'); } break; } case types_1.PackageManagerEnum.pnpm: { if (!shelljs_1.default.which('pnpm')) { logger_1.logger.error('Sorry, you need to install "pnpm" to install dependencies'); return; } logger_1.logger.info('Installing dependencies...'); if (shelljs_1.default.exec('pnpm install').code === 0) { logger_1.logger.info('Dependencies installed'); } else { logger_1.logger.error('"pnpm install" command failed'); logger_1.logger.warn('You need to install dependencies manually!'); } break; } case types_1.PackageManagerEnum.bun: { if (!shelljs_1.default.which('bun')) { logger_1.logger.error('Sorry, you need to install "bun" to install dependencies'); return; } logger_1.logger.info('Installing dependencies...'); if (shelljs_1.default.exec('bun install').code === 0) { logger_1.logger.info('Dependencies installed'); } else { logger_1.logger.error('"bun install" command failed'); logger_1.logger.warn('You need to install dependencies manually!'); } break; } default: { logger_1.logger.error('Invalid package manager'); logger_1.logger.error('You need to install dependencies manually!'); break; } } } exports.installDeps = installDeps; async function initEPAForTS(pth) { const directoryExists = await checkIfExists(pth, types_1.Check.DIRECTORY); const packageJSONExists = await checkIfExists(`${pth}/package.json`, types_1.Check.FILE); if (directoryExists && packageJSONExists) { shelljs_1.default.cd(pth); } else { logger_1.logger.error('Directory or "package.json" not exists. Exiting...'); shelljs_1.default.exit(1); } logger_1.logger.info('Installing E.P.A (for TypeScript)'); logger_1.logger.info('Installing packages...'); shelljs_1.default.exec('npm install -D eslint eslint-config-prettier eslint-config-airbnb-base eslint-plugin-prettier eslint-plugin-import eslint-plugin-import-resolver-typescript @typescript-eslint/eslint-plugin prettier eslint-config-airbnb-typescript @typescript-eslint/parser'); shelljs_1.default.exec('npm i --save'); logger_1.logger.info('Packages installed'); logger_1.logger.info('Creating .eslintrc.js file'); const eslintRcTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/typescript/.eslintrc.js`, 'utf8'); await promises_1.default.writeFile('.eslintrc.js', eslintRcTemplate); logger_1.logger.info('Creating prettier.config.js file'); const prettierRcTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/typescript/prettier.config.js`, 'utf8'); await promises_1.default.writeFile('prettier.config.js', prettierRcTemplate); const eslintIgnoreTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/typescript/.eslintignore`, 'utf8'); await promises_1.default.writeFile('.eslintignore', eslintIgnoreTemplate); logger_1.logger.info('Pushing "fix" script to package.json'); const packageContent = await promises_1.default.readFile('package.json', 'utf8'); const packageJSON = JSON.parse(packageContent); packageJSON.scripts = { ...packageJSON.scripts, fix: 'eslint . --fix', }; await promises_1.default.writeFile('package.json', JSON.stringify(packageJSON, undefined, 2), 'utf8'); logger_1.logger.warn('[IMPORTANT] You should install "eslint" and "prettier" extensions to get better experience'); logger_1.logger.info('E.P.A installed and configured successfully'); logger_1.logger.info('Done, now you can run "npm run fix" command!'); } exports.initEPAForTS = initEPAForTS; async function initEPAForJS(pth) { const directoryExists = await checkIfExists(pth, types_1.Check.DIRECTORY); const packageJSONExists = await checkIfExists(`${pth}/package.json`, types_1.Check.FILE); if (directoryExists && packageJSONExists) { shelljs_1.default.cd(pth); } else { logger_1.logger.error('Directory or "package.json" not exists. Exiting...'); shelljs_1.default.exit(1); } logger_1.logger.info('Installing E.P.A (for JavaScript)'); logger_1.logger.info('Installing packages...'); shelljs_1.default.exec('npm install -D eslint eslint-config-prettier eslint-config-airbnb-base eslint-plugin-prettier eslint-plugin-import prettier'); shelljs_1.default.exec('npm i --save'); logger_1.logger.info('Packages installed'); logger_1.logger.info('Creating .eslintrc.js file'); const eslintRcTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/javascript/.eslintrc.js`, 'utf8'); await promises_1.default.writeFile('.eslintrc.js', eslintRcTemplate); logger_1.logger.info('Creating prettier.config.js file'); const prettierRcTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/javascript/prettier.config.js`, 'utf8'); await promises_1.default.writeFile('prettier.config.js', prettierRcTemplate); const eslintIgnoreTemplate = await promises_1.default.readFile(`${dir_1.rootDir}/templates/javascript/.eslintignore`, 'utf8'); await promises_1.default.writeFile('.eslintignore', eslintIgnoreTemplate); logger_1.logger.info('Pushing "fix" script to package.json'); const packageContent = await promises_1.default.readFile('package.json', 'utf8'); const packageJSON = JSON.parse(packageContent); packageJSON.scripts = { ...packageJSON.scripts, fix: 'eslint . --fix', }; await promises_1.default.writeFile('package.json', JSON.stringify(packageJSON, undefined, 2), 'utf8'); logger_1.logger.warn('[IMPORTANT] You should install "eslint" and "prettier" extensions to get better experience'); logger_1.logger.info('E.P.A installed and configured successfully'); logger_1.logger.info('Done, now you can run "npm run fix" command!'); } exports.initEPAForJS = initEPAForJS; async function checkIfExists(pth, type) { try { const stats = await promises_1.default.stat(pth); switch (type) { case types_1.Check.DIRECTORY: { return stats.isDirectory(); } case types_1.Check.FILE: { return stats.isFile(); } default: { return false; } } } catch (error) { if (error?.code === 'ENOENT') { return false; } return false; } }