@pgsql/cli
Version:
Unified CLI for PostgreSQL AST parsing, deparsing, and code generation
74 lines (73 loc) • 3.15 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.replaceTextInProtoJS = exports.generateProtoJS = exports.downloadProtoFile = void 0;
const https_1 = __importDefault(require("https"));
const fs_1 = __importDefault(require("fs"));
const child_process_1 = require("child_process");
const mkdirp_1 = require("mkdirp");
const path_1 = require("path");
// Download .proto file if URL
const downloadProtoFile = (protoUrl, filePath) => {
(0, mkdirp_1.sync)((0, path_1.dirname)(filePath));
return new Promise((resolve, reject) => {
https_1.default.get(protoUrl, (response) => {
if (response.statusCode !== 200) {
console.error(`Failed to download file: Status Code: ${response.statusCode}`);
response.resume(); // consume response data to free up memory
reject(new Error('Failed to download file'));
return;
}
const fileStream = fs_1.default.createWriteStream(filePath);
response.pipe(fileStream);
fileStream.on('finish', () => {
fileStream.close();
console.log('Downloaded proto file.');
resolve();
});
}).on('error', (err) => {
console.error(`Error downloading the file: ${err.message}`);
fs_1.default.unlink(filePath, () => { }); // Delete the file async. (No need to check error here)
reject(err);
});
});
};
exports.downloadProtoFile = downloadProtoFile;
// Generate JavaScript from proto file using pbjs
const generateProtoJS = (inFile, outFile) => new Promise((resolve, reject) => {
const command = `pbjs --keep-case -t static-module -o ${outFile} ${inFile}`;
(0, mkdirp_1.sync)((0, path_1.dirname)(outFile));
(0, child_process_1.exec)(command, (error, _stdout, _stderr) => {
if (error) {
console.error(`Error during code generation: ${error.message}`);
reject(error);
return;
}
console.log('Generated proto.js from proto file.');
resolve();
});
});
exports.generateProtoJS = generateProtoJS;
// Replace text in generated JS file
const replaceTextInProtoJS = (filePath, originalPackage, newPackage) => new Promise((resolve, reject) => {
fs_1.default.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error(`Error reading proto.js: ${err.message}`);
reject(err);
return;
}
const result = data.replace(new RegExp(originalPackage, 'g'), newPackage);
fs_1.default.writeFile(filePath, result, 'utf8', (err) => {
if (err) {
console.error(`Error writing back to proto.js: ${err.message}`);
reject(err);
return;
}
console.log('Replaced text in proto.js successfully.');
resolve();
});
});
});
exports.replaceTextInProtoJS = replaceTextInProtoJS;