@ideascol/cli-maker
Version:
A simple library to help create CLIs
223 lines (222 loc) • 9.14 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeProject = initializeProject;
exports.createProjectStructure = createProjectStructure;
exports.createGitIgnore = createGitIgnore;
exports.generateIndexTs = generateIndexTs;
exports.generateGreetExample = generateGreetExample;
exports.generateLibIndex = generateLibIndex;
exports.generateBinTs = generateBinTs;
exports.generateCommandExample = generateCommandExample;
exports.createFileWithDirectories = createFileWithDirectories;
exports.generateGithubAction = generateGithubAction;
exports.createTsConfigFiles = createTsConfigFiles;
exports.createBinFile = createBinFile;
exports.createReadmeFile = createReadmeFile;
exports.createCliTestFile = createCliTestFile;
exports.createTestLibFile = createTestLibFile;
exports.initializeGit = initializeGit;
exports.isFolderEmpty = isFolderEmpty;
exports.createNewFolder = createNewFolder;
exports.moveToFolder = moveToFolder;
const node_child_process_1 = require("node:child_process");
const node_fs_1 = require("node:fs");
const templates = __importStar(require("../templates"));
const test_templates = __importStar(require("../test_templates"));
async function initializeProject(packageManager = 'npm') {
console.log('Generating base project...');
const initCommand = packageManager === 'bun' ? 'bun init' : 'npm init -y';
(0, node_child_process_1.execSync)(initCommand, { stdio: 'inherit' });
}
async function createProjectStructure() {
console.log('Creating project structure...');
try {
(0, node_child_process_1.execSync)('mkdir -p src/commands src/utils src/tests', { stdio: 'inherit' });
(0, node_child_process_1.execSync)('touch src/index.ts', { stdio: 'inherit' });
(0, node_child_process_1.execSync)('mkdir -p dist', { stdio: 'inherit' });
console.log('✅ Project structure created successfully!');
}
catch (error) {
if (error instanceof Error) {
console.error('❌ Error creating project structure:', error.message);
}
}
}
async function createGitIgnore() {
console.log('Creating .gitignore...');
(0, node_child_process_1.execSync)('echo "node_modules/\ndist/\n*.log" > .gitignore', { stdio: 'inherit' });
}
async function generateIndexTs(cliName, cliDescription) {
let result = templates.templateIndex;
try {
await node_fs_1.promises.writeFile('src/index.ts', result);
console.log('index.ts has been generated!');
}
catch (err) {
console.error('Failed to generate index.ts:', err);
}
}
async function generateGreetExample() {
try {
await createFileWithDirectories('src/lib/greet.ts', templates.templateGreet);
console.log('greet.ts has been generated!');
}
catch (err) {
console.error('Failed to generate greet.ts:', err);
}
}
async function generateLibIndex() {
const result = `export { Greet } from './greet';`;
try {
await createFileWithDirectories('src/lib/index.ts', result);
console.log('index.ts has been generated!');
}
catch (err) {
console.error('Failed to generate index.ts:', err);
}
}
async function generateBinTs(cliName, cliDescription) {
let result = templates.template.replace('{{cliName}}', cliName).replace('{{cliDescription}}', cliDescription);
try {
await node_fs_1.promises.writeFile('src/cli.ts', result);
console.log('index.ts has been generated!');
}
catch (err) {
console.error('Failed to generate index.ts:', err);
}
}
async function generateCommandExample() {
try {
await node_fs_1.promises.writeFile('src/commands/greetCommand.ts', templates.templateCommand);
console.log('greetCommand.ts has been generated!');
}
catch (err) {
console.error('Failed to generate greetCommand.ts:', err);
}
}
async function createFileWithDirectories(path, data) {
const directories = path.substring(0, path.lastIndexOf('/'));
await node_fs_1.promises.mkdir(directories, { recursive: true });
await node_fs_1.promises.writeFile(path, data);
}
async function generateGithubAction(package_manager = 'npm') {
try {
const template = package_manager === 'bun' ? templates.githubactionBunTemplate : templates.githubactionNpmTemplate;
await createFileWithDirectories('.github/workflows/publish.yml', template);
console.log('github action has been generated!');
}
catch (err) {
console.error('Failed to generate github action:', err);
}
}
async function createTsConfigFiles() {
try {
await node_fs_1.promises.writeFile('tsconfig.base.json', templates.tsconfigBaseTemplate);
await node_fs_1.promises.writeFile('tsconfig.json', templates.tsconfigTemplate);
await node_fs_1.promises.writeFile('tsconfig.test.json', templates.tsconfigTestTemplate);
console.log('tsconfig.base.json, tsconfig.json and tsconfig.test.json have been generated!');
}
catch (err) {
console.error('Failed to generate tsconfig files:', err);
}
}
async function createBinFile() {
try {
await createFileWithDirectories('src/bin/cli.ts', templates.templateBin);
console.log('bin/cli.ts has been generated!');
}
catch (err) {
console.error('Failed to generate bin/cli.ts:', err);
}
}
async function createReadmeFile(cliName, cliDescription) {
const binName = cliName.split('/').pop() || cliName;
const result = templates.templateReadme.replace(/{{cliName}}/g, cliName).replace(/{{cliDescription}}/g, cliDescription).replace(/{{binName}}/g, binName);
try {
await node_fs_1.promises.writeFile('README.md', result);
console.log('README.md has been generated!');
}
catch (err) {
console.error('Failed to generate README.md:', err);
}
}
async function createCliTestFile(cliName, cliDescription, packageManager = 'npm') {
const template = packageManager === 'bun' ? test_templates.testCliBun : test_templates.testCliNpm;
const result = template.replace(/{{cliName}}/g, cliName).replace(/{{cliDescription}}/g, cliDescription);
try {
await createFileWithDirectories('src/tests/cli/cli.test.ts', result);
console.log('cli.test.ts has been generated!');
}
catch (err) {
console.error('Failed to generate cli.test.ts:', err);
}
}
async function createTestLibFile(packageManager = 'npm') {
try {
const template = packageManager === 'bun' ? test_templates.testLibBun : test_templates.testLibNpm;
await createFileWithDirectories('src/tests/lib/lib.test.ts', template);
console.log('lib.test.ts has been generated!');
}
catch (err) {
console.error('Failed to generate lib.test.ts:', err);
}
}
async function initializeGit() {
try {
console.log('Initializing git repository...');
(0, node_child_process_1.execSync)('git init', { stdio: 'inherit' });
(0, node_child_process_1.execSync)('git add .', { stdio: 'inherit' });
(0, node_child_process_1.execSync)('git commit -m "Initial commit"', { stdio: 'inherit' });
console.log('Git repository initialized and first commit made.');
}
catch (err) {
console.error('Failed to initialize git:', err);
}
}
function isFolderEmpty() {
const files = (0, node_fs_1.readdirSync)('.');
return files.length === 0;
}
function createNewFolder(name) {
const currentDir = process.cwd();
const newFolderPath = `${currentDir}/${name}`;
(0, node_fs_1.mkdirSync)(newFolderPath, { recursive: true });
}
function moveToFolder(name) {
const currentDir = process.cwd();
const newFolderPath = `${currentDir}/${name}`;
process.chdir(newFolderPath);
}