@lordfokas/magic-orm
Version:
A class-based ORM in TypeScript. Unorthodox and extremely opinionated, made to fit my specific use cases.
71 lines (70 loc) • 2.77 kB
JavaScript
import fs from 'node:fs';
import { Logger, PrettyPrinter } from '@lordfokas/loggamus';
import { Command } from 'commander';
import { Scaffolder } from './Scaffolder.js';
import pg from 'pg';
function readJSON(file) {
return JSON.parse(fs.readFileSync(file).toString());
}
const pkg = readJSON("./package.json");
const program = new Command("magic-orm").version(pkg.version).description("Command line tools for magic-orm");
const printer = new PrettyPrinter();
program.command("scaffold").description("Scaffold models for your application")
.argument("<sourcedir>", "model definition source dir")
.argument("<version>", "version to scaffold")
.option("-H <dbhost>")
.option("-p <dbport>", "database port", "5432")
.option("-U <dbuser>")
.option("-P <dbpass>")
.option("-N <dbname>")
.action((sourcedir, version, options) => {
fs.readdir(sourcedir, (err, files) => {
if (err) {
printer.color("red").write(err).flush();
}
else {
// Show migrations
files = files.filter(f => f.endsWith(".json")).sort();
if (files.length == 0) {
printer.color("red").write("Error: No migration files found!").flush();
return;
}
printer.color("green").write(`Found ${files.length} migration files:`).flush();
printer.color("blue").style("bright");
for (const file of files) {
printer.write(file).endl();
}
printer.flush();
// Pick migration
let source;
if (version == "latest") {
source = files[files.length - 1];
printer.color("green").write(`Using latest migration: ${source}`).flush();
}
else if (version == "first") {
source = files[0];
printer.color("green").write(`Using first migration: ${source}`).flush();
}
else {
source = version + ".json";
if (!files.includes(source)) {
printer.color("red").write(`Error: migration "${source}" not found!`).flush();
return;
}
printer.color("green").write(`Using specified migration: ${source}`).flush();
}
// Establish DB connection
const pool = new pg.Pool({
host: options.H,
port: parseInt(options.p),
user: options.U,
password: options.P,
database: options.N
});
// Start scaffolding
Scaffolder.start(sourcedir, source, pool).catch(Logger.error);
}
});
});
program.parse();