codizium-cli
Version:
A CLI tool to scaffold Laravel and Node-based modules with ease.
206 lines (171 loc) ⢠4.66 kB
JavaScript
const fs = require("fs");
const path = require("path");
const chalk = require("chalk");
function toPascalCase(str) {
console.log(str)
return str.replace(/(^|-)(\w)/g, (_, __, letter) => letter.toUpperCase());
}
function lowercase(str) {
return str.toLowerCase();
}
function generateModule(options) {
const extras = (options.extras || "")
.split(",")
.map((i) => i.trim().toLowerCase());
const { name: moduleName, namespace, path: basePath } = options;
const pascalCase = toPascalCase(moduleName);
const moduleNamespace = `${namespace}\\${pascalCase}`;
const moduleDir = path.join(basePath, moduleName);
const workspace = lowercase(namespace);
console.log(chalk.yellow(`\nš¦ Creating module: ${chalk.bold(pascalCase)}`));
console.log(chalk.gray(`š Directory: ${moduleDir}`));
console.log(chalk.gray(`š Namespace: ${moduleNamespace}`));
// Directory structure
const subdirs = [
"config",
"database/migrations",
"database/seeders",
"database/factories",
"resources/views",
"resources/lang",
"routes",
"src",
];
const srcSubdirs = [
"Console",
"Controllers",
"Enums",
"Events",
"Facades",
"Interfaces",
"Jobs",
"Listeners",
"Mail",
"Managers",
"Middlewares",
"Models",
"Notifications",
"Policies",
"Providers",
"Requests",
"Resources",
"Rules",
"Scopes",
"Services",
"Support",
"Traits",
"Helpers",
];
[...subdirs, ...srcSubdirs.map((d) => `src/${d}`)].forEach((dir) =>
fs.mkdirSync(path.join(moduleDir, dir), { recursive: true })
);
// composer.json
const composer = {
name: `${workspace}/${moduleName}`,
description: `${moduleName} generated by codizium-cli`,
type: "library",
autoload: {
"psr-4": {
[`${moduleNamespace}\\`]: "src/",
},
},
extra: {
laravel: {
providers: [
`${moduleNamespace}\\Providers\\${pascalCase}ServiceProvider`,
],
aliases: {
[pascalCase]: `${moduleNamespace}\\Facades\\${pascalCase}`,
},
},
},
};
fs.writeFileSync(
path.join(moduleDir, "composer.json"),
JSON.stringify(composer, null, 2)
);
// routes/web.php
fs.writeFileSync(path.join(moduleDir, "routes/web.php"), "");
// Main class
fs.writeFileSync(
path.join(moduleDir, `src/${pascalCase}.php`),
`<?php
namespace ${moduleNamespace};
class ${pascalCase} {
public function ping() {
return "${moduleName} installed";
}
}
`
);
// Facade
fs.writeFileSync(
path.join(moduleDir, `src/Facades/${pascalCase}.php`),
`<?php
namespace ${moduleNamespace}\\Facades;
use Illuminate\\Support\\Facades\\Facade;
class ${pascalCase} extends Facade {
protected static function getFacadeAccessor() {
return "${moduleName}";
}
}
`
);
// Service Provider
fs.writeFileSync(
path.join(moduleDir, `src/Providers/${pascalCase}ServiceProvider.php`),
`<?php
namespace ${moduleNamespace}\\Providers;
use Illuminate\\Support\\ServiceProvider;
use ${moduleNamespace}\\${pascalCase};
class ${pascalCase}ServiceProvider extends ServiceProvider {
public function register() {
\$this->app->bind("${moduleName}", function () {
return new ${pascalCase};
});
}
public function boot() {
\$this->loadRoutesFrom(__DIR__.'/../../routes/web.php');
\$this->loadViewsFrom(__DIR__.'/../../resources/views', '${moduleName}');
\$this->loadMigrationsFrom(__DIR__.'/../../database/migrations');
}
}
`
);
if (extras.includes("controller")) {
fs.writeFileSync(
path.join(moduleDir, "src/Controllers/" + pascalCase + "Controller.php"),
`<?php
namespace ${moduleNamespace}\\Controllers;
use Illuminate\\Routing\\Controller;
class ${pascalCase}Controller extends Controller {
public function index() {
return view('${moduleName}::index');
}
}
`
);
}
if (extras.includes("model")) {
fs.writeFileSync(
path.join(moduleDir, "src/Models/" + pascalCase + ".php"),
`<?php
namespace ${moduleNamespace}\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class ${pascalCase} extends Model {
// Fillable, relations, etc.
}
`
);
}
if (extras.includes("view")) {
fs.writeFileSync(
path.join(moduleDir, "resources/views/index.blade.php"),
`<h1>${pascalCase} Module Loaded</h1>`
);
}
console.log(
chalk.green(`\nā
Module ${pascalCase} scaffolded successfully!\n`)
);
}
module.exports = { generateModule };