create-proyect-cli 2.2.0

CLI para crear proyectos rĂ¡pidamente (Express, Rust, Python, Angular, Vue, React)
use crate::utils::write_file;
use std::fs;
use std::path::Path;

pub fn generate_drizzle(base: &Path, db: &str) {
    let driver = match db {
        "MySQL" => "mysql2",
        "PostgreSQL" | _ => "postgres",
    };

    let schema = format!(
        r#"
import {{ serial, text, timestamp, mysqlTable }} from 'drizzle-orm/{}';

export const users = mysqlTable('users', {{
    id: serial('id').primaryKey(),
    email: text('email').notNull().unique(),
    password: text('password').notNull(),
    createdAt: timestamp('created_at').defaultNow(),
}});

export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
"#,
        driver
    );

    let db_dir = base.join("src/db");
    fs::create_dir_all(&db_dir).unwrap();
    write_file(&db_dir.join("schema.ts"), &schema);

    let drizzle_config = match db {
        "MySQL" => {
            r#"
import { drizzle } from 'drizzle-orm/mysql2';
import mysql from 'mysql2/promise';
import * as schema from './schema';

const pool = mysql.createPool({
    host: process.env.DB_HOST || 'localhost',
    port: parseInt(process.env.DB_PORT || '3306'),
    user: process.env.DB_USER || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_NAME || 'api_db',
    waitForConnections: true,
    connectionLimit: 10,
});

export const db = drizzle(pool, {{ schema }});
"#
        }
        "PostgreSQL" | _ => {
            r#"
import {{ drizzle }} from 'drizzle-orm/node-postgres';
import {{ Client }} from 'pg';
import * as schema from './schema';

const client = new Client({{
    host: process.env.DB_HOST || 'localhost',
    port: parseInt(process.env.DB_PORT || '5432'),
    user: process.env.DB_USER || 'postgres',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_NAME || 'api_db',
}});

export const db = drizzle(client, {{ schema }});
"#
        }
    };

    write_file(&db_dir.join("index.ts"), &drizzle_config);

    let migrations_dir = base.join("drizzle");
    fs::create_dir_all(&migrations_dir).unwrap();

    let meta = r#"
{
  "version": "1"
}
"#;
    write_file(&migrations_dir.join("meta/_journal.json"), &meta);
}