@clickup/pg-mig
Version:
PostgreSQL schema migration tool with microsharding and clustering support
75 lines (60 loc) • 1.71 kB
text/typescript
import throttle from "lodash/throttle";
import logUpdate from "log-update";
import { printText } from "./render";
if (!process.stdout.columns && parseInt(process.env["COLUMNS"] ?? "")) {
process.stdout.columns = parseInt(process.env["COLUMNS"]!);
}
if (!process.stdout.rows && parseInt(process.env["ROWS"] ?? "")) {
process.stdout.rows = parseInt(process.env["ROWS"]!);
}
export interface ProgressPrinter {
throttle(render: () => void): () => void;
print(text: string[]): void;
clear(): void;
skipEmptyLines(): boolean;
}
export class ProgressPrinterTTY implements ProgressPrinter {
private logUpdate = logUpdate.create(process.stdout, {
showCursor: true,
});
throttle(render: () => void): () => void {
return throttle(render, 100, { trailing: false });
}
print(rows: string[]): void {
if (rows.length > 0) {
this.logUpdate(
rows.slice(0, Math.max((process.stdout.rows || 25) - 3, 3)).join("\n"),
);
} else {
this.logUpdate.clear();
}
}
clear(): void {
this.logUpdate.clear();
}
skipEmptyLines(): boolean {
return false;
}
}
export class ProgressPrinterStream implements ProgressPrinter {
private printedNormalized = new Set<string>();
throttle(render: () => void): () => void {
return render;
}
print(rows: string[]): void {
for (const line of rows) {
const normalized = line.replace(/^(\w+:.*) elapsed.*/s, "$1");
if (this.printedNormalized.has(normalized)) {
continue;
}
printText(line);
this.printedNormalized.add(normalized);
}
}
clear(): void {
this.printedNormalized.clear();
}
skipEmptyLines(): boolean {
return true;
}
}