You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lib/src/orm/schema/TableBuilder.ts

110 lines
2.2 KiB

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]
}
}