Skip to content

cdaringe/primitivify

Repository files navigation

primitivify

deep copy data keeping only primitives in nested data structures. useful for serializing complex objects where you only care about the raw data contained within.

"primitive-ify"

TypeScript package semantic-release

install

npm install --save primitivify

usage

the best demonstration of the value of this module is exemplified from the tests!

import primitivify from "primitivify";
const dummyFn = () => {};
const complex = {
  dummyFn,
  a: {
    b: {
      c: setTimeout(() => {}, 0),
    },
    d: setInterval(dummyFn, 1e3),
  },
  b: [dummyFn, "wee", { e: "e" }],
};
t.deepEqual(
  {
    // observe how non-primitive datas are nulled away
    dummyFn: null,
    a: {
      b: {
        c: null,
      },
      d: null,
    },
    b: [null, "wee", { e: "e" }],
  },
  primitivify(complexObj),
  "complex"
);

primitivify is immutable--calls return deeply cloned values.

need a custom serializer? use the 2nd argument, onVisit, to transform the current value being inspected:

primitivify(
  { a: () => {} },
  v => typeof v === 'function' ? 'wee' : v)
)
// { a: 'wee' }

why

generally to decomplect objects and/or arrays. consinder a simple example:

JSON.stringify({ usefulData: "beep", a: setTimeout(() => {}, 0) });

/*
Thrown:
TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Timeout'
    |     property '_idlePrev' -> object with constructor 'TimersList'
    --- property '_idleNext' closes the circle
    at JSON.stringify (<anonymous>)
*/

JSON.stringify(primitivify({ a: setTimeout(() => {}, 0) }));
/*
'{"usefulData":"beep","a":null}'
*/