@ereactthohir/cli 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/commands/build.d.ts +4 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +139 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +584 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/generators.d.ts +12 -0
- package/dist/commands/generators.d.ts.map +1 -0
- package/dist/commands/generators.js +180 -0
- package/dist/commands/generators.js.map +1 -0
- package/dist/commands/migrate.d.ts +4 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +83 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/serve.d.ts +2 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +120 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/generators/ModelGenerator.d.ts +23 -0
- package/dist/generators/ModelGenerator.d.ts.map +1 -0
- package/dist/generators/ModelGenerator.js +143 -0
- package/dist/generators/ModelGenerator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.create = create;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const ora_1 = __importDefault(require("ora"));
|
|
12
|
+
async function create(name) {
|
|
13
|
+
console.log(chalk_1.default.blue(`\n🚀 Initializing EreactThohir Project: ${name}`));
|
|
14
|
+
console.log(chalk_1.default.gray(' Powered by KangPCode (Dhafa Nazula Permadi)\n'));
|
|
15
|
+
let answers;
|
|
16
|
+
if (process.env.CI) {
|
|
17
|
+
console.log(chalk_1.default.yellow(' Run in automated CI mode (Skipping prompts)'));
|
|
18
|
+
answers = {
|
|
19
|
+
projectType: 'Fullstack (Mobile + Web)',
|
|
20
|
+
renderingMode: 'Hybrid',
|
|
21
|
+
database: 'sawit.db (default lightweight embedded DB)',
|
|
22
|
+
uiSystem: 'Rice UI (default, official)',
|
|
23
|
+
template: 'Enterprise App Template'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const questions = [
|
|
28
|
+
{
|
|
29
|
+
type: 'list',
|
|
30
|
+
name: 'projectType',
|
|
31
|
+
message: 'What type of app do you want to build?',
|
|
32
|
+
choices: [
|
|
33
|
+
'Mobile Native (Android)',
|
|
34
|
+
'Mobile Native (iOS)',
|
|
35
|
+
'Mobile Native (Android + iOS)',
|
|
36
|
+
'Web App',
|
|
37
|
+
'PWA',
|
|
38
|
+
'Fullstack (Mobile + Web)'
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: 'list',
|
|
43
|
+
name: 'renderingMode',
|
|
44
|
+
message: 'Choose rendering mode:',
|
|
45
|
+
choices: ['SPA', 'SSR', 'Hybrid']
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: 'list',
|
|
49
|
+
name: 'database',
|
|
50
|
+
message: 'Choose database:',
|
|
51
|
+
choices: ['sawit.db (default lightweight embedded DB)', 'MySQL', 'PostgreSQL', 'MongoDB']
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'list',
|
|
55
|
+
name: 'uiSystem',
|
|
56
|
+
message: 'UI Style:',
|
|
57
|
+
choices: ['Rice UI (default, official)']
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'list',
|
|
61
|
+
name: 'template',
|
|
62
|
+
message: 'Choose a starter template:',
|
|
63
|
+
choices: [
|
|
64
|
+
'None (Blank)',
|
|
65
|
+
'Mobile App Starter',
|
|
66
|
+
'Admin Dashboard',
|
|
67
|
+
'Authentication Starter',
|
|
68
|
+
'Enterprise App Template',
|
|
69
|
+
'SaaS Template'
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
answers = await inquirer_1.default.prompt(questions);
|
|
74
|
+
// If web-based project, offer Semouth installation
|
|
75
|
+
if (['Web App', 'PWA', 'Fullstack (Mobile + Web)'].includes(answers.projectType)) {
|
|
76
|
+
const semouthQuestions = [
|
|
77
|
+
{
|
|
78
|
+
type: 'confirm',
|
|
79
|
+
name: 'installSemouth',
|
|
80
|
+
message: 'Would you like to install Semouth (pre-built authentication & scaffolding)?',
|
|
81
|
+
default: true
|
|
82
|
+
}
|
|
83
|
+
];
|
|
84
|
+
const semouthAnswers = await inquirer_1.default.prompt(semouthQuestions);
|
|
85
|
+
answers.installSemouth = semouthAnswers.installSemouth;
|
|
86
|
+
if (answers.installSemouth) {
|
|
87
|
+
const semouthComponentQuestions = [
|
|
88
|
+
{
|
|
89
|
+
type: 'checkbox',
|
|
90
|
+
name: 'semouthComponents',
|
|
91
|
+
message: 'Select Semouth components to install:',
|
|
92
|
+
choices: [
|
|
93
|
+
{ name: 'Authentication (Login, Register, Password Reset)', value: 'auth', checked: true },
|
|
94
|
+
{ name: 'User Management Dashboard', value: 'users', checked: true },
|
|
95
|
+
{ name: 'Role & Permission System', value: 'rbac', checked: false },
|
|
96
|
+
{ name: 'Email Verification', value: 'email-verification', checked: false },
|
|
97
|
+
{ name: 'Two-Factor Authentication', value: '2fa', checked: false }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
const semouthComponentAnswers = await inquirer_1.default.prompt(semouthComponentQuestions);
|
|
102
|
+
answers.semouthComponents = semouthComponentAnswers.semouthComponents;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const spinner = (0, ora_1.default)('Scaffolding project...').start();
|
|
107
|
+
try {
|
|
108
|
+
const projectDir = path_1.default.resolve(process.cwd(), name);
|
|
109
|
+
if (fs_extra_1.default.existsSync(projectDir)) {
|
|
110
|
+
spinner.fail('Directory already exists!');
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
await fs_extra_1.default.ensureDir(projectDir);
|
|
114
|
+
// Define Laravel-like structure
|
|
115
|
+
const structure = [
|
|
116
|
+
'app/Controllers',
|
|
117
|
+
'app/Services',
|
|
118
|
+
'app/Models',
|
|
119
|
+
'app/Providers',
|
|
120
|
+
'app/Middleware',
|
|
121
|
+
'app/Jobs',
|
|
122
|
+
'app/Policies',
|
|
123
|
+
'database/migrations',
|
|
124
|
+
'database/seeders',
|
|
125
|
+
'database/factories',
|
|
126
|
+
'resources/views',
|
|
127
|
+
'resources/rice-ui',
|
|
128
|
+
'resources/assets',
|
|
129
|
+
'routes',
|
|
130
|
+
'config',
|
|
131
|
+
'storage',
|
|
132
|
+
'tests'
|
|
133
|
+
];
|
|
134
|
+
for (const dir of structure) {
|
|
135
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectDir, dir));
|
|
136
|
+
}
|
|
137
|
+
// Write routes/web.ts
|
|
138
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'routes/web.ts'), `import { Route } from '@ereactthohir/core';
|
|
139
|
+
|
|
140
|
+
Route.get('/', (req, res) => {
|
|
141
|
+
return { message: 'Welcome to EreactThohir' };
|
|
142
|
+
});
|
|
143
|
+
`);
|
|
144
|
+
// Write routes/api.ts
|
|
145
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'routes/api.ts'), `import { Route } from '@ereactthohir/core';
|
|
146
|
+
|
|
147
|
+
Route.group({ prefix: '/api' }, () => {
|
|
148
|
+
Route.get('/user', (req, res) => {
|
|
149
|
+
return { name: 'John Doe' };
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
`);
|
|
153
|
+
// Write routes/mobile.ts
|
|
154
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'routes/mobile.ts'), `import { Route } from '@ereactthohir/core';
|
|
155
|
+
|
|
156
|
+
Route.screen('Home', () => {
|
|
157
|
+
// Screen component
|
|
158
|
+
});
|
|
159
|
+
`);
|
|
160
|
+
// Write ereactthohir.config.ts
|
|
161
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'ereactthohir.config.ts'), `export default {
|
|
162
|
+
name: process.env.APP_NAME || '${name}',
|
|
163
|
+
env: process.env.APP_ENV || 'local',
|
|
164
|
+
debug: process.env.APP_DEBUG === 'true',
|
|
165
|
+
url: process.env.APP_URL || 'http://localhost',
|
|
166
|
+
database: {
|
|
167
|
+
driver: process.env.DB_DRIVER || '${answers.database.includes('sawit') ? 'sawit' : answers.database.toLowerCase()}',
|
|
168
|
+
connection: process.env.DB_CONNECTION || 'default'
|
|
169
|
+
},
|
|
170
|
+
template: '${answers.template}'
|
|
171
|
+
};
|
|
172
|
+
`);
|
|
173
|
+
// Write ereact.json marker
|
|
174
|
+
await fs_extra_1.default.writeJSON(path_1.default.join(projectDir, 'ereact.json'), {
|
|
175
|
+
name: name,
|
|
176
|
+
version: '0.0.1',
|
|
177
|
+
created_at: new Date().toISOString()
|
|
178
|
+
}, { spaces: 2 });
|
|
179
|
+
// Write README.md with template info
|
|
180
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'README.md'), `# ${name}
|
|
181
|
+
|
|
182
|
+
This project was created with EreactThohir using the **${answers.template}** template.
|
|
183
|
+
|
|
184
|
+
## Getting Started
|
|
185
|
+
|
|
186
|
+
1. Install dependencies:
|
|
187
|
+
\`\`\`bash
|
|
188
|
+
npm install
|
|
189
|
+
\`\`\`
|
|
190
|
+
|
|
191
|
+
2. Run development server:
|
|
192
|
+
\`\`\`bash
|
|
193
|
+
ereact jalan
|
|
194
|
+
\`\`\`
|
|
195
|
+
`);
|
|
196
|
+
// Write .env
|
|
197
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, '.env'), `APP_NAME=${name}
|
|
198
|
+
APP_ENV=local
|
|
199
|
+
APP_KEY=
|
|
200
|
+
APP_DEBUG=true
|
|
201
|
+
APP_URL=http://localhost
|
|
202
|
+
|
|
203
|
+
DB_CONNECTION=default
|
|
204
|
+
DB_DRIVER=${answers.database.includes('sawit') ? 'sawit' : answers.database.toLowerCase()}
|
|
205
|
+
`);
|
|
206
|
+
// Write .env.example
|
|
207
|
+
await fs_extra_1.default.copy(path_1.default.join(projectDir, '.env'), path_1.default.join(projectDir, '.env.example'));
|
|
208
|
+
// Write config/app.json
|
|
209
|
+
await fs_extra_1.default.writeJSON(path_1.default.join(projectDir, 'config/app.json'), {
|
|
210
|
+
name,
|
|
211
|
+
version: '1.0.0',
|
|
212
|
+
providers: [
|
|
213
|
+
"App\\Providers\\RouteServiceProvider",
|
|
214
|
+
"App\\Providers\\AuthServiceProvider"
|
|
215
|
+
]
|
|
216
|
+
}, { spaces: 2 });
|
|
217
|
+
// Install Semouth if selected
|
|
218
|
+
if (answers.installSemouth) {
|
|
219
|
+
spinner.text = 'Installing Semouth components...';
|
|
220
|
+
await installSemouthComponents(projectDir, answers.semouthComponents);
|
|
221
|
+
}
|
|
222
|
+
// Write package.json
|
|
223
|
+
const dependencies = {
|
|
224
|
+
"@ereactthohir/core": "^1.0.0",
|
|
225
|
+
"@ereactthohir/rice-ui": "^1.0.0",
|
|
226
|
+
"react": "^18.0.0",
|
|
227
|
+
"react-dom": "^18.0.0"
|
|
228
|
+
};
|
|
229
|
+
// Add Semouth dependencies if installed
|
|
230
|
+
if (answers.installSemouth) {
|
|
231
|
+
dependencies["@ereactthohir/semouth"] = "^1.0.0";
|
|
232
|
+
}
|
|
233
|
+
await fs_extra_1.default.writeJSON(path_1.default.join(projectDir, 'package.json'), {
|
|
234
|
+
name,
|
|
235
|
+
version: '0.0.1',
|
|
236
|
+
scripts: {
|
|
237
|
+
"dev": "ereact jalan",
|
|
238
|
+
"build": "ereact build",
|
|
239
|
+
"test": "ereact test"
|
|
240
|
+
},
|
|
241
|
+
dependencies,
|
|
242
|
+
devDependencies: {
|
|
243
|
+
"@ereactthohir/cli": "^1.0.0",
|
|
244
|
+
"typescript": "^5.0.0",
|
|
245
|
+
"@types/react": "^18.0.0",
|
|
246
|
+
"@types/react-dom": "^18.0.0"
|
|
247
|
+
}
|
|
248
|
+
}, { spaces: 2 });
|
|
249
|
+
spinner.succeed(chalk_1.default.green('Project created successfully!'));
|
|
250
|
+
console.log(chalk_1.default.yellow('\nNext steps:'));
|
|
251
|
+
console.log(` cd ${name}`);
|
|
252
|
+
console.log(' npm install');
|
|
253
|
+
console.log(' ereact jalan\n');
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
spinner.fail('Failed to create project.');
|
|
257
|
+
console.error(error);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Install Semouth components (auth scaffolding similar to Laravel Breeze)
|
|
262
|
+
*/
|
|
263
|
+
async function installSemouthComponents(projectDir, components) {
|
|
264
|
+
const semouthDir = path_1.default.join(projectDir, 'app/Semouth');
|
|
265
|
+
await fs_extra_1.default.ensureDir(semouthDir);
|
|
266
|
+
// Install Authentication
|
|
267
|
+
if (components.includes('auth')) {
|
|
268
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectDir, 'app/Controllers/Auth'));
|
|
269
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/Controllers/Auth/LoginController.ts'), `import { Controller } from '@ereactthohir/core';
|
|
270
|
+
|
|
271
|
+
export class LoginController extends Controller {
|
|
272
|
+
/**
|
|
273
|
+
* Show the login form
|
|
274
|
+
*/
|
|
275
|
+
public showLoginForm(req: any, res: any) {
|
|
276
|
+
return res.view('auth.login');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Handle login request
|
|
281
|
+
*/
|
|
282
|
+
public async store(req: any, res: any) {
|
|
283
|
+
const { email, password } = req.only('email', 'password');
|
|
284
|
+
|
|
285
|
+
// Validate credentials
|
|
286
|
+
try {
|
|
287
|
+
const user = await req.app.make('auth').attempt(email, password);
|
|
288
|
+
req.session.set('user_id', user.id);
|
|
289
|
+
return res.redirect('/');
|
|
290
|
+
} catch (error) {
|
|
291
|
+
return res.back().withErrors({ email: 'Invalid credentials' });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Handle logout
|
|
297
|
+
*/
|
|
298
|
+
public logout(req: any, res: any) {
|
|
299
|
+
req.session.destroy();
|
|
300
|
+
return res.redirect('/login');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
`);
|
|
304
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/Controllers/Auth/RegisterController.ts'), `import { Controller } from '@ereactthohir/core';
|
|
305
|
+
|
|
306
|
+
export class RegisterController extends Controller {
|
|
307
|
+
/**
|
|
308
|
+
* Show the registration form
|
|
309
|
+
*/
|
|
310
|
+
public showRegistrationForm(req: any, res: any) {
|
|
311
|
+
return res.view('auth.register');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Handle registration request
|
|
316
|
+
*/
|
|
317
|
+
public async store(req: any, res: any) {
|
|
318
|
+
const { name, email, password, password_confirmation } = req.all();
|
|
319
|
+
|
|
320
|
+
// Validate input
|
|
321
|
+
await req.validate({
|
|
322
|
+
name: 'required|string|max:255',
|
|
323
|
+
email: 'required|email|unique:users',
|
|
324
|
+
password: 'required|min:8|confirmed'
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
const user = await req.app.make('auth').create({
|
|
328
|
+
name, email, password
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
req.session.set('user_id', user.id);
|
|
332
|
+
return res.redirect('/');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
`);
|
|
336
|
+
// Add auth routes
|
|
337
|
+
const authRoutesContent = `import { Route } from '@ereactthohir/core';
|
|
338
|
+
import { LoginController } from '../Controllers/Auth/LoginController';
|
|
339
|
+
import { RegisterController } from '../Controllers/Auth/RegisterController';
|
|
340
|
+
|
|
341
|
+
Route.group({ prefix: '/auth' }, () => {
|
|
342
|
+
Route.get('/login', [LoginController, 'showLoginForm']).name('login');
|
|
343
|
+
Route.post('/login', [LoginController, 'store']).name('login.store');
|
|
344
|
+
Route.post('/logout', [LoginController, 'logout']).name('logout');
|
|
345
|
+
|
|
346
|
+
Route.get('/register', [RegisterController, 'showRegistrationForm']).name('register');
|
|
347
|
+
Route.post('/register', [RegisterController, 'store']).name('register.store');
|
|
348
|
+
});
|
|
349
|
+
`;
|
|
350
|
+
const webRoutesPath = path_1.default.join(projectDir, 'routes/web.ts');
|
|
351
|
+
const existingRoutes = await fs_extra_1.default.readFile(webRoutesPath, 'utf-8');
|
|
352
|
+
await fs_extra_1.default.writeFile(webRoutesPath, existingRoutes + '\n' + authRoutesContent);
|
|
353
|
+
}
|
|
354
|
+
// Install User Management
|
|
355
|
+
if (components.includes('users')) {
|
|
356
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/Controllers/UserController.ts'), `import { Controller } from '@ereactthohir/core';
|
|
357
|
+
|
|
358
|
+
export class UserController extends Controller {
|
|
359
|
+
/**
|
|
360
|
+
* Display all users
|
|
361
|
+
*/
|
|
362
|
+
public async index(req: any, res: any) {
|
|
363
|
+
const users = await req.app.make('db').table('users').paginate(15);
|
|
364
|
+
return res.json(users);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Display user profile
|
|
369
|
+
*/
|
|
370
|
+
public async show(req: any, res: any) {
|
|
371
|
+
const user = await req.app.make('db').table('users')
|
|
372
|
+
.where('id', req.param('id'))
|
|
373
|
+
.first();
|
|
374
|
+
|
|
375
|
+
if (!user) {
|
|
376
|
+
return res.status(404).json({ error: 'User not found' });
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return res.json(user);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Update user
|
|
384
|
+
*/
|
|
385
|
+
public async update(req: any, res: any) {
|
|
386
|
+
const { name, email } = req.only('name', 'email');
|
|
387
|
+
|
|
388
|
+
await req.app.make('db').table('users')
|
|
389
|
+
.where('id', req.param('id'))
|
|
390
|
+
.update({ name, email });
|
|
391
|
+
|
|
392
|
+
return res.success('User updated successfully');
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Delete user
|
|
397
|
+
*/
|
|
398
|
+
public async destroy(req: any, res: any) {
|
|
399
|
+
await req.app.make('db').table('users')
|
|
400
|
+
.where('id', req.param('id'))
|
|
401
|
+
.delete();
|
|
402
|
+
|
|
403
|
+
return res.success('User deleted successfully');
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
`);
|
|
407
|
+
}
|
|
408
|
+
// Install RBAC (Role & Permission System)
|
|
409
|
+
if (components.includes('rbac')) {
|
|
410
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(projectDir, 'app/RBAC'));
|
|
411
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/RBAC/Role.ts'), `import { Model } from '@ereactthohir/core';
|
|
412
|
+
|
|
413
|
+
export class Role extends Model {
|
|
414
|
+
protected table = 'roles';
|
|
415
|
+
protected fillable = ['name', 'description', 'slug'];
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Get permissions for this role
|
|
419
|
+
*/
|
|
420
|
+
public permissions() {
|
|
421
|
+
return this.belongsToMany('Permission', 'role_permissions');
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Assign permission to role
|
|
426
|
+
*/
|
|
427
|
+
public givePermissionTo(permission: string) {
|
|
428
|
+
// Implementation
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
`);
|
|
432
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/RBAC/Permission.ts'), `import { Model } from '@ereactthohir/core';
|
|
433
|
+
|
|
434
|
+
export class Permission extends Model {
|
|
435
|
+
protected table = 'permissions';
|
|
436
|
+
protected fillable = ['name', 'description', 'slug'];
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Get roles for this permission
|
|
440
|
+
*/
|
|
441
|
+
public roles() {
|
|
442
|
+
return this.belongsToMany('Role', 'role_permissions');
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
`);
|
|
446
|
+
// Add RBAC migration stub info
|
|
447
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'database/migrations/RBAC_SETUP.txt'), `
|
|
448
|
+
# RBAC Setup Migrations
|
|
449
|
+
|
|
450
|
+
Run these migrations to set up the role and permission system:
|
|
451
|
+
|
|
452
|
+
1. Create roles table
|
|
453
|
+
2. Create permissions table
|
|
454
|
+
3. Create role_permissions pivot table
|
|
455
|
+
4. Seed default roles (Admin, User, Moderator, etc.)
|
|
456
|
+
5. Seed default permissions (create, read, update, delete, etc.)
|
|
457
|
+
|
|
458
|
+
Use: ereact migrate
|
|
459
|
+
`);
|
|
460
|
+
}
|
|
461
|
+
// Install Email Verification
|
|
462
|
+
if (components.includes('email-verification')) {
|
|
463
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/Middleware/VerifyEmailMiddleware.ts'), `import { Middleware } from '@ereactthohir/core';
|
|
464
|
+
|
|
465
|
+
export class VerifyEmailMiddleware implements Middleware {
|
|
466
|
+
public async handle(req: any, res: any, next: () => Promise<void>): Promise<void> {
|
|
467
|
+
const user = req.getAuthenticatedUser();
|
|
468
|
+
|
|
469
|
+
if (user && !user.email_verified_at) {
|
|
470
|
+
return res.redirect('/email/verify');
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
await next();
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
`);
|
|
477
|
+
}
|
|
478
|
+
// Install 2FA (Two-Factor Authentication)
|
|
479
|
+
if (components.includes('2fa')) {
|
|
480
|
+
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'app/Services/TwoFactorService.ts'), `import crypto from 'crypto';
|
|
481
|
+
|
|
482
|
+
export class TwoFactorService {
|
|
483
|
+
/**
|
|
484
|
+
* Generate 2FA secret
|
|
485
|
+
*/
|
|
486
|
+
public generateSecret(): string {
|
|
487
|
+
return crypto.randomBytes(32).toString('hex');
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Generate 2FA code
|
|
492
|
+
*/
|
|
493
|
+
public generateCode(secret: string): string {
|
|
494
|
+
// TOTP implementation
|
|
495
|
+
const counter = Math.floor(Date.now() / 30000);
|
|
496
|
+
return crypto.createHmac('sha1', Buffer.from(secret, 'hex'))
|
|
497
|
+
.update(counter.toString())
|
|
498
|
+
.digest('hex')
|
|
499
|
+
.slice(0, 6);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Verify 2FA code
|
|
504
|
+
*/
|
|
505
|
+
public verifyCode(secret: string, code: string, window: number = 1): boolean {
|
|
506
|
+
const counter = Math.floor(Date.now() / 30000);
|
|
507
|
+
|
|
508
|
+
for (let i = -window; i <= window; i++) {
|
|
509
|
+
const c = counter + i;
|
|
510
|
+
const expected = crypto.createHmac('sha1', Buffer.from(secret, 'hex'))
|
|
511
|
+
.update(c.toString())
|
|
512
|
+
.digest('hex')
|
|
513
|
+
.slice(0, 6);
|
|
514
|
+
|
|
515
|
+
if (expected === code) {
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return false;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
`);
|
|
524
|
+
}
|
|
525
|
+
// Create Semouth documentation
|
|
526
|
+
await fs_extra_1.default.writeFile(path_1.default.join(semouthDir, 'README.md'), `# Semouth - EreactThohir Authentication & Scaffolding
|
|
527
|
+
|
|
528
|
+
Semouth is EreactThohir's built-in authentication and application scaffolding, similar to Laravel's Breeze.
|
|
529
|
+
|
|
530
|
+
## Installed Components
|
|
531
|
+
|
|
532
|
+
${components.map(c => `- ${c}`).join('\n')}
|
|
533
|
+
|
|
534
|
+
## Quick Start
|
|
535
|
+
|
|
536
|
+
### Authentication
|
|
537
|
+
After installation, Benzo provides ready-to-use authentication controllers:
|
|
538
|
+
|
|
539
|
+
\`\`\`typescript
|
|
540
|
+
// routes/web.ts
|
|
541
|
+
import { LoginController } from '../app/Controllers/Auth/LoginController';
|
|
542
|
+
|
|
543
|
+
Route.post('/login', [LoginController, 'store']);
|
|
544
|
+
\`\`\`
|
|
545
|
+
|
|
546
|
+
### User Management
|
|
547
|
+
Access the user management dashboard at \`/users\`.
|
|
548
|
+
|
|
549
|
+
### RBAC (if installed)
|
|
550
|
+
Manage roles and permissions through the admin interface.
|
|
551
|
+
|
|
552
|
+
\`\`\`typescript
|
|
553
|
+
import { Role } from '../app/RBAC/Role';
|
|
554
|
+
|
|
555
|
+
const adminRole = await Role.where('slug', 'admin').first();
|
|
556
|
+
adminRole.givePermissionTo('manage-users');
|
|
557
|
+
\`\`\`
|
|
558
|
+
|
|
559
|
+
### Email Verification (if installed)
|
|
560
|
+
Users must verify their email before accessing the application:
|
|
561
|
+
|
|
562
|
+
\`\`\`typescript
|
|
563
|
+
Route.middleware([VerifyEmailMiddleware]).group(() => {
|
|
564
|
+
// Protected routes
|
|
565
|
+
});
|
|
566
|
+
\`\`\`
|
|
567
|
+
|
|
568
|
+
### Two-Factor Authentication (if installed)
|
|
569
|
+
Enable 2FA for enhanced security:
|
|
570
|
+
|
|
571
|
+
\`\`\`typescript
|
|
572
|
+
import { TwoFactorService } from '../app/Services/TwoFactorService';
|
|
573
|
+
|
|
574
|
+
const 2fa = new TwoFactorService();
|
|
575
|
+
const secret = 2fa.generateSecret();
|
|
576
|
+
const code = 2fa.generateCode(secret);
|
|
577
|
+
\`\`\`
|
|
578
|
+
|
|
579
|
+
## Documentation
|
|
580
|
+
|
|
581
|
+
For more information, refer to the [Security Guide](../../docs/SECURITY.md).
|
|
582
|
+
`);
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function makeController(name: string): Promise<void>;
|
|
2
|
+
export declare function makeModel(name: string): Promise<void>;
|
|
3
|
+
export declare function makeService(name: string): Promise<void>;
|
|
4
|
+
export declare function makeScreen(name: string): Promise<void>;
|
|
5
|
+
export declare function makeComponent(name: string): Promise<void>;
|
|
6
|
+
export declare function makeMigration(name: string): Promise<void>;
|
|
7
|
+
export declare function makeSeeder(name: string): Promise<void>;
|
|
8
|
+
export declare function makeProvider(name: string): Promise<void>;
|
|
9
|
+
export declare function makeMiddleware(name: string): Promise<void>;
|
|
10
|
+
export declare function makeJob(name: string): Promise<void>;
|
|
11
|
+
export declare function makePolicy(name: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/commands/generators.ts"],"names":[],"mappings":"AA6BA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,iBAYhD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,iBAa3C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,iBAU7C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,iBAe5C;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,iBAgB/C;AACD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,iBAe/C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,iBAU5C;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,iBAc9C;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,iBAShD;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,iBAQzC;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,iBAQ5C"}
|