builder
builder
is TypeScript library implementing the Builder, Composite pattern.
Installation
To start using builder install the npm package:
npm install @xcore24/builder
Basic Usage
import { Builder } from '@xcore24/builder'
class MessageBuilder extends Builder {
#logParts(level: number = 1) {
for (const [name, partial] of this.partials.entries()) {
console.log([`level: ${level} | name: ${name}`])
if (partial.isChildren) {
const node = partial as MessageBuilder
node.#logParts(level+1)
}
}
level = -1
return this
}
build(): this {
this.#logParts()
return this
}
}
// Объявления некоторых классов
class MessageMeta extends MessageBuilder {
name: string = 'MessageMeta'
}
class MessageMetaRequest extends MessageBuilder {
name: string = 'MessageMetaRequest'
isChildren: boolean = false
}
class MessageMetaService extends MessageBuilder {
name: string = 'MessageMetaService'
isChildren: boolean = false
}
class MessageMetaUser extends MessageBuilder {
name: string = 'MessageMetaUser'
isChildren: boolean = false
}
class MessageData extends MessageBuilder {
name: string = 'MessageData'
}
class MessageDataMessageId extends MessageBuilder {
name: string = 'MessageDataMessageId'
isChildren: boolean = true
}
class MessageDataPayload extends MessageBuilder {
name: string = 'MessageDataPayload'
isChildren: boolean = true
}
class MessageDataPayloadSome extends MessageBuilder {
name: string = 'MessageDataPayloadSome'
isChildren: boolean = false
}
// Если в классе указано isChildren = false, значит к данному классу нельзя добавить потомков
// Объявляем основной класс билдера
const message = new MessageBuilder()
// Начинаем строить наше дерево или граф без разницы как его называь в данной реализации
message
.set('meta', new MessageMeta(message))
.setChild('request', new MessageMetaRequest())
.setChild('service', new MessageMetaService())
.setChild('user', new MessageMetaUser())
// Переключаем указатель на родителя, т.е. на "meta"
.getParent()
?.set('data', new MessageData(message))
.setChild('messageId', new MessageDataMessageId())
.setChild('payload', new MessageDataPayload())
// Вдруг мы решили добавить потомков к узлу messageId. Почему бы и нет. Берем и добавляем :)
// Кстати, метод ".getParent('data.messageId')" вернет нам тот же самый узел.
.getChild('messageId')
?.setChild('payloadSome', new MessageDataPayloadSome())
.setChild('request', new MessageMetaRequest())
message.build()
// Пример получения родителя по пути в формате dot-notation
// 2 уровня вложенности
console.log(message.getParent('meta.request'))
// 3 уровня вложенности
console.log(message.getParent('data.messageId.payloadSome'))