JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 636
  • Score
    100M100P100Q113384F
  • License MIT

Package Exports

  • typeserializer

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (typeserializer) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

TypeSerializer

Build Status Coverage Status

Serializer designed to make prettier code while using exclusion strategies on objects.

Table of contents

Installation

Install using npm:

 $ npm install typeserializer --save

If you're using Express you can also use an additional decorator, to make your controllers look nicer. Go to the Express Integration section.

Strategies

Manual Exclude

While using the manual exclude you only need to decorate the class with the @TypeSerializer annotation. Now, every property will be INCLUDED in the response, unless you manually @Exclude them with the annotation.

 import {TypeSerializer, Exclude} from 'typeserializer';

 @TypeSerializer()
 class SomeObject {
 
   foo = 'foo';
   
   @Exclude()
   bar = 'bar';
 }
 
 const obj = new SomeObject();
 console.log(obj); // prints: '{ foo: 'foo' }'

Exclude All

While using the all as the exclusion strategy it excludes all properties except for the ones who marked as @Exposed().

 import {TypeSerializer, Expose, ExclusionStrategies} from 'typeserializer';

 @TypeSerializer(ExclusionStrategies.All)
 class SomeObject {
 
   foo = 'foo';
   
   @Expose()
   bar = 'bar';
 }
 
 const obj = new SomeObject();
 console.log(obj); // prints: '{ bar: 'bar' }'

Groups

You can expose different properties by using the @Groups annotation.

 import {TypeSerializer, Expose, ExclusionStrategies, Groups, serialize} from 'typeserializer';

 @TypeSerializer(ExclusionStrategies.All)
 class User {
 
   @Expose()
   @Groups(['user-account'])
   username = 'Dan';
 
   @Expose()
   @Groups(['user-details'])
   age = 28;
 
   password = 'foo';
 }
 
 const user = new User();
 console.log(user); // prints: '{ username: 'Dan', age: 28 }'
 
 console.log(serialize(user, ['user-account'])); // prints: '{ username: 'Dan' }'
 console.log(serialize(user, ['user-details'])); // prints: '{ age: 28 }'
 console.log(serialize(user, ['user-account', 'user-details'])); // prints: '{ username: 'Dan', age: 28 }'

Deep Objects

TypeSerializer can also serialize deep objects.

 import {TypeSerializer, Expose, ExclusionStrategies, Groups, serialize} from 'typeserializer';

@TypeSerializer(ExclusionStrategies.All)
class UserDetails {

  @Expose()
  @Groups(['name'])
  firstName = 'Dan';

  @Expose()
  @Groups(['name'])
  lastName = 'Revah';

  @Expose()
  @Groups(['other'])
  age = 28; 
}

 @TypeSerializer(ExclusionStrategies.All)
 class User {
 
   @Expose()
   @Groups(['user-account'])
   username = 'Dan';
 
   @Expose()
   @Groups(['user-details'])
   details = new UserDetails();
 
   password = 'foo';
 }
 
 console.log(serialize(user, ['user-details'])); // prints: { details: { firstName: 'Dan', lastName: 'Revah', age: 28 } }
 console.log(serialize(user, ['user-details', 'name'])); // prints: { details: { firstName: 'Dan', lastName: 'Revah' } }
 console.log(serialize(user, ['user-details', 'other'])); // prints: { details: { age: 28 } }

Version

You can also serialize property by version number with @Before & @After.

 import {TypeSerializer, Expose, ExclusionStrategies, serialize, Before, After} from 'typeserializer';

 @TypeSerializer(ExclusionStrategies.All)
 class UserDetails {
 
   @Expose()
   @Before('1.2.0')
   firstName = 'Dan';
 
   @Expose()
   @Before('1.2.0')
   lastName = 'Revah';
 
   @Expose()
   @After('1.2.0')
   fullName = 'Dan Revah';
 }
 
 const user = new UserDetails();
 console.log(user); // prints: '{ firstName: 'Dan', lastName: 'Revah', fullName: 'Dan Revah' }'
 
 console.log(serialize(user, [], { version: '0.4.2' })); // prints: '{ firstName: 'Dan', lastName: 'Revah' }'
 console.log(serialize(user, [], { version: '1.1.9' })); // prints: '{ firstName: 'Dan', lastName: 'Revah' }'
 
 console.log(serialize(user, [], { version: '1.2.0' })); // prints: '{ fullName: 'Dan Revah' }'
 console.log(serialize(user, [], { version: '1.3.0' })); // prints: '{ fullName: 'Dan Revah' }'

Dynamic Exclusion

If you would like to use a dynamic approach as an exclusion strategy, you could then use the dynamic exclusion.

 function validator(object: any, propertyKey: string) {
   return propertyKey === 'prop';
 }
 
 @TypeSerializer(ExclusionStrategies.All)
 class Foo {
 
   @Expose(validator)
   prop = 'prop';
 
   @Expose(validator)
   prop2 = 'prop2';
 
   @Expose(validator)
   prop3 = 'prop3';
 }
 
 const foo = new Foo();
 console.log(serialize(foo)); // prints: '{ prop: 'prop: }'

Express Integration

It's suggested to use the annotation @TypeSerializerResponse while working with Express.

  1. Add a middleware BEFORE the routes:
    import {TypeSerializerMiddleware} from 'typeserializer';
    
    // ... 
    
    app.use(TypeSerializerMiddleware());
    
    // OR with a version number to use with @Before & @After
    app.use(TypeSerializerMiddleware({ version: '1.0.2' }));
  1. Example of usage:

user.entity.ts:

 import {TypeSerializer, Expose, ExclusionStrategies, Groups, serialize} from 'typeserializer';

 // Defining an object
 
 @TypeSerializer(ExclusionStrategies.All)
 class User {
 
   @Expose()
   @Groups(['user-account'])
   username = 'Dan';
 
   @Expose()
   @Groups(['user-details'])
   age = 28;
 
   password = 'foo';
 }

user.ctrl.ts:

IMPORTANT: you should use tsJson instead of json in order to use TypeSerializer.

import {TypeSerializerResponse} from 'typeserializer';

class UserCtrl {
 
   @TypeSerializerResponse(['user-account'])
   static getAccountDetails(req, res) {
     const user = new User();
     return res.status(418).tsJson(a); // prints: '{ username: 'Dan' }'
   }
 }
 
 const express = require('express');
 const router = express.Router();
 
 router.get('/user/account', UserCtrl.getAccountDetails);