backend-smith
Version:
A CLI tool for automating backend component generation in Express.js, including modules, schemas, routes, services, and more.
153 lines (127 loc) • 4.54 kB
text/typescript
#! /usr/bin/env node
import { createFolderHeplder } from "./helper/createFolderHelper";
import { formatFieldArgsHepler } from "./helper/formatFieldArgsHepler";
import { createBase } from "./lib/createBase";
import { createController } from "./lib/createController";
import { createDto } from "./lib/createDto";
import { createModule } from "./lib/createModule";
import { createRoute } from "./lib/createRoute";
import { createSchema } from "./lib/createSchema";
import { createService } from "./lib/createService";
import { createValidation } from "./lib/createValidation";
const { Command } = require("commander");
const program = new Command();
program
.name("backend-smith")
.description("CLI tool to generate CRUD components")
.version("1.0.5");
// Base create
program
.command("create <name>")
.description("Create a base component")
.action((name: string) => {
createBase(name);
});
// Module
program
.command("create:module <name> [fields...]")
.description("Create a module with fields")
.action((name: string, fieldsArgs: string[]) => {
const fields = formatFieldArgsHepler(fieldsArgs);
createFolderHeplder(name);
createModule(name, fields);
});
// Schema
program
.command("create:schema <name> [fields...]")
.description("Create schema file with fields")
.action((name: string, fieldsArgs: string[]) => {
const fields = formatFieldArgsHepler(fieldsArgs);
createFolderHeplder(name);
createSchema(name, fields);
});
// Route
program
.command("create:route <name>")
.description("Create a route file")
.action((name: string) => {
createFolderHeplder(name);
createRoute(name);
});
// Service
program
.command("create:service <name>")
.description("Create a service file")
.action((name: string) => {
createFolderHeplder(name);
createService(name);
});
// Controller
program
.command("create:controller <name>")
.description("Create a controller file")
.action((name: string) => {
createFolderHeplder(name);
createController(name);
});
// Validation
program
.command("create:validation <name> [fields...]")
.description("Create a validation schema")
.action((name: string, fieldsArgs: string[]) => {
const fields = formatFieldArgsHepler(fieldsArgs);
createFolderHeplder(name);
createValidation(name, fields);
});
// DTO
program
.command("create:dto <name> [fields...]")
.description("Create a DTO file")
.action((name: string, fieldsArgs: string[]) => {
const fields = formatFieldArgsHepler(fieldsArgs);
createFolderHeplder(name);
createDto(name, fields);
});
program.addHelpText(
"afterAll",
`
Examples:
# Base structure
$ bs create my-app
→ Creates a base project structure
# Full module with required fields, enums, and types
$ bs create:module user *username:String age:Number *email:String *role:USER|ADMIN
→ Generates full user module with schema, controller, service, etc.
# Schema only with required fields and enums
$ bs create:schema user *username:String *email:String age:Number *role:USER|ADMIN
# Nested object inside schema
$ bs create:schema user profile:{bio:String website:String}
# Array of primitives
$ bs create:schema user tags:[String]
# Array of nested objects
$ bs create:schema user addresses:[{street:String city:String zip:String}]
# Create a route
$ bs create:route user
# Create a service
$ bs create:service user
# Create a controller
$ bs create:controller user
# Create validation logic
$ bs create:validation user *username:String *email:String role:USER|ADMIN
# Create a DTO
$ bs create:dto user *username:String age:Number profile:{bio:String website:String}
Field Notation:
* → Marks a field as required
Type → Types can be String, Number, Boolean, Date, etc.
Enum → Use pipe (|) to separate values: role:USER|ADMIN
Nested Obj → Wrap with {}: profile:{bio:String website:String}
Array → Wrap with []: tags:[String]
Array + Nest → Wrap with [{}]: addresses:[{street:String city:String}]
⚠️ Note:
When using special characters like [] or {} in the terminal,
make sure to escape them or wrap the entire field in quotes.
Example:
$ bs create:schema user "tags:[String]" "profile:{bio:String website:String}"
`
);
program.parse(process.argv);