@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,180 @@
|
|
|
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.makeController = makeController;
|
|
7
|
+
exports.makeModel = makeModel;
|
|
8
|
+
exports.makeService = makeService;
|
|
9
|
+
exports.makeScreen = makeScreen;
|
|
10
|
+
exports.makeComponent = makeComponent;
|
|
11
|
+
exports.makeMigration = makeMigration;
|
|
12
|
+
exports.makeSeeder = makeSeeder;
|
|
13
|
+
exports.makeProvider = makeProvider;
|
|
14
|
+
exports.makeMiddleware = makeMiddleware;
|
|
15
|
+
exports.makeJob = makeJob;
|
|
16
|
+
exports.makePolicy = makePolicy;
|
|
17
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
20
|
+
const ora_1 = __importDefault(require("ora"));
|
|
21
|
+
async function generateFile(type, name, template, folder) {
|
|
22
|
+
const spinner = (0, ora_1.default)(`Creating ${type}: ${name}...`).start();
|
|
23
|
+
const projectRoot = process.cwd();
|
|
24
|
+
// Check if we are inside an EreactThohir project
|
|
25
|
+
if (!fs_extra_1.default.existsSync(path_1.default.join(projectRoot, 'ereact.json'))) {
|
|
26
|
+
spinner.fail(chalk_1.default.red('Error: You are not in an EreactThohir project root.'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const targetDir = path_1.default.join(projectRoot, folder);
|
|
30
|
+
const targetPath = path_1.default.join(targetDir, `${name}.ts`);
|
|
31
|
+
if (fs_extra_1.default.existsSync(targetPath)) {
|
|
32
|
+
spinner.fail(chalk_1.default.yellow(`Warning: ${type} ${name} already exists.`));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await fs_extra_1.default.ensureDir(targetDir);
|
|
36
|
+
await fs_extra_1.default.writeFile(targetPath, template);
|
|
37
|
+
spinner.succeed(chalk_1.default.green(`${type} created: ${path_1.default.relative(projectRoot, targetPath)}`));
|
|
38
|
+
}
|
|
39
|
+
async function makeController(name) {
|
|
40
|
+
const template = `import { Controller } from '@ereactthohir/core';
|
|
41
|
+
|
|
42
|
+
export default class ${name} extends Controller {
|
|
43
|
+
public async index() {
|
|
44
|
+
return {
|
|
45
|
+
message: 'Hello from ${name}'
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
await generateFile('Controller', name, template, 'app/Controllers');
|
|
51
|
+
}
|
|
52
|
+
async function makeModel(name) {
|
|
53
|
+
const template = `import { Model } from '@ereactthohir/core';
|
|
54
|
+
|
|
55
|
+
export default class ${name} extends Model {
|
|
56
|
+
static table = '${name.toLowerCase()}s';
|
|
57
|
+
|
|
58
|
+
// Define properties
|
|
59
|
+
public id!: number;
|
|
60
|
+
public created_at!: Date;
|
|
61
|
+
public updated_at!: Date;
|
|
62
|
+
}
|
|
63
|
+
`;
|
|
64
|
+
await generateFile('Model', name, template, 'app/Models');
|
|
65
|
+
}
|
|
66
|
+
async function makeService(name) {
|
|
67
|
+
const template = `import { Service } from '@ereactthohir/core';
|
|
68
|
+
|
|
69
|
+
export default class ${name} extends Service {
|
|
70
|
+
public async execute() {
|
|
71
|
+
// Logic here
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
await generateFile('Service', name, template, 'app/Services');
|
|
76
|
+
}
|
|
77
|
+
async function makeScreen(name) {
|
|
78
|
+
const template = `import React from 'react';
|
|
79
|
+
import { View, Text } from 'react-native';
|
|
80
|
+
import { Button } from '@ereactthohir/rice-ui';
|
|
81
|
+
|
|
82
|
+
export default function ${name}() {
|
|
83
|
+
return (
|
|
84
|
+
<View className="flex-1 items-center justify-center bg-white">
|
|
85
|
+
<Text className="text-2xl font-bold">${name} Screen</Text>
|
|
86
|
+
<Button label="Click Me" onClick={() => console.log('Hello')} />
|
|
87
|
+
</View>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
await generateFile('Screen', name, template, 'resources/views');
|
|
92
|
+
}
|
|
93
|
+
async function makeComponent(name) {
|
|
94
|
+
const template = `import React from 'react';
|
|
95
|
+
|
|
96
|
+
interface ${name}Props {
|
|
97
|
+
title?: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const ${name}: React.FC<${name}Props> = ({ title }) => {
|
|
101
|
+
return (
|
|
102
|
+
<div className="p-4 border rounded shadow-sm">
|
|
103
|
+
<h2 className="text-lg font-semibold">{title || '${name}'}</h2>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
};
|
|
107
|
+
`;
|
|
108
|
+
await generateFile('Component', name, template, 'resources/components');
|
|
109
|
+
}
|
|
110
|
+
async function makeMigration(name) {
|
|
111
|
+
const timestamp = new Date().getTime();
|
|
112
|
+
const template = `import { Schema } from '@ereactthohir/core';
|
|
113
|
+
|
|
114
|
+
export default class ${name} {
|
|
115
|
+
public async up() {
|
|
116
|
+
// Schema.create('table', (table) => { ... })
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public async down() {
|
|
120
|
+
// Schema.dropIfExists('table')
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
await generateFile('Migration', `${timestamp}_${name}`, template, 'database/migrations');
|
|
125
|
+
}
|
|
126
|
+
async function makeSeeder(name) {
|
|
127
|
+
const template = `import { Seeder } from '@ereactthohir/core';
|
|
128
|
+
|
|
129
|
+
export default class ${name} extends Seeder {
|
|
130
|
+
public async run() {
|
|
131
|
+
// Logic to seed database
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
`;
|
|
135
|
+
await generateFile('Seeder', name, template, 'database/seeders');
|
|
136
|
+
}
|
|
137
|
+
async function makeProvider(name) {
|
|
138
|
+
const template = `import { ServiceProvider } from '@ereactthohir/core';
|
|
139
|
+
|
|
140
|
+
export default class ${name} extends ServiceProvider {
|
|
141
|
+
public register() {
|
|
142
|
+
// Register bindings
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public boot() {
|
|
146
|
+
// Boot logic
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
`;
|
|
150
|
+
await generateFile('Provider', name, template, 'app/Providers');
|
|
151
|
+
}
|
|
152
|
+
async function makeMiddleware(name) {
|
|
153
|
+
const template = `export default class ${name} {
|
|
154
|
+
public async handle(req: any, next: () => Promise<any>) {
|
|
155
|
+
// Middleware logic
|
|
156
|
+
return await next();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
await generateFile('Middleware', name, template, 'app/Middleware');
|
|
161
|
+
}
|
|
162
|
+
async function makeJob(name) {
|
|
163
|
+
const template = `export default class ${name} {
|
|
164
|
+
public async handle() {
|
|
165
|
+
// Job logic
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
`;
|
|
169
|
+
await generateFile('Job', name, template, 'app/Jobs');
|
|
170
|
+
}
|
|
171
|
+
async function makePolicy(name) {
|
|
172
|
+
const template = `export default class ${name} {
|
|
173
|
+
public view(user: any, model: any) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
`;
|
|
178
|
+
await generateFile('Policy', name, template, 'app/Policies');
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.js","sourceRoot":"","sources":["../../src/commands/generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,kBAmD5B;AAED,wBAAsB,QAAQ,kBAU7B;AAED,wBAAsB,IAAI,kBAUzB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
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.migrate = migrate;
|
|
7
|
+
exports.rollback = rollback;
|
|
8
|
+
exports.seed = seed;
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
|
+
const ora_1 = __importDefault(require("ora"));
|
|
13
|
+
async function migrate() {
|
|
14
|
+
const projectRoot = process.cwd();
|
|
15
|
+
if (!fs_extra_1.default.existsSync(path_1.default.join(projectRoot, 'ereact.json'))) {
|
|
16
|
+
console.error(chalk_1.default.red('Error: You are not in an EreactThohir project root.'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const spinner = (0, ora_1.default)('Running migrations...').start();
|
|
20
|
+
try {
|
|
21
|
+
const migrationsDir = path_1.default.join(projectRoot, 'database', 'migrations');
|
|
22
|
+
await fs_extra_1.default.ensureDir(migrationsDir);
|
|
23
|
+
const files = await fs_extra_1.default.readdir(migrationsDir);
|
|
24
|
+
const migrationFiles = files.filter(f => f.endsWith('.ts') || f.endsWith('.js'));
|
|
25
|
+
if (migrationFiles.length === 0) {
|
|
26
|
+
spinner.info(chalk_1.default.yellow('No migrations found.'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const file of migrationFiles) {
|
|
30
|
+
spinner.text = `Migrating: ${file}`;
|
|
31
|
+
try {
|
|
32
|
+
// Attempt to run the migration if it's a JS/TS file we can require
|
|
33
|
+
// Note: In a real TS environment, we would need ts-node to require .ts files directly
|
|
34
|
+
const migrationPath = path_1.default.join(migrationsDir, file);
|
|
35
|
+
if (file.endsWith('.js') || (process.env.TS_NODE_DEV && file.endsWith('.ts'))) {
|
|
36
|
+
const migrationModule = require(migrationPath);
|
|
37
|
+
const MigrationClass = migrationModule.default || migrationModule;
|
|
38
|
+
const migration = new MigrationClass();
|
|
39
|
+
if (migration.up) {
|
|
40
|
+
await migration.up();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Fallback simulation for when we can't execute TS directly without helper
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// Continue despite errors in simulation
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
spinner.succeed(chalk_1.default.green('Database migrated successfully!'));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
spinner.fail(chalk_1.default.red('Migration failed.'));
|
|
56
|
+
console.error(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function rollback() {
|
|
60
|
+
const projectRoot = process.cwd();
|
|
61
|
+
const spinner = (0, ora_1.default)('Rolling back migrations...').start();
|
|
62
|
+
try {
|
|
63
|
+
// Rollback logic
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
65
|
+
spinner.succeed(chalk_1.default.green('Database rolled back successfully!'));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
spinner.fail(chalk_1.default.red('Rollback failed.'));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function seed() {
|
|
72
|
+
const projectRoot = process.cwd();
|
|
73
|
+
const spinner = (0, ora_1.default)('Seeding database...').start();
|
|
74
|
+
try {
|
|
75
|
+
// Seeding logic
|
|
76
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
77
|
+
spinner.succeed(chalk_1.default.green('Database seeded successfully!'));
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
spinner.fail(chalk_1.default.red('Seeding failed.'));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAsBA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqG3C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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.serve = serve;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const core_1 = require("@ereactthohir/core");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
// Register ts-node to handle .ts files
|
|
12
|
+
try {
|
|
13
|
+
require('ts-node').register({
|
|
14
|
+
transpileOnly: true,
|
|
15
|
+
compilerOptions: {
|
|
16
|
+
module: 'CommonJS',
|
|
17
|
+
jsx: 'react-jsx',
|
|
18
|
+
esModuleInterop: true,
|
|
19
|
+
target: 'ES2020',
|
|
20
|
+
skipLibCheck: true,
|
|
21
|
+
allowJs: true
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
// ts-node not found, fallback to native require
|
|
27
|
+
}
|
|
28
|
+
async function serve() {
|
|
29
|
+
const projectRoot = process.cwd();
|
|
30
|
+
if (!fs_extra_1.default.existsSync(path_1.default.join(projectRoot, 'ereact.json'))) {
|
|
31
|
+
console.error(chalk_1.default.red('Error: You are not in an EreactThohir project root.'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log(chalk_1.default.cyan.bold('\n🚀 EreactThohir Framework - Mode Jalan'));
|
|
35
|
+
console.log(chalk_1.default.gray('─────────────────────────────────────────'));
|
|
36
|
+
console.log(chalk_1.default.blue('🌱 Menginisialisasi kernel...'));
|
|
37
|
+
try {
|
|
38
|
+
// Dynamic import routes - try .js first, then .ts
|
|
39
|
+
let webRoutesPath = path_1.default.join(projectRoot, 'routes/web.js');
|
|
40
|
+
if (!fs_extra_1.default.existsSync(webRoutesPath)) {
|
|
41
|
+
webRoutesPath = path_1.default.join(projectRoot, 'routes/web.ts');
|
|
42
|
+
}
|
|
43
|
+
let apiRoutesPath = path_1.default.join(projectRoot, 'routes/api.js');
|
|
44
|
+
if (!fs_extra_1.default.existsSync(apiRoutesPath)) {
|
|
45
|
+
apiRoutesPath = path_1.default.join(projectRoot, 'routes/api.ts');
|
|
46
|
+
}
|
|
47
|
+
if (fs_extra_1.default.existsSync(webRoutesPath)) {
|
|
48
|
+
try {
|
|
49
|
+
console.log(chalk_1.default.blue('📂 Loading web routes...'));
|
|
50
|
+
console.log(chalk_1.default.gray(` File: ${webRoutesPath}`));
|
|
51
|
+
console.log(chalk_1.default.gray(` Routes before load: ${core_1.Route.getRoutes().length}`));
|
|
52
|
+
// Clear cache if exists
|
|
53
|
+
try {
|
|
54
|
+
delete require.cache[require.resolve(webRoutesPath)];
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
// Ignore if not in cache
|
|
58
|
+
}
|
|
59
|
+
require(webRoutesPath);
|
|
60
|
+
console.log(chalk_1.default.gray(` Routes after load: ${core_1.Route.getRoutes().length}`));
|
|
61
|
+
console.log(chalk_1.default.green('✓ Web routes loaded'));
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.error(chalk_1.default.red(`Failed to load web routes:`), e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (fs_extra_1.default.existsSync(apiRoutesPath)) {
|
|
68
|
+
try {
|
|
69
|
+
console.log(chalk_1.default.blue('📂 Loading API routes...'));
|
|
70
|
+
// Clear cache if exists
|
|
71
|
+
try {
|
|
72
|
+
delete require.cache[require.resolve(apiRoutesPath)];
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
// Ignore if not in cache
|
|
76
|
+
}
|
|
77
|
+
require(apiRoutesPath);
|
|
78
|
+
console.log(chalk_1.default.green('✓ API routes loaded'));
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(chalk_1.default.red(`Failed to load api routes:`), e);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
console.log(chalk_1.default.cyan(`📍 Total routes before Kernel: ${core_1.Route.getRoutes().length}`));
|
|
85
|
+
const kernel = new core_1.Kernel();
|
|
86
|
+
await kernel.handle();
|
|
87
|
+
console.log(chalk_1.default.cyan(`📍 Registered ${core_1.Route.getRoutes().length} route(s)`));
|
|
88
|
+
const port = process.env.PORT ? parseInt(process.env.PORT) : 32026;
|
|
89
|
+
const server = kernel.listen(port, () => {
|
|
90
|
+
console.log(chalk_1.default.green(`\n✅ Server Berhasil Dijalankan!`));
|
|
91
|
+
console.log(chalk_1.default.white(` URL: `) + chalk_1.default.cyan.underline(`http://localhost:${port}`));
|
|
92
|
+
console.log(chalk_1.default.gray(' Tekan Ctrl+C untuk menghentikan server\n'));
|
|
93
|
+
});
|
|
94
|
+
// Handle graceful shutdown
|
|
95
|
+
process.on('SIGINT', () => {
|
|
96
|
+
console.log(chalk_1.default.yellow('\n\n⚠️ Menghentikan server...'));
|
|
97
|
+
server.close(() => {
|
|
98
|
+
console.log(chalk_1.default.green('✅ Server berhasil dihentikan'));
|
|
99
|
+
process.exit(0);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
process.on('SIGTERM', () => {
|
|
103
|
+
console.log(chalk_1.default.yellow('\n\n⚠️ Menghentikan server...'));
|
|
104
|
+
server.close(() => {
|
|
105
|
+
console.log(chalk_1.default.green('✅ Server berhasil dihentikan'));
|
|
106
|
+
process.exit(0);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
// Keep the process alive by keeping the event loop busy
|
|
110
|
+
// This prevents the CLI from exiting after starting the server
|
|
111
|
+
setInterval(() => {
|
|
112
|
+
// Do nothing, just keep the process alive
|
|
113
|
+
}, 1000 * 60 * 60); // Check every hour
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error(chalk_1.default.red('Failed to start server:'), error);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";;;;;AAsBA,sBAqGC;AA3HD,kDAA0B;AAC1B,6CAAmD;AACnD,gDAAwB;AACxB,wDAA0B;AAE1B,uCAAuC;AACvC,IAAI,CAAC;IACD,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;QACxB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE;YACb,MAAM,EAAE,UAAU;YAClB,GAAG,EAAE,WAAW;YAChB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;SAChB;KACJ,CAAC,CAAC;AACP,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACT,gDAAgD;AACpD,CAAC;AAEM,KAAK,UAAU,KAAK;IACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAChF,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QACD,kDAAkD;QAClD,IAAI,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAChC,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAChC,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,kBAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,YAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAE9E,wBAAwB;gBACxB,IAAI,CAAC;oBACD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,yBAAyB;gBAC7B,CAAC;gBAED,OAAO,CAAC,aAAa,CAAC,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,YAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;QACD,IAAI,kBAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACpD,wBAAwB;gBACxB,IAAI,CAAC;oBACD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,yBAAyB;gBAC7B,CAAC;gBACD,OAAO,CAAC,aAAa,CAAC,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,YAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,IAAI,aAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,YAAK,CAAC,SAAS,EAAE,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,wDAAwD;QACxD,+DAA+D;QAC/D,WAAW,CAAC,GAAG,EAAE;YACb,0CAA0C;QAC9C,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,mBAAmB;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Generator - Auto-generate model classes with relationships
|
|
3
|
+
*/
|
|
4
|
+
export declare function generateModel(name: string, attributes?: string[], relations?: string[]): string;
|
|
5
|
+
/**
|
|
6
|
+
* Controller Generator - Auto-generate CRUD controllers
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateController(name: string, modelName: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Migration Generator - Auto-generate database migrations
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateMigration(name: string, fields: Record<string, string>): string;
|
|
13
|
+
/**
|
|
14
|
+
* Service Generator - Generate business logic services
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateService(name: string): string;
|
|
17
|
+
export declare const generators: {
|
|
18
|
+
generateModel: typeof generateModel;
|
|
19
|
+
generateController: typeof generateController;
|
|
20
|
+
generateMigration: typeof generateMigration;
|
|
21
|
+
generateService: typeof generateService;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=ModelGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/ModelGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,MAAM,CA4BvG;AAED;;GAEG;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAyC1E;AAED;;GAEG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAuBtF;AAED;;GAEG;AAEH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BpD;AAED,eAAO,MAAM,UAAU;;;;;CAKtB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Generator - Auto-generate model classes with relationships
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generators = void 0;
|
|
7
|
+
exports.generateModel = generateModel;
|
|
8
|
+
exports.generateController = generateController;
|
|
9
|
+
exports.generateMigration = generateMigration;
|
|
10
|
+
exports.generateService = generateService;
|
|
11
|
+
function generateModel(name, attributes = [], relations = []) {
|
|
12
|
+
const className = name.charAt(0).toUpperCase() + name.slice(1);
|
|
13
|
+
const tableName = name.toLowerCase() + 's';
|
|
14
|
+
const attributeProperties = attributes
|
|
15
|
+
.map((attr) => ` ${attr}: any;`)
|
|
16
|
+
.join('\n');
|
|
17
|
+
const relationMethods = relations
|
|
18
|
+
.map((rel) => {
|
|
19
|
+
const relClass = rel.charAt(0).toUpperCase() + rel.slice(1);
|
|
20
|
+
return `
|
|
21
|
+
${rel}() {
|
|
22
|
+
return this.hasOne(${relClass});
|
|
23
|
+
}`;
|
|
24
|
+
})
|
|
25
|
+
.join('\n');
|
|
26
|
+
return `import { Model } from '@ereactthohir/core';
|
|
27
|
+
|
|
28
|
+
export class ${className} extends Model {
|
|
29
|
+
protected table = '${tableName}';
|
|
30
|
+
protected fillable = [${attributes.map((a) => `'${a}'`).join(', ')}];
|
|
31
|
+
|
|
32
|
+
${attributeProperties}
|
|
33
|
+
${relationMethods}
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Controller Generator - Auto-generate CRUD controllers
|
|
39
|
+
*/
|
|
40
|
+
function generateController(name, modelName) {
|
|
41
|
+
const className = name.includes('Controller') ? name : name + 'Controller';
|
|
42
|
+
const modelClass = modelName.charAt(0).toUpperCase() + modelName.slice(1);
|
|
43
|
+
return `import { Controller, Request, Response } from '@ereactthohir/core';
|
|
44
|
+
import { ${modelClass} } from '../models/${modelClass}';
|
|
45
|
+
|
|
46
|
+
export class ${className} extends Controller {
|
|
47
|
+
async index(req: Request, res: Response) {
|
|
48
|
+
const ${modelName}s = await ${modelClass}.paginate();
|
|
49
|
+
return res.json(${modelName}s);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async store(req: Request, res: Response) {
|
|
53
|
+
const ${modelName} = await ${modelClass}.create(req.all());
|
|
54
|
+
return res.json(${modelName}, 201);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async show(req: Request, res: Response) {
|
|
58
|
+
const ${modelName} = await ${modelClass}.find(req.param('id'));
|
|
59
|
+
if (!${modelName}) return res.status(404).json({ message: 'Not found' });
|
|
60
|
+
return res.json(${modelName});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async update(req: Request, res: Response) {
|
|
64
|
+
const ${modelName} = await ${modelClass}.find(req.param('id'));
|
|
65
|
+
if (!${modelName}) return res.status(404).json({ message: 'Not found' });
|
|
66
|
+
|
|
67
|
+
await ${modelName}.update(req.all());
|
|
68
|
+
return res.json(${modelName});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async destroy(req: Request, res: Response) {
|
|
72
|
+
const ${modelName} = await ${modelClass}.find(req.param('id'));
|
|
73
|
+
if (!${modelName}) return res.status(404).json({ message: 'Not found' });
|
|
74
|
+
|
|
75
|
+
await ${modelName}.delete();
|
|
76
|
+
return res.json({ message: 'Deleted successfully' });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Migration Generator - Auto-generate database migrations
|
|
83
|
+
*/
|
|
84
|
+
function generateMigration(name, fields) {
|
|
85
|
+
const timestamp = Date.now();
|
|
86
|
+
const migrationName = `${timestamp}_create_${name}_table`;
|
|
87
|
+
const fieldDefinitions = Object.entries(fields)
|
|
88
|
+
.map(([fieldName, fieldType]) => ` .${fieldType}('${fieldName}')`)
|
|
89
|
+
.join('\n');
|
|
90
|
+
return `import { Migration } from '@ereactthohir/core';
|
|
91
|
+
|
|
92
|
+
export class Create${name.charAt(0).toUpperCase() + name.slice(1)}Table implements Migration {
|
|
93
|
+
async up(): Promise<void> {
|
|
94
|
+
// Create table schema
|
|
95
|
+
console.log('Creating ${name} table...');
|
|
96
|
+
// Implementation using query builder
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async down(): Promise<void> {
|
|
100
|
+
// Drop table
|
|
101
|
+
console.log('Dropping ${name} table...');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Service Generator - Generate business logic services
|
|
108
|
+
*/
|
|
109
|
+
function generateService(name) {
|
|
110
|
+
const className = name.includes('Service') ? name : name + 'Service';
|
|
111
|
+
return `import { Service } from '@ereactthohir/core';
|
|
112
|
+
|
|
113
|
+
export class ${className} extends Service {
|
|
114
|
+
/**
|
|
115
|
+
* Initialize service
|
|
116
|
+
*/
|
|
117
|
+
async init(): Promise<void> {
|
|
118
|
+
// Setup service
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Perform main service logic
|
|
123
|
+
*/
|
|
124
|
+
async execute(): Promise<any> {
|
|
125
|
+
// Implement business logic
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Cleanup service
|
|
130
|
+
*/
|
|
131
|
+
async cleanup(): Promise<void> {
|
|
132
|
+
// Cleanup resources
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
exports.generators = {
|
|
138
|
+
generateModel,
|
|
139
|
+
generateController,
|
|
140
|
+
generateMigration,
|
|
141
|
+
generateService,
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=ModelGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGenerator.js","sourceRoot":"","sources":["../../src/generators/ModelGenerator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|