UNPKG

objecture

Version:

❂ 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

426 lines (415 loc) 9.42 kB
# ❂ 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**](https://www.npmjs.com/package/core-plex) - Event Listener Management System.  ⁜ Used by [**MVC Framework**](https://www.npmjs.com/package/mvc-framework) - Presentation Abtraction Control (PAC) Pattern. [**Guide**](./document/guide/index.md) | | :-- | ## ⏣ Introduction - Manage structured data models using *familiar* JS `Object`, `Array`, `EventTarget` APIs. - Schematize data structures with property validators. - Capture data model **and** validation events for property changes (including nested property events). ## ⏣ Impetus - Frontend, backend applications require or benefit from structured data models with validatable schema. - Detecting changes to structured through property events promotes event-driven application architecture. - Few libraries offer *both* browser-**and**-Node-compatible schematized data models with validators **or** that nested property change events. ## ⏣ Impact - **Manage data models** for primitive/object data types: - `string`, `number`, `boolean`, `null` primitives; - `object`, `array`. - **Schematize data models** with property validators. - `type`, `required`, `match`, `enum`, `range`, `length` and *custom* validators. - [**Capture data model events**](./document/guide/model/events/index.md) for *any* methods that modify data models. - `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` - **Capture validation events/data** for array/object properties. - `valid`, `nonvalid` `validProperty`, `nonvalidProperty` events. - Schema validation object with `report` method. ## ⏣ Illustrations - [Model](#model) - [Schematized Model](#schematized-model) - [Ventilated Model](#ventilated-model) - [Ventilated, Schematized Model (Nonvalid Literal)](#ventilated-schematized-model-nonvalid-literal) - [Ventilated, Schematized Model (Nonvalid Object)](#ventilated-schematized-model-nonvalid-object) ``` import { Model, Schema } from 'objecture' ``` ### Model - [Example A.1.](./demonstrament/documents/model/examples/readme.md/example-a-1/index.js) ``` 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" } ``` ### Schematized Model - [Example A.2.](./demonstrament/documents/model/examples/readme.md/example-a-2/index.js) ``` 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) ### Ventilated Model - [Example A.3.](./demonstrament/documents/model/examples/readme.md/example-a-3/index.js) ``` 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" } ``` ### Ventilated, Schematized Model (Nonvalid Literal) - [Example A.4.](./demonstrament/documents/model/examples/readme.md/example-a-4/index.js) ``` 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) ### Ventilated, Schematized Model (Nonvalid Object) - [Example A.5.](./demonstrament/documents/model/examples/readme.md/example-a-5/index.js) ``` 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)