❂ 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 Manage
npm install objecture ⁘ Uses Core-Plex - Event Listener Management System.
⁜ Used by MVC Framework - Presentation Abtraction Control (PAC) Pattern.
Guide |
| :-- |
Object, Array, EventTarget APIs. string, number, boolean, null primitives; object, array. type, required, match, enum, range, length and custom validators. Object Events: assign, defineProperties/defineProperty, freeze, and seal events. Array Events: concat, copyWithin, fill, pop, push, reverse, shift, splice, and unshift events. Map Events: get, set, delete valid, nonvalid validProperty, nonvalidProperty events. report method.
import { Model, Schema } from 'objecture'
`
$3
- Example A.1.
`
const content = {
propertyA: {
propertyB: {
propertyC: true
}
},
propertyD: [{
propertyE: {
propertyF: 1
}
}],
propertyG: "TRUE"
}
const object = new Model(content)
console.log(object.toString({ space: 2, replacer: null }))
console.log("pass", object.toString() === JSON.stringify(content))`
object.valueOf logs:
`
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1
}
}
],
"propertyG": "TRUE"
}
`
$3
- Example A.2.
`
const schema = {
propertyA: {
propertyB: {
propertyC: Boolean
}
},
propertyD: [{
propertyE: {
propertyF: Number,
propertyE: {
propertyFFF: Number
}
}
}],
propertyG: String
}
const content = {
propertyA: {
propertyB: {
propertyC: true
}
},
propertyD: [{
propertyE: {
propertyF: 1,
propertyE: {
propertyFFF: 1
}
}
}],
propertyG: true
}
const object = new Model(content, schema)
console.log(object.toString({ space: 2, replacer: null }))
`
object.toString logs:
`
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
],
"propertyG": "true"
}
`
(propertyG nonvalid)$3
- Example A.3.
`
function eventLog($event) {
console.log($event.type, $event.path, JSON.stringify($event.value))
}
const content = {
propertyA: {
propertyB: {
propertyC: true
}
},
propertyD: [{
propertyE: {
propertyF: 1
}
}],
propertyG: "TRUE"
}
const object = new Model(content, null, {
events: {
'propertyA.propertyB setProperty': eventLog,
'propertyA setProperty': eventLog,
'setProperty': eventLog,
'propertyD pushProp': eventLog,
'propertyD.[0-9] set': eventLog,
'** set': eventLog,
},
enableEvents: true
})
console.log(object.toString({ space: 2, replacer: null }))
`
logs
`
setProperty propertyA.propertyB.propertyC true
set propertyA.propertyB {
"propertyC": true
}
setProperty propertyA.propertyB {
"propertyC": true
}
set propertyA {
"propertyB": {
"propertyC": true
}
}
setProperty propertyA {
"propertyB": {
"propertyC": true
}
}
set propertyD.0.propertyE {
"propertyF": 1
}
2set propertyD.0 {
"propertyE": {
"propertyF": 1
}
}
set propertyD [
{
"propertyE": {
"propertyF": 1
}
}
]
setProperty propertyD [
{
"propertyE": {
"propertyF": 1
}
}
]
setProperty propertyG "TRUE"
set null {
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1
}
}
],
"propertyG": "TRUE"
}
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1
}
}
],
"propertyG": "TRUE"
}
`
$3
- Example A.4.
`
const schema = new Schema({
propertyA: {
propertyB: {
propertyC: Boolean
}
},
propertyD: [{
propertyE: {
propertyF: Number,
propertyE: {
propertyFFF: Number
}
}
}],
propertyG: Boolean
})
const content = {
propertyA: {
propertyB: {
propertyC: true
}
},
propertyD: [{
propertyE: {
propertyF: 1,
propertyE: {
propertyFFF: 1
}
}
}],
propertyG: "true"
}
const object = new Model(content, schema, {
events: {
'** validProperty': eventLog,
'** nonvalidProperty': eventLog,
},
enableEvents: true,
})
console.log(object.toString({ space: 2, replacer: null }))
`
logs
`
validProperty propertyA
validProperty propertyA.propertyB
validProperty propertyA.propertyB.propertyC
validProperty propertyD
validProperty propertyD.0
validProperty propertyD.0.propertyE
validProperty propertyD.0.propertyE.propertyF
validProperty propertyD.0.propertyE.propertyE
validProperty propertyD.0.propertyE.propertyE.propertyFFF
nonvalidProperty propertyG
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1
}
}
}
]
}
`
(propertyG nonvalid)$3
- Example A.5.
`
const schema = new Schema({
propertyA: {
propertyB: {
propertyC: Boolean
}
},
propertyD: [{
propertyE: {
propertyF: Number,
propertyE: { required: true, type: {
propertyFFF: Number,
propertyGGG: Boolean,
} },
propertyFF: { required: true, type: Boolean },
}
}],
propertyG: Boolean
})
const content = {
propertyA: {
propertyB: {
propertyC: true
}
},
propertyD: [{
propertyE: {
propertyF: 1,
propertyE: {
propertyFFF: "1",
propertyGGG: "true",
},
propertyFF: true,
}
}, {
propertyE: {
propertyF: 1,
propertyE: {
propertyFFF: 1,
propertyGGG: true,
},
propertyFF: true,
}
}],
propertyG: true
}
const object = new Model(content, schema, {
events: {
'** validProperty': eventLog,
'** nonvalidProperty': eventLog,
},
enableEvents: true,
})
console.log(object.toString({ space: 2, replacer: null }))`
logs
`
validProperty propertyA
validProperty propertyA.propertyB
validProperty propertyA.propertyB.propertyC
validProperty propertyD
nonvalidProperty propertyD.0
validProperty propertyD.1
validProperty propertyD.1.propertyE
validProperty propertyD.1.propertyE.propertyF
validProperty propertyD.1.propertyE.propertyE
validProperty propertyD.1.propertyE.propertyE.propertyFFF
validProperty propertyD.1.propertyE.propertyE.propertyGGG
validProperty propertyD.1.propertyE.propertyFF
validProperty propertyG
{
"propertyA": {
"propertyB": {
"propertyC": true
}
},
"propertyD": [
null,
{
"propertyE": {
"propertyF": 1,
"propertyE": {
"propertyFFF": 1,
"propertyGGG": true
},
"propertyFF": true
}
}
],
"propertyG": true
}
`
(propertyD.0` nonvalid)