❂ Objecture
⏣ Object Watcher, Property Manager
⊚ Capture property changes for object, array mutator methods.
⊚ Schematize and validate object, array properties.
⊚ Browser, NodeJS compatible.
⁘ Uses Core-Plex - Event Listener Management System.
⁜ Used by MVC Framework - Presentation Abtraction Control (PAC) Pattern.
Guide | | :-- |
⏣ Introduction
- Manage structured content using familiar JS
Object
,Array
,EventTarget
APIs. - Schematize data structures with property validators.
- Capture content and validation events for property changes (including nested property events).
⏣ Impetus
- Frontend, backend applications require or benefit from structured content with validatable schema.
- Detecting changes to structured content in objects/arrays through property events promotes event-driven application architecture.
- There are limited libraries with both browser and Node compatibility that manage schematized content with validators or that capture nested property change events.
⏣ Impact
- Manage content for primitive/object data types:
string
,number
,boolean
,null
primitives;object
,array
.
- Schematize content with property validators.
type
,required
,match
,enum
,range
,length
and custom validators.
- Capture content events for any methods that modify content.
Object
Events:assign
,defineProperties
/defineProperty
,freeze
, andseal
events.
Array
Events:concat
,copyWithin
,fill
,pop
,push
,reverse
,shift
,splice
, andunshift
events.
Property Map
Events:get
,set
,delete
- Capture validation events/data for array/object properties.
valid
,nonvalid
validProperty
,nonvalidProperty
events.- Schema validation object with
report
method.
⏣ Illustrations
Import Object Model, Schema
import { Model, Schema } from 'objecture'
Objecture Model
- Example A.1.
const object = new Model({ propertyA: { propertyB: { propertyC: true } }, propertyD: [{ propertyE: { propertyF: 1 } }], propertyG: "TRUE" }) console.log(object.valueOf())
object.valueOf
logs:{ propertyA: { propertyB: { propertyC: true } }, propertyD: [{ propertyE: { propertyF: 1 } }], propertyG: "TRUE" }
Schematized Objecture Model
- Example A.2.
const schema = { propertyA: { propertyB: { propertyC: Boolean } }, propertyD: [{ propertyE: { propertyF: Number, propertyE: { propertyFFF: Number } } }], propertyG: String } const object = new Model({ propertyA: { propertyB: { propertyC: true } }, propertyD: [{ propertyE: { propertyF: 1, propertyE: { propertyFFF: 1 } } }], propertyG: "true" }, schema) console.log(object.toString({ space: 2, replacer: null }))
object.toString
logs:
({ "propertyA": { "propertyB": { "propertyC": true } }, "propertyD": [ { "propertyE": { "propertyF": 1, "propertyE": { "propertyFFF": 1 } } } ], }
propertyG
nonvalid)
Ventilated Objecture Model
- Example A.3.
logsfunction eventLog($event) { console.log($event.type, $event.path, JSON.stringify($event.value)) } const object = new Model({ propertyA: { propertyB: { propertyC: true } }, propertyD: [{ propertyE: { propertyF: 1 } }], propertyG: "TRUE" }, null, { events: { 'propertyA.propertyB setProperty': eventLog, 'propertyA setProperty': eventLog, 'setProperty': eventLog, 'propertyD pushProp': eventLog, 'propertyD.[0-9] set': eventLog, '** set': eventLog, }, enableEvents: true })
setProperty propertyA.propertyB.propertyC true set propertyA.propertyB { "propertyC": true } setProperty propertyA.propertyB {} set propertyA { "propertyB": { "propertyC": true } } setProperty propertyA {} set propertyD.0.propertyE { "propertyF": 1 } set propertyD.0 { "propertyE": { "propertyF": 1 } } set propertyD [ { "propertyE": { "propertyF": 1 } } ] setProperty propertyD {} setProperty propertyG "TRUE" set null { "propertyA": { "propertyB": { "propertyC": true } }, "propertyD": [ { "propertyE": { "propertyF": 1 } } ], "propertyG": "TRUE" }
Ventilated, Schematized Model
- Example A.4.
`
const schema = new Schema({ propertyA: { propertyB: {
} }, propertyD: [{ propertyE: {propertyC: Boolean
} }], propertyG: String }) const object = new Model({ propertyA: { propertyB: {propertyF: Number, propertyE: { propertyFFF: Number }
} }, propertyD: [{ propertyE: {propertyC: true
} }], propertyG: "true" }, schema, { events: { '** valid': eventLog, '** validProperty': eventLog, '** nonvalid': eventLog, '** nonvalidProperty': eventLog, }, enableEvents: true, }) console.log(object.toString({ space: 2, replacer: null }))propertyF: 1, propertyE: { propertyFFF: 1 }
***logs***
validProperty propertyA {
"propertyB": {
"propertyC": true
}
}
validProperty propertyA.propertyB {
"propertyC": true
}
validProperty propertyA.propertyB.propertyC true
valid propertyA.propertyB. {
"propertyC": true
}
valid propertyA. {
"propertyB": {
"propertyC": true
}
}
validProperty propertyD [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
]
validProperty propertyD.0 {
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
validProperty propertyD.0.propertyE {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
validProperty propertyD.0.propertyE.propertyF 1
validProperty propertyD.0.propertyE.propertyE {
"propertyFFF": 1
}
validProperty propertyD.0.propertyE.propertyE.propertyFFF 1
valid propertyD.0.propertyE.propertyE. {
"propertyFFF": 1
}
valid propertyD.0.propertyE. {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
valid propertyD.0. {
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
valid propertyD. [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
]
nonvalidProperty propertyG "true"
valid null {
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
],
"propertyG": "true"
}
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
]
}
`