codizium-cli
Version:
A CLI tool to scaffold Laravel and Node-based modules with ease.
116 lines (93 loc) • 2.77 kB
JavaScript
const fs = require("fs");
const path = require("path");
function toPascalCase(str) {
return str.replace(/(^|-)(\w)/g, (_, __, l) => l.toUpperCase());
}
async function generateClass(options) {
const currentDir = process.cwd();
const basePath = path.resolve(options.path || currentDir);
const pascalName = toPascalCase(options.name);
const pascalModule = toPascalCase(options.module || path.basename(basePath));
// Detect if we’re inside a module by checking for 'src' directory
const isInsideModule = fs.existsSync(path.join(basePath, "src"));
const moduleDir = isInsideModule ? basePath : path.join(basePath, options.module);
// Fail fast if not a module folder
if (!fs.existsSync(path.join(moduleDir, "src"))) {
console.error("❌ Not inside a valid module (missing src/ folder)");
process.exit(1);
}
const fileMap = {
controller: {
dir: "src/Controllers",
file: `${pascalName}Controller.php`,
content: `
namespace Modules\\${pascalModule}\\Controllers;
use Illuminate\\Routing\\Controller;
class ${pascalName}Controller extends Controller {
public function index() {
return view('${options.module.toLowerCase()}::index');
}
}
`
},
model: {
dir: "src/Models",
file: `${pascalName}.php`,
content: `
namespace Modules\\${pascalModule}\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class ${pascalName} extends Model {
//
}
`
},
enum: {
dir: "src/Enums",
file: `${pascalName}.php`,
content: `
namespace Modules\\${pascalModule}\\Enums;
enum ${pascalName}: string {
case EXAMPLE = 'example';
}
`
},
service: {
dir: "src/Services",
file: `${pascalName}Service.php`,
content: `
namespace Modules\\${pascalModule}\\Services;
class ${pascalName}Service {
public function handle() {
//
}
}
`
},
request: {
dir: "src/Requests",
file: `${pascalName}Request.php`,
content: `
namespace Modules\\${pascalModule}\\Requests;
use Illuminate\\Foundation\\Http\\FormRequest;
class ${pascalName}Request extends FormRequest {
public function rules() {
return [
// validation rules
];
}
}
`
}
};
// Validate type
if (!fileMap[options.type]) {
console.error(`❌ Unknown component type: '${options.type}'`);
process.exit(1);
}
const { dir, file, content } = fileMap[options.type];
const fullDir = path.join(moduleDir, dir);
fs.mkdirSync(fullDir, { recursive: true });
fs.writeFileSync(path.join(fullDir, file), content);
console.log(`✅ ${options.type.charAt(0).toUpperCase() + options.type.slice(1)} created: ${path.join(dir, file)}`);
}
module.exports = { generateClass };