Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork4
JSON:API specific algorithm for merging included resources into original data.
License
swaggerexpert/json-api-merge
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
@swaggerexpert/json-api-merge is a JSON:API specific redundant duplication algorithm for merging included resources into original data.
![]() | Get professionally supported @swaggerexpert/json-api-merge with Tidelift Subscription. |
npm i @swaggerexpert/json-api-merge
or
yarn add @swaggerexpert/json-api-merge
constjsonApiData={data:{id:1,type:'resource',attributes:{name:'Resource name',},relationships:{related:{data:{id:2,type:'related_resource',},},},},included:[{id:2,type:'related_resource',attributes:{name:'Related resource name',},},],};
importjsonApiMergefrom'@swaggerexpert/json-api-merge'jsonApiMerge(jsonApiData.included,jsonApiData.data)
constjsonApiMerge=require('@swaggerexpert/json-api-merge');jsonApiMerge(jsonApiData.included,jsonApiData.data);
Result would be following data structure.
{id:1,type:'resource',attributes:{name:'Resource name',},relationships:{related:{data:{id:2,type:'related_resource',attributes:{name:'Related resource name',},},},},}
The library can also process data inlist format and can transform this:
{data:[{id:1,type:'resource',attributes:{name:'Resource name',},relationships:{related:{data:{id:2,type:'related_resource',},},},}],included:[{id:2,type:'related_resource',attributes:{name:'Related resource name',},},],}
into this:
[{id:1,type:'resource',attributes:{name:'Resource name',},relationships:{related:{data:{id:2,type:'related_resource',attributes:{name:'Related resource name',},},},},}]
To reduce the number of HTTP requests, servers MAY allow responses that include related resourcesalong with the requested primary resources. Such responses are called“compound documents”.
constjsonApiData={data:[{type:'articles',id:'1',attributes:{title:'JSON:API paints my bikeshed!',},links:{self:'http://example.com/articles/1',},relationships:{author:{links:{self:'http://example.com/articles/1/relationships/author',related:'http://example.com/articles/1/author',},data:{type:'people',id:'9'},},comments:{links:{self:'http://example.com/articles/1/relationships/comments',related:'http://example.com/articles/1/comments',},data:[{type:'comments',id:'5'},{type:'comments',id:'12'},],},},},],included:[{type:'people',id:'9',attributes:{firstName:'Dan',lastName:'Gebhardt',twitter:'dgeb',},links:{self:'http://example.com/people/9',},},{type:'comments',id:'5',attributes:{body:'First!',},relationships:{author:{data:{type:'people',id:'2'},},},links:{self:'http://example.com/comments/5',},},{type:'comments',id:'12',attributes:{body:'I like XML better',},relationships:{author:{data:{type:'people',id:'9'},},},links:{self:'http://example.com/comments/12',},},],};
Compound documents can achieve full linkage with the following trick:
constincluded=jsonApiMerge(jsonApiData.included,jsonApiData.included);jsonApiMerge(included,jsonApiData.data);
This operation will generate following compound document with full linkage:
[{type:'articles',id:'1',attributes:{title:'JSON:API paints my bikeshed!',},links:{self:'http://example.com/articles/1',},relationships:{author:{links:{self:'http://example.com/articles/1/relationships/author',related:'http://example.com/articles/1/author',},data:{type:'people',id:'9',attributes:{firstName:'Dan',lastName:'Gebhardt',twitter:'dgeb',},links:{self:'http://example.com/people/9',},},},comments:{links:{self:'http://example.com/articles/1/relationships/comments',related:'http://example.com/articles/1/comments',},data:[{type:'comments',id:'5',attributes:{body:'First!',},relationships:{author:{data:{type:'people',id:'2',},},},links:{self:'http://example.com/comments/5',},},{type:'comments',id:'12',attributes:{body:'I like XML better',},relationships:{author:{data:{type:'people',id:'9',attributes:{firstName:'Dan',lastName:'Gebhardt',twitter:'dgeb',},links:{self:'http://example.com/people/9',},},},},links:{self:'http://example.com/comments/12',},},],},},},];
I was looking for a simple way how to merge theincluded intodata without compromising datastructures. All other libraries that I tested were opinionated about how the resulting merge should look like.This library has no opinion and simply merged theincluded intodata. It does nothing else.
If you want to contribute to this project, please consult theCONTRIBUTING.md guidelines.
Obtaining project copy
$ git clone https://github.com/swaggerexpert/json-api-merge $ npm i
Running tests
$ npm runtestRunning tests in browser
$ npm run test:web
Running linter
We're usingeslint andairbnb codestyle rules withprettier integrated as an eslint plugin.
$ npm run lint
Although @swaggerexpert/json-api-merge is written in ES2019, we also supportTypescript.When @swaggerexpert/json-api-merge gets imported into a Typescript project, typings are automatically imported and used.
char0n (Vladimír Gorej)
contact@swaggerexpert.com
https://swaggerexport.com/
About
JSON:API specific algorithm for merging included resources into original data.
Topics
Resources
License
Code of conduct
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.
