Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/peternaydenov/dt-shape
Build data by using shapes
https://github.com/peternaydenov/dt-shape
Last synced: 4 days ago
JSON representation
Build data by using shapes
- Host: GitHub
- URL: https://github.com/peternaydenov/dt-shape
- Owner: PeterNaydenov
- License: mit
- Created: 2017-02-05T06:03:06.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2024-10-16T15:23:09.000Z (about 1 month ago)
- Last Synced: 2024-10-18T11:07:44.851Z (28 days ago)
- Language: JavaScript
- Size: 272 KB
- Stars: 0
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DT Shape v.3.x.x
![version](https://img.shields.io/github/package-json/v/peterNaydenov/dt-shape)
![license](https://img.shields.io/github/license/peterNaydenov/dt-shape)Build data structures by using data-shapes. The data-shape should looks like that:
```js
const dtShape = require ( 'dt-shape' )
let shape = {
'name' : [ 'firstName' , 'name' ] // -> list of possible sources
/* ^ ^ ^
| | +---> top priority is always in the end
| +---> search for values in these keys
|
Create property with this name
*/
}
// Important! Data should be provided as dt-object. If is not - convert it first.
// dt-shape contains compatible version of dt-box.
const dtbox = dtShape.getDTtoolbox ()
// Use dt-toolbox library:
let dt = dtbox.init(data)
// Build data according shape. Result will be a dt-object.
let resultDT = dtShape ( dt , shape )
// If you need a standard JS object, dt-object has a convertor by calling a 'model' function:
let jsObject = dtShape ( dt, shape ).model (()=>({'as':'std'}))
```## What is DT?
DT object is an object created by library `dt-toolbox`. It's a tool for handle a heavy javascript structures. You can manipulate, reshape or/and extract the information of it. Immutability is taken as consideration by this library.
Read more about DT on [dt-toolbox page](https://github.com/PeterNaydenov/dt-toolbox).## Installation
### Node
Install node package:
```
npm install dt-shape --save
```Once it has been installed, it can be used by writing this line of JavaScript code:
```js
import dtShape from 'dt-shape'```
or require it:
```js
const dtShape = require ( 'dt-shape' )
```## How it works?
`dtShape` is simple function that have two arguments - (`source data`, `data shape`) and returns a result as it explained in the data shape.### Source Data
Source data should be dt-object. Any standard javascript structure can be converted to DT by single row of code.```js
// Always load dt-toolbox from dtShape library
// This will preserve compatibility among library versions
let
dtbox = dtShape.getDTtoolbox ()
, dt = dtbox.init( jsObject )
;
```### Data Shape
`Data shape` represents connection between `source data` and result object. Keys will become a result property names. Values are `source data` keys where dtShape function will search for data. Values of the shape object are always **array**. Simple example:``` js
let shape = { 'newName' : ['firstName']}```
This shape creates object with property 'newName'. Value for 'newName' is taken from `source data` object, property 'firstName' . Shape values can contain more than one member.```js
let shape = { 'newName' : ['firstName','name'] }
```
This example says that result should have property 'newName' and value should be in keys 'firstName' or 'name' of the `source data`. This make possible to use same `data shape` with large variety of `source data` structures and result will be the same. Priority is always on last member of the array.### Data Shape - Key Prefixes
Keys can contain prefixes like `list!`, `fold!`, and `load!`.- `fold!` prefix will search for properties and will fold them inside object. Example:
```js
// shape with fold
let shape = { 'fold!name' : ['firstName','lastName']}
/*
expected result should have
{
name : {
firstName : 'someValue'
, lastName : 'someOtherValue'
}
}
*/
```- `list!` prefix will return list of values
```js// shape with fold
let shape = { 'list!family' : ['spouse','wife','kid']}
/*
expected result should have
{
family : [ 'spouseName', 'wifeName', 'eventualKidName' , 'OtherKidName' ]
}
*/
```- `load!` prefix loads data from external source. Source could be function, primitive or object.
```js
const
dtbox = dtShape.getDTtoolbox ()
, name = 'Peter'
, shape = { 'load!firstName' : [ name ] }
;let sourceData = dtbox.init ({ 'root/name' : 'Ivo' });
let result = dtShape ( sourceData, shape ).model(()=>({as:'std'}));
/*
->
{
firstName : 'Peter'
}
*/
```## Examples
### Simple example
```js
const
dtShape = require ( 'dt-shape' )
, dtbox = dtShape.getDTtoolbox ()
;let source = {
firstName : 'Peter'
, familyName : 'Naydenov'
};// convert object to DT
let dtSource = dtbox.init ( source );// Prepare the shape
let userShape = {
'userName' : [ 'firstName' ]
'profile/name' : [ 'firstName' ]
, 'profile/lastName' : [ 'familyName']
}let user = dtShape ( dtSource, userShape ).model ( () => ({as:'std'}))
/*
user should be:
{
userName: 'Peter'
, profile: {
name: 'Peter'
, lastName: 'Naydenov'
}
}
*/```
Find some examples in `./test` folder.
## Known bugs
_(Nothing yet)_## Release History
### 3.1.0 ( 2024-02-03 )
- [x] Dependency update. `dt-toolbox` to ver. 7.4.2;
- [x] Folder 'dist' was added to the project. Includes commonjs, umd and esm versions of the library;
- [x] Package.json: "exports" section was added. Allows you to use package as commonjs or es6 module without additional configuration;
- [x] Rollup was added to the project. Used to build the library versions;### 3.0.3 ( 2024-01-14)
- [x] Dependency update. `dt-toolbox` to ver. 7.4.1;
- [x] Dev dependencies update. [email protected];
- [x] Dev dependencies update. [email protected];### 3.0.2 ( 2023-11-03)
- [x] Update `dt-toolbox` to ver. 7.4.0;### 3.0.1 ( 2023-10-10)
- [x] Update `dt-toolbox` to ver. 7.2.0;### 3.0.0 ( 2023-06-02)
- [x] Update `dt-toolbox` to ver. 6.0.0;
- [x] Result is coming as a dt-object;### 2.0.5 ( 2022-05-29)
- [x] Update `dt-toolbox` to ver. 4.0.7;### 2.0.3 (2022-03-07)
- [x] Update `dt-toolbox` to ver. 4.0.6;### 2.0.1 (2021-03-25)
- [x] Update `dt-toolbox` to ver. 3.1.0;### 2.0.0 (2021-03-01)
- [x] Works with v.3.x.x of `dt-toolbox`;
- [x] Changes in DT objects according v.3.x.x of dt-toolbox;
- [x] Documentation for old version v.1.x.x is available [here](https://github.com/PeterNaydenov/dt-shape/blob/master/README_v.1.x.x.md);
- [x] Library is using a 'generator functions'. If support for old browsers is required, add a polyfill for 'generators' or get back to version 1.x.x of the library;### 1.0.2 (2019-06-02)
- [x] Update dependencies: Dt-toolbox v.2.1.0;
- [x] Upgrade dependencies: Webpack v.4.32.2;
- [x] Browser version update;
- [x] Documentation update;### 1.0.0 (2017-12-28)
- [x] Project folder reorganization;
- [x] Test coverage. Istanbul;
- [x] Test coverage on 100%;
- [x] Version for browsers. Dt-toolbox included;
- [x] Documentation update;### 0.1.6 (2017-04-22)
- [x] Update dependency dt-toolbox to 1.6.0;### 0.1.5 (2017-03-28)
- [x] Update dependency dt-toolbox to 1.4.0;### 0.1.4 (2017-02-24)
- [x] Documentation update only;### 0.1.2 (2017-02-21)
- [x] Fix: Problematic updates with wrong values;### 0.1.0 (2017-02-20)
- [x] Prefix `load!` loads data from external source;
- [ ] Error: Problematic updates with wrong values;### 0.0.3 (2017-02-17)
- [x] Just documentation update;### 0.0.1 (2017-02-05)
- [x] Initial code;
- [x] Test package;
- [x] Documentation;## Credits
'dt-shape' was created by Peter Naydenov.## License
'dt-shape' is released under the [MIT License](http://opensource.org/licenses/MIT).