cli rework

This commit is contained in:
Oleksandr Honcharov 2024-06-13 22:47:33 +03:00
parent 333bd9df13
commit 36c241a117
4 changed files with 79 additions and 43 deletions

View File

@ -1,31 +1,11 @@
import type { CommandModule, Argv, ArgumentsCamelCase } from 'yargs'
import c from 'chalk' import c from 'chalk'
import { input, select } from '@inquirer/prompts' import { input, select } from '@inquirer/prompts'
import clone from 'git-clone' import clone from 'git-clone'
import path from 'node:path' import path from 'node:path'
import { checkForUpdate } from '../utils/update' export async function initProject() {
let folder
function builder(yargs: Argv) { let framework
return yargs
.option('projectName', {
alias: 'p',
description: 'Name of the folder to scaffold a project to',
type: 'string',
demandOption: false,
})
.option('template', {
alias: 't',
description: 'Frontend framework to use for CEF',
type: 'string',
demandOption: false,
})
.middleware(async () => await checkForUpdate())
}
async function handler(args: ArgumentsCamelCase) {
let folder = (args.projectName as string) ?? args.p
let framework = (args.template as string) ?? args.t
if (!folder) { if (!folder) {
folder = await input({ folder = await input({
@ -84,13 +64,3 @@ async function handler(args: ArgumentsCamelCase) {
}, },
) )
} }
const init: CommandModule = {
command: 'create [folderName] [template]',
aliases: 'c',
describe: 'Scaffold a template project using RageFW',
builder,
handler,
}
export default init

View File

@ -0,0 +1,37 @@
import axios from 'axios'
import * as fs from 'node:fs'
const latestReleases =
'https://git.entityseven.com/api/v1/repos/entityseven/rage-server-downloader/releases?page=1&limit=1'
type Release = {
id: number
}
type Asset = {
browser_download_url: string
}
export async function downloadUpdater(): Promise<void> {
const id = await getLatestReleaseID()
const latestAssets = `https://git.entityseven.com/api/v1/repos/entityseven/rage-server-downloader/releases/${id}/assets?page=1&limit=1`
axios.get<Asset[]>(latestAssets).then(async ({ data }) => {
const downloadURL = data[0].browser_download_url
const file = await axios.get(data[0].browser_download_url, {
responseType: 'arraybuffer',
})
const fileData = Buffer.from(file.data, 'binary')
const fileSplit = downloadURL.split('/')
const fileName = fileSplit[fileSplit.length - 1]
fs.writeFileSync(`./${fileName}`, fileData)
})
}
async function getLatestReleaseID() {
return axios.get<Release[]>(latestReleases).then(({ data }) => data[0].id)
}

View File

@ -1,11 +1,40 @@
import yargs from 'yargs' import c from 'chalk'
import { select } from '@inquirer/prompts'
import create from './commands/create' import { checkForUpdate } from './utils/update'
import { initProject } from './commands/create'
import { downloadUpdater } from './commands/download-updater'
yargs enum Actions {
.usage('<cmd> [args]') INIT_PROJECT = 'INIT_PROJECT',
// .scriptName('rage-fw') UPDATER = 'UPDATER',
// .usage('$0 <cmd> [args]') }
// @ts-ignore
.command(create) ;(async () => {
.help().argv await checkForUpdate()
console.log(
c.blueBright('Rage FW CLI | Powered by Entity Seven Group <3'),
)
const action = await select({
message: c.gray('Select action:'),
choices: [
{
name: 'Initialize new project',
value: Actions.INIT_PROJECT,
description: 'Initialize new project and start develop',
},
{
name: 'Install RAGE:MP updater',
value: Actions.UPDATER,
description:
'Use our custom updater to download and update RAGE:MP server files.',
},
],
loop: true,
})
if (action === Actions.INIT_PROJECT) await initProject()
if (action === Actions.UPDATER) await downloadUpdater()
})()

View File

@ -18,7 +18,7 @@ export async function checkForUpdate(): Promise<void> {
.then(({ data }) => { .then(({ data }) => {
const latestVersion = data[0].name const latestVersion = data[0].name
if (!(latestVersion === version)) if (latestVersion !== `v${version}`)
notifyUserAboutUpdate(latestVersion) notifyUserAboutUpdate(latestVersion)
}) })
.then(() => res()), .then(() => res()),