freshland
Version:
Freshland is a CLI tool that lets you clone GitHub repositories without the git history.
233 lines (232 loc) • 9.58 kB
JavaScript
#!/usr/bin/env node
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.globalOptions = exports.program = void 0;
const prompts_1 = require("@inquirer/prompts");
const extra_typings_1 = require("@commander-js/extra-typings");
const node_path_1 = __importDefault(require("node:path"));
const logger_1 = require("./lib/logger");
const utils_1 = require("./lib/utils");
const package_json_1 = require("../package.json");
const types_1 = require("./types");
exports.program = new extra_typings_1.Command()
.name(package_json_1.name)
.version(package_json_1.version, '-v, --vers', 'Output the current version')
.description(package_json_1.description)
.option('-d, --debug', 'Enable debug mode')
.action(GUIcloneCommand);
exports.program
.command('clone')
.description('Clone a repository to specified path')
.argument('<repo>', 'ProxityStudios/typescript-starter OR https://github.com/proxitystudios/typescript-starter')
.argument('<path>', 'path/to/clone')
.option('--upd, --update-package', 'Update the package name and version')
.option('--n, --name <name>', 'Specify the package name | --upd flag required')
.option('--v, --version <version>', 'Specify the package version | --upd flag required')
.option('--i, --install-deps <packageManager>', 'Install dependencies (supports npm, yarn, pnpm & bun)')
.option('--kg, --keep-git', 'Do not delete ".git" folder')
.action(NOGUIcloneCommand);
exports.program
.command('init-epa')
.description('Installs Eslint, Prettier & Airbnb and automatically configures it.')
.argument('<path>', 'path/to/install')
.option('--ts, --typescript', 'Use TypeScript')
.action(initEPACommand);
exports.globalOptions = exports.program.opts();
if (exports.globalOptions.debug) {
logger_1.logger.debug('Debug mode enabled (--debug)');
}
exports.program.parse(process.argv);
async function initEPACommand(pth, opts) {
const { typescript } = opts;
const p = node_path_1.default.resolve(pth);
await (typescript ? (0, utils_1.initEPAForTS)(p) : (0, utils_1.initEPAForJS)(p));
}
function NOGUIcloneCommand(repo, destination, opts) {
const pth = node_path_1.default.resolve(destination);
const { keepGit, name: packageName, version: packageVersion, installDeps: iDeps, updatePackage, } = opts;
try {
(0, utils_1.cloneGithubRepo)(repo, pth);
if (keepGit) {
logger_1.logger.warn('Git deletion skipped. (omit --kg or --keep-git flag)');
}
else {
(0, utils_1.deleteAndInitGit)(pth);
}
if (!updatePackage && (packageName ?? packageVersion)) {
logger_1.logger.warn('You need to provide --update-package flag to change package name and version');
}
else {
(0, utils_1.updatePackageJSON)(packageName
? packageName.replaceAll(' ', '-')
: destination.split('/').pop(), packageVersion ?? '1.0.0', pth);
}
if (iDeps) {
(0, utils_1.installDeps)(iDeps, pth);
}
else {
logger_1.logger.warn('You need to install dependencies manually!');
}
logger_1.logger.info('Done, you are ready to code!');
}
catch {
logger_1.logger.error('An unexpected error occured or user canceled the process.');
}
}
async function GUIcloneCommand() {
let repo;
try {
const usingStarter = await (0, prompts_1.confirm)({
message: 'Do you want to use a starter?',
default: false,
});
repo = await (usingStarter
? (0, prompts_1.select)({
message: 'Choose a starter to clone',
choices: [
{
name: 'Use TypeScript Starter',
value: 'proxitystudios/typescript-starter',
},
{
name: 'Use JavaScript Starter',
value: 'proxitystudios/javascript-starter',
},
{
name: 'Use Express API Starter Written With TypeScript',
value: 'proxitystudios/express-api-starter-ts',
},
{
name: 'Use Discord Bot Starter Written With TypeScript',
value: 'proxitystudios/discord-bot-starter-ts',
},
],
})
: (0, prompts_1.input)({
message: 'What repository do you want to clone?',
validate: (sourceRepo) => {
if (sourceRepo.trim() === '') {
return 'Repository cannot be empty.';
}
return true;
},
}));
const destination = await (0, prompts_1.input)({
message: 'Where do you want to clone?',
validate: (i) => {
if (i.trim() === '') {
return 'Path cannot be empty.';
}
return true;
},
});
const pth = node_path_1.default.resolve(destination);
const updatePackageNameAndVersion = await (0, prompts_1.confirm)({
message: 'Do you want to change the package name and version?',
default: false,
});
let packageName;
let packageVersion;
if (updatePackageNameAndVersion) {
packageName = await (0, prompts_1.input)({
message: 'What should we call this repository?',
default: destination === '.'
? pth.split(/[/\\]/).pop()
: destination.replaceAll(' ', '-').split(/[/\\]/).pop(),
transformer: (v) => {
return v.replaceAll(' ', '-');
},
});
packageVersion = await (0, prompts_1.input)({
message: 'What version should we use?',
default: '1.0.0',
validate: (i) => {
if (!/^[\d.]*$/.test(i)) {
return 'Version should include only numbers and dots. (1.0.0)';
}
if (i.split('.').length < 2) {
return 'Version should include at least a dot. (1.0)';
}
return true;
},
});
}
const installDependencies = await (0, prompts_1.confirm)({
message: 'Do you want to install dependencies?',
default: false,
});
let initEPA;
if (!usingStarter) {
initEPA = await (0, prompts_1.confirm)({
message: 'Do you want to init E.P.A and automatically configure it?',
default: false,
});
}
let repoCodeLanguage;
if (initEPA) {
repoCodeLanguage = await (0, prompts_1.select)({
message: 'Select the code language of the repository',
choices: [
{
name: 'This repository uses JavaScript',
value: 'javascript',
},
{
name: 'This repository uses TypeScript',
value: 'javascript',
},
],
});
}
let selectedPackageManager;
if (installDependencies) {
selectedPackageManager = await (0, prompts_1.select)({
message: 'Select the package manager of the repository',
choices: [
{
name: 'This repository uses "npm" as package manager',
value: types_1.PackageManagerEnum.npm,
},
{
name: 'This repository uses "bun" as package manager',
value: types_1.PackageManagerEnum.bun,
},
{
name: 'This repository uses "pnpm" as package manager',
value: types_1.PackageManagerEnum.pnpm,
},
{
name: 'This repository uses "yarn" as package manager',
value: types_1.PackageManagerEnum.yarn,
},
],
});
}
(0, utils_1.cloneGithubRepo)(repo, pth);
(0, utils_1.deleteAndInitGit)(destination);
if (updatePackageNameAndVersion) {
(0, utils_1.updatePackageJSON)(packageName, packageVersion, pth);
}
if (initEPA && repoCodeLanguage) {
if (repoCodeLanguage === 'javascript') {
await (0, utils_1.initEPAForJS)(pth);
}
if (repoCodeLanguage === 'typescript') {
await (0, utils_1.initEPAForTS)(pth);
}
}
else if (selectedPackageManager) {
(0, utils_1.installDeps)(selectedPackageManager, pth);
}
else {
logger_1.logger.warn('You need to install dependencies manually!');
}
logger_1.logger.info('Done, you are ready to code!');
}
catch {
logger_1.logger.error('An unexpected error occured or user canceled the process.');
}
}