A Laravel(ish) Resource/Transformer in javascript.

My basic attempt at javascript data transformation, resources.js

check out the npm package, resources.js

We‘ve gone serverless at work and we’re using my favorite, nodejs! That means a lot of javascript.

I’ve been using callbacks to transform my results but I’ve become accustomed to Fractal and now Laravels own Eloquent Resources. I like having a “view layer” for my responses, it makes things a lot easier to modify months later.

I don’t need all the features, just basic transformation, so the script is pretty slim.

Resources are defined nearly the same as Laravel.

class UserResource extends Resource {
toArray() {
return {
id: Number(this.id),
name: this.name,
email: this.email,
posts: PostResource.collection(this.posts),
created_at: this.created_at,
updated_at: this.updated_at,
}
}
}

You even execute it nearly the same.

// Collections are static
const collection = UserResource.collection(data);
// Single items are not
const single = new UserResource(data[0]).exec();

Is it the same? Not at all, Laravel and Fractal actually do a bit more. I’m in the market for something similar but simpler, if you are too maybe this will be of use.

It would be nice to have more features, use a process method and the filter for even more options. We’ll see where it goes.

Update:

By default your results will be wrapped in a data key. You can disable this by passing the second parameter as false.

new UserResource({...}, false).exec()
UserResource.collection(data, false)

You can now pass a paginated object to collection, the data field is required for parsing. The rest of your fields will be merged with the results.

A full example

I’ve made this a package instead, check out the npmjs page for its readme.

Conclusion

I love writing javascript. It’s fun. I hope sharing will help provide some feed back so please let me know your opinions.

Like what you read? Give Will Bowman a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.