UNPKG

codizium-cli

Version:

A CLI tool to scaffold Laravel and Node-based modules with ease.

206 lines (171 loc) • 4.66 kB
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 };