@albinberisha/codex-cli
Version:
Codex cli to scaffold plugins with Node
83 lines (68 loc) • 2.17 kB
JavaScript
import chalk from 'chalk'
import fs from 'fs'
import ncp from 'ncp'
import path from 'path'
import { promisify } from 'util'
import execa from 'execa'
import Listr from 'listr'
import { createSpinner } from 'nanospinner';
const access = promisify(fs.access);
const copy = promisify(ncp);
async function copyTemplateFiles(options) {
return copy(options.templateDirectory, options.targetDirectory, {
clobber: false,
});
}
async function initGit(options) {
const result = await execa('git', ['init'], {
cwd: options.targetDirectory,
});
if (result.failed) {
return Promise.reject(new Error('Failed to initialize Git'));
}
return;
}
export async function createPlugin(options) {
options = {
...options,
targetDirectory: options.targetDirectory || process.cwd(),
};
let currentFileUrl = import.meta.url;
currentFileUrl = currentFileUrl.replace('file:///', '');
const templateDir = path.resolve(
currentFileUrl,
'../../templates',
options.template
);
options.templateDirectory = templateDir;
try {
await access(templateDir, fs.constants.R_OK);
} catch (error) {
console.log(error);
process.exit(1);
}
const tasks = new Listr([
{
title: `Creating ${options.name}`,
task: () => copyTemplateFiles(options),
},
{
title: 'Copy project files',
task: () => copyTemplateFiles(options),
},
{
title: 'Initialize Git',
task: () => initGit(options),
enabled: () => options.git
}
])
await tasks.run();
const spinner = createSpinner('Creating plugin template... \n').start();
await new Promise(r => setTimeout(r, 2000));
spinner.success({
text: "Plugin was created successfully. \n"
})
console.log('%s Project is ready. \n', chalk.bgGreen.bold(' DONE '));
console.log(chalk.bgGreen.bold(` Thank you for using codex-cli! \n`));
console.log(options.name);
}