crudora 0.1.0-alpha.3 → 0.1.0-alpha.4

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 CHANGED
@@ -313,7 +313,6 @@ Crudora automatically adds these scripts to your package.json:
313
313
  - [API Reference](./docs/api.md)
314
314
  - [Model Definition Guide](./docs/models.md)
315
315
  - [Custom Routes](./docs/custom-routes.md)
316
- - [CLI Reference](./docs/cli.md)
317
316
  - [Deployment Guide](./docs/deployment.md)
318
317
 
319
318
  ## Contributing
@@ -99,8 +99,14 @@ if (fs.existsSync(targetPackagePath)) {
99
99
 
100
100
  // Add useful scripts if they don't exist
101
101
  const scriptsToAdd = {
102
+ 'build': 'tsc',
102
103
  'dev': 'ts-node src/server.ts',
103
104
  'start': 'ts-node src/server.ts',
105
+ 'start:prod': 'node dist/index.js',
106
+ 'db:generate': 'prisma generate',
107
+ 'db:push': 'prisma db push',
108
+ 'db:migrate': 'prisma migrate dev',
109
+ 'db:studio': 'prisma studio'
104
110
  };
105
111
 
106
112
  let scriptsAdded = false;
package/package.json CHANGED
@@ -1,19 +1,14 @@
1
1
  {
2
2
  "name": "crudora",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.4",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
- "type": "module",
7
- "bin": {
8
- "crudora": "./bin/crudora.js"
9
- },
10
6
  "files": [
11
7
  "dist",
12
8
  "README.md",
13
9
  "LICENSE",
14
10
  "templates",
15
- "scripts",
16
- "bin"
11
+ "scripts"
17
12
  ],
18
13
  "scripts": {
19
14
  "build": "tsc && node scripts/copy-assets.js",
@@ -99,8 +99,14 @@ if (fs.existsSync(targetPackagePath)) {
99
99
 
100
100
  // Add useful scripts if they don't exist
101
101
  const scriptsToAdd = {
102
+ 'build': 'tsc',
102
103
  'dev': 'ts-node src/server.ts',
103
104
  'start': 'ts-node src/server.ts',
105
+ 'start:prod': 'node dist/index.js',
106
+ 'db:generate': 'prisma generate',
107
+ 'db:push': 'prisma db push',
108
+ 'db:migrate': 'prisma migrate dev',
109
+ 'db:studio': 'prisma studio'
104
110
  };
105
111
 
106
112
  let scriptsAdded = false;
package/bin/crudora.js DELETED
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { fileURLToPath } from 'url';
4
- import { dirname } from 'path';
5
- import { createRequire } from 'module';
6
-
7
- const require = createRequire(import.meta.url);
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = dirname(__filename);
10
-
11
- let cliPath;
12
- try {
13
- cliPath = new URL('../dist/cli.js', import.meta.url);
14
- await import(cliPath);
15
- } catch (error) {
16
- try {
17
- cliPath = new URL('../src/cli.ts', import.meta.url);
18
- const tsNodePath = require.resolve('ts-node/register');
19
- require(tsNodePath);
20
- await import(cliPath);
21
- } catch (innerError) {
22
- console.error('Error loading CLI:', innerError);
23
- process.exit(1);
24
- }
25
- }
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { fileURLToPath } from 'url';
4
- import { dirname } from 'path';
5
- import { createRequire } from 'module';
6
-
7
- const require = createRequire(import.meta.url);
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = dirname(__filename);
10
-
11
- let cliPath;
12
- try {
13
- cliPath = new URL('../dist/cli.js', import.meta.url);
14
- await import(cliPath);
15
- } catch (error) {
16
- try {
17
- cliPath = new URL('../src/cli.ts', import.meta.url);
18
- const tsNodePath = require.resolve('ts-node/register');
19
- require(tsNodePath);
20
- await import(cliPath);
21
- } catch (innerError) {
22
- console.error('Error loading CLI:', innerError);
23
- process.exit(1);
24
- }
25
- }
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js DELETED
@@ -1,233 +0,0 @@
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
- // Ubah semua import menjadi require
7
- const commander_1 = require("commander");
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const child_process_1 = require("child_process");
11
- function initProject() {
12
- const templatePath = path_1.default.join(__dirname, '..', 'templates', 'schema.prisma');
13
- const targetPrismaPath = path_1.default.join(process.cwd(), 'prisma', 'schema.prisma');
14
- const targetEnvPath = path_1.default.join(process.cwd(), '.env');
15
- const targetServerPath = path_1.default.join(process.cwd(), 'src', 'server.ts'); // Ubah ke .ts
16
- const targetPackagePath = path_1.default.join(process.cwd(), 'package.json');
17
- console.log('🚀 Setting up Crudora project...');
18
- // 1. Create prisma directory and schema
19
- if (!fs_1.default.existsSync(path_1.default.dirname(targetPrismaPath))) {
20
- console.log('📋 Creating Prisma schema...');
21
- fs_1.default.mkdirSync(path_1.default.dirname(targetPrismaPath), { recursive: true });
22
- fs_1.default.copyFileSync(templatePath, targetPrismaPath);
23
- console.log('✅ Prisma schema created at prisma/schema.prisma');
24
- }
25
- else {
26
- console.log('📋 Prisma directory already exists, skipping schema creation');
27
- }
28
- // 2. Create .env file
29
- if (!fs_1.default.existsSync(targetEnvPath)) {
30
- console.log('🔧 Creating .env file...');
31
- const envContent = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'templates', '.env.example'), 'utf8');
32
- fs_1.default.writeFileSync(targetEnvPath, envContent);
33
- console.log('✅ .env file created');
34
- }
35
- else {
36
- console.log('🔧 .env file already exists, skipping creation');
37
- }
38
- // 3. Create basic server setup with TypeScript and ESM
39
- if (!fs_1.default.existsSync(targetServerPath)) {
40
- console.log('🖥️ Creating server setup...');
41
- const serverContent = `import { CrudoraServer } from 'crudora';
42
- import { PrismaClient } from '@prisma/client';
43
- import dotenv from 'dotenv';
44
- dotenv.config();
45
-
46
- const prisma = new PrismaClient();
47
-
48
- // Example User model (uncomment and modify as needed)
49
- /*
50
- class User {
51
- static tableName = 'users';
52
- static primaryKey = 'id';
53
- static timestamps = true;
54
- static fillable = ['name', 'email'];
55
- static hidden = ['password'];
56
- }
57
- */
58
-
59
- const server = new CrudoraServer({
60
- port: Number(process.env.PORT) || 3000,
61
- prisma: prisma,
62
- cors: true,
63
- basePath: process.env.API_BASE_PATH || '/api'
64
- });
65
-
66
- // Register your models here
67
- // server.registerModel(User);
68
-
69
- // Add custom routes if needed
70
- server.get('/health', (req, res) => {
71
- res.json({ status: 'ok', timestamp: new Date() });
72
- });
73
-
74
- // Generate routes and start server
75
- server
76
- .generateRoutes()
77
- .listen(() => {
78
- console.log('🚀 Crudora server is running!');
79
- console.log('📚 API documentation: http://localhost:\${process.env.PORT || 3000}\${process.env.API_BASE_PATH || '/api'}');
80
- });
81
- `;
82
- fs_1.default.writeFileSync(targetServerPath, serverContent);
83
- console.log('✅ Server setup created at server.ts');
84
- }
85
- else {
86
- console.log('🖥️ server.ts already exists, skipping creation');
87
- }
88
- // 4. Update package.json scripts (if package.json exists)
89
- if (fs_1.default.existsSync(targetPackagePath)) {
90
- try {
91
- const packageJson = JSON.parse(fs_1.default.readFileSync(targetPackagePath, 'utf8'));
92
- if (!packageJson.scripts) {
93
- packageJson.scripts = {};
94
- }
95
- // Add useful scripts if they don't exist
96
- const scriptsToAdd = {
97
- 'dev': 'ts-node server.ts',
98
- 'start': 'ts-node server.ts',
99
- 'build': 'tsc',
100
- 'start:prod': 'node dist/server.js',
101
- };
102
- let scriptsAdded = false;
103
- for (const [scriptName, scriptCommand] of Object.entries(scriptsToAdd)) {
104
- if (!packageJson.scripts[scriptName]) {
105
- packageJson.scripts[scriptName] = scriptCommand;
106
- scriptsAdded = true;
107
- }
108
- }
109
- if (scriptsAdded) {
110
- fs_1.default.writeFileSync(targetPackagePath, JSON.stringify(packageJson, null, 2));
111
- console.log('✅ Package.json scripts updated');
112
- }
113
- }
114
- catch (error) {
115
- console.log('⚠️ Could not update package.json scripts:', error.message);
116
- }
117
- }
118
- // 5. Create tsconfig.json if it doesn't exist
119
- const targetTsConfigPath = path_1.default.join(process.cwd(), 'tsconfig.json');
120
- if (!fs_1.default.existsSync(targetTsConfigPath)) {
121
- console.log('📝 Creating tsconfig.json...');
122
- const tsConfigContent = {
123
- "compilerOptions": {
124
- "target": "ES2020",
125
- "module": "NodeNext",
126
- "moduleResolution": "NodeNext",
127
- "lib": ["ES2020"],
128
- "outDir": "./dist",
129
- "rootDir": "./",
130
- "strict": true,
131
- "esModuleInterop": true,
132
- "skipLibCheck": true,
133
- "forceConsistentCasingInFileNames": true,
134
- "experimentalDecorators": true,
135
- "emitDecoratorMetadata": true,
136
- "resolveJsonModule": true,
137
- "declaration": true,
138
- "sourceMap": true
139
- },
140
- "include": ["*.ts", "src/**/*"],
141
- "exclude": ["node_modules", "dist", "**/*.test.ts"]
142
- };
143
- fs_1.default.writeFileSync(targetTsConfigPath, JSON.stringify(tsConfigContent, null, 2));
144
- console.log('✅ tsconfig.json created');
145
- }
146
- console.log('\n🎉 Crudora setup complete!');
147
- console.log('\n📝 Next steps:');
148
- console.log('1. Install dependencies: npm install @prisma/client prisma dotenv ts-node typescript');
149
- console.log('2. Generate Prisma client: npx prisma generate');
150
- console.log('3. Push database schema: npx prisma db push');
151
- console.log('4. Define your models in server.ts');
152
- console.log('5. Start development server: npm run dev');
153
- console.log('\n📖 Documentation: https://github.com/suryamsj/crudora#readme');
154
- }
155
- function runPrismaStudio() {
156
- console.log('🚀 Starting Prisma Studio...');
157
- try {
158
- (0, child_process_1.execSync)('npx prisma studio', { stdio: 'inherit' });
159
- }
160
- catch (error) {
161
- console.error('❌ Failed to start Prisma Studio:', error.message);
162
- process.exit(1);
163
- }
164
- }
165
- function generatePrismaClient() {
166
- console.log('🔧 Generating Prisma Client...');
167
- try {
168
- (0, child_process_1.execSync)('npx prisma generate', { stdio: 'inherit' });
169
- console.log('✅ Prisma Client generated successfully');
170
- }
171
- catch (error) {
172
- console.error('❌ Failed to generate Prisma Client:', error.message);
173
- process.exit(1);
174
- }
175
- }
176
- function pushPrismaSchema() {
177
- console.log('🔄 Pushing Prisma schema to database...');
178
- try {
179
- (0, child_process_1.execSync)('npx prisma db push', { stdio: 'inherit' });
180
- console.log('✅ Schema pushed to database successfully');
181
- }
182
- catch (error) {
183
- console.error('❌ Failed to push schema to database:', error.message);
184
- process.exit(1);
185
- }
186
- }
187
- function migratePrismaSchema() {
188
- console.log('🔄 Running Prisma migrations...');
189
- try {
190
- (0, child_process_1.execSync)('npx prisma migrate dev', { stdio: 'inherit' });
191
- console.log('✅ Migrations completed successfully');
192
- }
193
- catch (error) {
194
- console.error('❌ Failed to run migrations:', error.message);
195
- process.exit(1);
196
- }
197
- }
198
- // Membuat CLI program
199
- const program = new commander_1.Command();
200
- program
201
- .name('crudora')
202
- .description('CLI for Crudora - TypeScript framework for automated CRUD API generation')
203
- .version('0.1.0-alpha.3');
204
- program
205
- .command('init')
206
- .description('Initialize a new Crudora project')
207
- .action(initProject);
208
- program
209
- .command('studio')
210
- .description('Start Prisma Studio')
211
- .action(runPrismaStudio);
212
- program
213
- .command('generate')
214
- .description('Generate Prisma Client')
215
- .action(generatePrismaClient);
216
- program
217
- .command('push')
218
- .description('Push Prisma schema to database')
219
- .action(pushPrismaSchema);
220
- program
221
- .command('migrate')
222
- .description('Run Prisma migrations')
223
- .action(migratePrismaSchema);
224
- program.parse();
225
- // Di akhir file, ubah export jika ada
226
- module.exports = {
227
- initProject,
228
- runPrismaStudio,
229
- generatePrismaClient,
230
- pushPrismaSchema,
231
- migratePrismaSchema
232
- };
233
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}