@itrocks/composition
v0.0.6
Published
Manage and query composite and component property structures
Maintainers
Readme
composition
Manage and query composite and component property structures.
Summary
This module facilitates the creation of composite and component relationships within TypeScript classes using decorators.
Installation
npm i @itrocks/compositionExample Use Case
Car, Engine and Wheels
Imagine a vehicle management system where a Car class is a composite containing those components:
- An
Engineclass representing a single object component. - A collection of
Wheelobjects.
import { Composite, Component } from '@itrocks/composition'
class Engine {
@Composite() car: Car
constructor(
public type: string,
public serialNumber: string
) {}
}
class Wheel {
@Composite() car: Car
constructor(
public diameter: number,
public serialNumber: string
) {}
}
class Car {
constructor(
@Component() public engine: Engine,
@Component() public wheels: Wheel[]
) {
engine.car = this
wheels.forEach(wheel => wheel.car = this)
}
}
const car = new Car(
new Engine('V8', 'ENG12345'),
[
new Wheel(20, 'WHL001'),
new Wheel(20, 'WHL002'),
new Wheel(18, 'WHL003'),
new Wheel(18, 'WHL004')
]
)Verifying Components and Composites
You can check if properties are marked as components or composites:
import { componentOf, compositeOf } from '@itrocks/composition'
console.log(componentOf(Car, 'engine')) // true
console.log(componentOf(Car, 'wheels')) // true
console.log(compositeOf(Engine, 'car' )) // true
console.log(compositeOf(Wheel, 'car' )) // true
console.log(componentOf(Engine, 'car' )) // false
console.log(compositeOf(Car, 'engine')) // falseAPI Reference
@Component
@Component(value: boolean = true)A decorator to mark a property as a component.
Parameters:
value(boolean, default: true): Activates or deactives the property as a component. Setting this value tofalseoverrides atruevalue on the same property on a parent class.
Usage:
class Car {
@Component()
engine: Engine
}componentOf
componentOf<T extends object>(target: ObjectOrType<T>, property: KeyOf<T>): booleanChecks whether a property is marked as a Component.
Parameters:
target(ObjectOrType): The target class or object to check.property(KeyOf): The name of the property to verify.
Returns:
boolean: true if the property is marked as a Component, false otherwise.
Usage:
console.log(componentOf(Car, 'engine')) // true@Composite
@Composite(value: boolean = true)A decorator to mark a property as a composite.
Parameters:
value(boolean, default: true): Activates or deactivates the property as a composite. Setting this value tofalseoverrides atruevalue on the same property on a parent class.
Usage:
class Engine {
@Composite()
car: Car
}compositeOf
compositeOf<T extends object>(target: ObjectOrType<T>, property: KeyOf<T>): booleanChecks whether a property is marked as a composite.
Parameters:
target(ObjectOrType): The target class or object to check.property(KeyOf): The name of the property to verify.
Returns:
boolean: true if the property is marked as a Composite, false otherwise.
Usage:
console.log(compositeOf(Engine, 'car')) // true