resources.js
A javascript data transformation layer.
Inspired by Laravels Eloquent API Resources.
Installation
npm i resources.js
Basic Usage
Create a resource, UserResource.js
.
const Resource = ; { return id: Numberthisid name: thisname email: thisemail created_at: thiscreated_at updated_at: thisupdated_at } moduleexports = UserResource;
Create some data, maybe in index.js
const data = id: '1' name: 'Bob' email: 'bob@bob.com' created_at: 'today' updated_at: 'today' posts: title: 'im cool' title: 'so cool cool' id: '2' name: 'Waldo' email: 'waldo@waldo.com' created_at: 'today' updated_at: 'today';
Then you can transform a single item:
const single = data0;console;/** * { data: { id: 1, name: 'Bob', email: 'bob@bob.com', posts: { data: [ { title: 'im cool - Title' }, { title: 'so cool cool - Title' } ] }, created_at: 'today', updated_at: 'today' } } */
Or all of them
const collection = UserResource;console;/** * { data: [ { id: 1, name: 'Bob', email: 'bob@bob.com', posts: { data: [ { title: 'im cool - Title' }, { title: 'so cool cool - Title' } ] }, created_at: 'today', updated_at: 'today' }, ... ] } */
Advance Usage
Data wrapper
You can enable the data wrapper by passing true to the second arguement for both methods.
const single = data0 true;console;/** * { id: 1, name: 'Bob', email: 'bob@bob.com', created_at: 'today', updated_at: 'today' } } */
Or all of them
const collection = UserResource;console;/** * [ { id: 1, name: 'Bob', email: 'bob@bob.com', created_at: 'today', updated_at: 'today' }, { id: 2, name: 'Waldo', email: 'waldo@waldo.com', posts: { data: [] }, created_at: 'today', updated_at: 'today' } ] */
If you pass a data
key to collections you cannot disable this option.
Pagination
If you pass a data
key to collections your transformation will be merged with the rest of the passed object.
Let's use a simple Paginator class.
{ return data meta: page: 1 total: datalength links: nextPage: '...' prevPage: '...' }
We'll return our data as data
key along with other pagination information like meta
and links
Now we can call collection
with the paginator
const paginated = UserResource;console;/** * { data: [ { id: 1, name: 'Bob', email: 'bob@bob.com', created_at: 'today', updated_at: 'today' }, ... meta: { page: 1, total: 2 }, links: { nextPage: '...', prevPage: '...' } }, */
Nested Resources
Transforming nested resources is not to difficult, just create a new resource like PostResource.js
const Resource = ; { return title: ` - Title` } moduleexports = PostResource;
Then modify the UserResource
{ return id: Numberthisid name: thisname email: thisemail posts: PostResource created_at: thiscreated_at updated_at: thisupdated_at }
Now when you do a transformation you'll see posts
/** * { id: 1, name: 'Bob', email: 'bob@bob.com', posts: { data: [ { title: 'im cool - Title' }, { title: 'so cool cool - Title' } ] }, created_at: 'today', updated_at: 'today' } } */