1.0.1 • Published 2 years ago

@xcore24/builder v1.0.1

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

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'))