0.5.12 • Published 4 years ago

serialify v0.5.12

Weekly downloads
3
License
MIT
Repository
github
Last release
4 years ago

serialify Build Status Coverage Status

Extended object serializer/deserializer for Node.js and browser written in TypeScript.

Feature

  • Minimal: input any supported object, and get serialized/deserialized.
  • Fast: it's basically a recursive if statement.
  • Tiny: only 1.7kb of gzipped.

Supported data types

serialify can serialize many data types which is not supported by standard JSON!

typestandard JSONserialify
number
boolean
string
null
Array
Object
undefined
bigint
NaN
Infinity
Date
RegExp
Set
Map
URL
URLSearchParams
Buffer
DataView
ArrayBuffer
Int8Array
Uint8Array
Uint8ClampedArray
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
BigInt64Array
BigUint64Array

Installation

npm install serialify

Usage

Serialize

import {serialize} from 'serialify'

serialize({
  String:            'John',
  Number:            28,
  Boolean:           true,
  Null:              null,
  Array:             [0, 1],
  Object:            {a: 0, b: 1},
  Infinity:          Infinity,
  NaN:               NaN,
  Undefined:         undefined,
  Date:              new Date(),
  Symbol:            Symbol('test'),
  RegExp:            new RegExp('^http:\/\/(.*?)(\/|$)', 'i'),
  BigInt:            BigInt('2'),
  Set:               new Set([0, 1]),
  Map:               new Map([['a', 0], ['b', 1]]),
  URL:               new URL('https://google.com'),
  URLSearchParams:   new URLSearchParams({q: 'github'}),
  Buffer:            Buffer.from('abcd'),
  DataView:          new DataView(new Uint8Array([0, 1, 2, 3]).buffer, 1, 2),
  ArrayBuffer:       new Uint8Array([0, 1, 2, 3]).buffer,
  Int8Array:         new Int8Array([0, 1, 2, 3]),
  Uint8Array:        new Uint8Array([0, 1, 2, 3]),
  Uint8ClampedArray: new Uint8ClampedArray([0, 1, 2, 3]),
  Int16Array:        new Int16Array([0, 1, 2, 3]),
  Uint16Array:       new Uint16Array([0, 1, 2, 3]),
  Int32Array:        new Int32Array([0, 1, 2, 3]),
  Uint32Array:       new Uint32Array([0, 1, 2, 3]),
  Float32Array:      new Float32Array([0, 1, 2, 3]),
  Float64Array:      new Float64Array([0, 1, 2, 3,]),
  BigInt64Array:     new BigInt64Array([BigInt('1')]),
  BigUint64Array:    new BigUint64Array([BigInt('1')]),

  // Nested Objects
  NestedArray:       [new Date(), 10, {Set: new Set([0, 1])}],
  NestedObject:      {Date: new Date(), Object: {Number: 10, NaN: NaN}},
  NestedSet:         new Set([new Set([0, 1])]),
  NestedMap:         new Map([['a', 0], ['b', new Map([['c', 1]])]]),
})

The code above will produce the following serialized object:

{
  String:            'John',
  Number:            28,
  Boolean:           true,
  Null:              null,
  Array:             [0, 1],
  Object:            {a: 0, b: 1},
  Infinity:          { __t: 'Number', __v: 'infinity' },
  NaN:               { __t: 'Number', __v: 'nan' },
  Undefined:         { __t: 'Undefined', __v: 'undefined' },
  Date:              { __t: 'Date', __v: 1601111145054 },
  Symbol:            { __t: 'Symbol', __v: 'test' },
  RegExp:            { __t: 'RegExp', __v: {source: '^http:\\/\\/(.*?)(\\/|$)', flags: 'i'} },
  BigInt:            { __t: 'BigInt', __v: '2' },
  Set:               { __t: 'Set', __v: [0, 1] },
  Map:               { __t: 'Map', __v: [['a', 0], ['b', 1]] },
  URL:               { __t: 'URL', __v: 'https://google.com' },
  URLSearchParams:   { __t: 'URLSearchParams', __v: 'q=github' },
  Buffer:            { __t: 'Buffer', __v: [97, 98, 99, 100] },
  DataView:          { __t: 'DataView', __v: {buffer: [0, 1, 2, 3], byteOffset: 1, byteLength: 2} },
  ArrayBuffer:       { __t: 'ArrayBuffer', __v: [0, 1, 2, 3] },
  Int8Array:         { __t: 'Int8Array', __v: [0, 1, 2, 3] },
  Uint8Array:        { __t: 'Uint8Array', __v: [0, 1, 2, 3] },
  Uint8ClampedArray: { __t: 'Uint8ClampedArray', __v: [0, 1, 2, 3] },
  Int16Array:        { __t: 'Int16Array', __v: [0, 1, 2, 3] },
  Uint16Array:       { __t: 'Uint16Array', __v: [0, 1, 2, 3] },
  Int32Array:        { __t: 'Int32Array', __v: [0, 1, 2, 3] },
  Uint32Array:       { __t: 'Uint32Array', __v: [0, 1, 2, 3] },
  Float32Array:      { __t: 'Float32Array', __v: [0, 1, 2, 3] },
  Float64Array:      { __t: 'Float64Array', __v: [0, 1, 2, 3] },
  BigInt64Array:     { __t: 'BigInt64Array', __v: ['1'] },
  BigUint64Array:    { __t: 'BigUint64Array', __v: ['1'] },

  // Nested Objects
  NestedArray: [
    { __t: 'Date', __v: 1601111145054 },
    10,
    {
      Set: { __t: 'Set', __v: [0, 1] }
    }
  ],
  NestedObject: {
    Date: { __t: 'Date', __v: 1601111145054 },
    Object: {
      Number: 10,
      NaN: { __t: 'Number', __v: 'nan' }
    }
  },
  NestedSet: { __t: 'Set', __v: [
    { __t: 'Set', __v: [0,1] }
  ]},
  NestedMap: { __t: 'Map', __v: [
    ['a', 0],
    ['b', { __t: 'Map', __v: [['c', 1]] }]
  ]},
}

typing

For TypeScript, serialize() will also translate the type of the source object.

import {serialize} from 'serialify'

const obj = {name: 'John', birth: new Date()}

const s = serialize(obj)

/**
 * s: {
 *  name: string;
 *  birth: { __t: 'Date', __v: number };
 * }
 **/

Stringify

To get a json string representation of serialized object directly, just import and call stringify().

import {stringify} from 'serialify'

stringify({
  String: 'John',
  Number: 28,
  Set: new Set([0, 1, 2, 3]),
  Date: new Date()
})

The code above will produce the following string:

'{ "String": "John", "Number": 28, "Set": { "__t": "Set", "__v": [0, 1, 2, 3] }, "Date": { "__t": "Date", "__v": 1600392736750 } }'

Deserialize

deserialize() to make serialized object back into it's origin.

import {serialize, deserialize} from 'serialify'

const obj = {
  String: 'John',
  Number: 28,
  Set: new Set([0, 1, 2, 3]),
  Date: new Date()
}

const serialized = serialize(obj)

/**
 * serialized = {
 *  String: 'John',
 *  Number: 28,
 *  Set: { __t: 'Set', __v: [0, 1, 2, 3] },
 *  Date: { __t: 'Date', __v: 1600392736750 }
 * }
 **/

deserialize(serialized)

/**
 * {
 *  String: 'John',
 *  Number: 28,
 *  Set: Set([0, 1, 2, 3]),
 *  Date: Date(1600392736750),
 * }
 **/

typing

deserialize() will also translate the type of the serialized object, just like serialize() does.

import {serialize, deserialize} from 'serialify'

const obj = {name: 'John', birth: new Date()}

const s = serialize(obj)

const d = deserialize(s)

/**
 * d: {
 *  name: string;
 *  birth: Date;
 * }
 **/

Parse

parse() to deserialize JSON string created by stringify().

import {stringify, parse} from 'serialify'

const jsonString = stringify({
  String: 'John',
  Number: 28,
  Set: new Set([0, 1, 2, 3]),
  Date: new Date()
})

parse(jsonString)

/**
 * {
 *  String: 'John',
 *  Number: 28,
 *  Set: Set([0, 1, 2, 3]),
 *  Date: Date(1600392736750),
 * }
 **/
0.5.11

4 years ago

0.5.12

4 years ago

0.5.8

4 years ago

0.5.7

4 years ago

0.5.5

4 years ago

0.5.4

4 years ago

0.4.5

4 years ago

0.5.3

4 years ago

0.5.0

4 years ago

0.5.2

4 years ago

0.5.1

4 years ago

0.4.4

4 years ago

0.4.3

4 years ago

0.4.2

4 years ago

0.4.1

4 years ago

0.4.0

4 years ago

0.3.1

4 years ago

0.3.0

4 years ago

0.2.4

4 years ago

0.2.3

4 years ago

0.2.2

4 years ago

0.2.1

4 years ago

0.2.0

4 years ago

0.1.1

4 years ago

0.1.0

4 years ago