@pgsql/cli
Version:
Unified CLI for PostgreSQL AST parsing, deparsing, and code generation
75 lines (60 loc) • 2.15 kB
text/typescript
import { PgProtoParser, PgProtoParserOptions, getOptionsWithDefaults } from 'pg-proto-parser';
import { writeFileSync } from 'fs';
import { join } from 'path';
import chalk from 'chalk';
import { showHelp } from '../utils/help';
export async function runtimeSchemaCommand(argv: any) {
if (argv.help) {
showHelp('runtime-schema');
process.exit(0);
}
if (!argv.inFile || !argv.outDir) {
console.error(chalk.red('Error: --inFile and --outDir are required'));
showHelp('runtime-schema');
process.exit(1);
}
const format = argv.format || 'json';
const filename = argv.filename || 'runtime-schema';
try {
console.log(chalk.blue('Parsing protobuf file...'));
const options: PgProtoParserOptions = getOptionsWithDefaults({
outDir: argv.outDir
});
const parser = new PgProtoParser(argv.inFile, options);
// Generate runtime schema
console.log(chalk.blue(`Generating runtime schema in ${format} format...`));
console.log(chalk.yellow('Warning: Runtime schema generation is not yet fully implemented'));
// Generate placeholder schema based on format
let content: string;
let fileExt: string;
if (format === 'typescript') {
// Generate TypeScript runtime schema placeholder
content = `// Runtime schema for PostgreSQL AST nodes
// Generated from: ${argv.inFile}
export interface RuntimeSchema {
// TODO: Implement runtime schema generation
nodes: Record<string, any>;
}
export const runtimeSchema: RuntimeSchema = {
nodes: {}
};
`;
fileExt = '.ts';
} else {
// Generate JSON runtime schema placeholder
content = JSON.stringify({
generated: new Date().toISOString(),
source: argv.inFile,
nodes: {}
}, null, 2);
fileExt = '.json';
}
// Write file
const outputPath = join(argv.outDir, `${filename}${fileExt}`);
writeFileSync(outputPath, content);
console.log(chalk.green(`✓ Runtime schema generated: ${outputPath}`));
} catch (error: any) {
console.error(chalk.red('Runtime schema error:'), error.message || error);
process.exit(1);
}
}