110 lines
2.2 KiB
TypeScript
110 lines
2.2 KiB
TypeScript
|
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<this> {
|
||
|
return Pipe.wrap<this>(this)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class ColumnBuilder extends SchemaBuilderBase {
|
||
|
|
||
|
}
|
||
|
|
||
|
export class IndexBuilder extends SchemaBuilderBase {
|
||
|
|
||
|
protected fields: Set<string> = new Set<string>()
|
||
|
|
||
|
protected removedFields: Set<string> = new Set<string>()
|
||
|
|
||
|
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]
|
||
|
}
|
||
|
}
|