import {Pipe} from '../../util' export abstract class SchemaBuilderBase { protected shouldDrop: 'yes'|'no'|'exists' = 'no' protected shouldRenameTo?: string constructor( protected readonly name: string, ) { } public drop(): this { this.shouldDrop = 'yes' return this } public dropIfExists(): this { this.shouldDrop = 'exists' return this } public rename(to: string): this { this.shouldRenameTo = to return this } pipe(): Pipe { return Pipe.wrap(this) } } export class ColumnBuilder extends SchemaBuilderBase { } export class IndexBuilder extends SchemaBuilderBase { protected fields: Set = new Set() protected removedFields: Set = new Set() protected shouldBeUnique = false protected shouldBePrimary = false protected field(name: string): this { this.fields.add(name) return this } protected removeField(name: string): this { this.removedFields.add(name) this.fields.delete(name) return this } primary(): this { this.shouldBePrimary = true return this } unique(): this { this.shouldBeUnique = true return this } } export class TableBuilder extends SchemaBuilderBase { protected columns: {[key: string]: ColumnBuilder} = {} protected indexes: {[key: string]: IndexBuilder} = {} public dropColumn(name: string): this { this.column(name).drop() return this } public renameColumn(from: string, to: string): this { this.column(from).rename(to) return this } public dropIndex(name: string): this { this.index(name).drop() return this } public renameIndex(from: string, to: string): this { this.index(from).rename(to) return this } public column(name: string) { if ( !this.columns[name] ) { this.columns[name] = new ColumnBuilder(name) } return this.columns[name] } public index(name: string) { if ( !this.indexes[name] ) { this.indexes[name] = new IndexBuilder(name) } return this.indexes[name] } }