@xcore24/builder
v1.0.1
Published
TypeScript library implementing the Builder, Composite pattern
Maintainers
Readme
builder
builder is TypeScript library implementing the Builder, Composite pattern.
Installation
To start using builder install the npm package:
npm install @xcore24/builderBasic 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'))