0.0.1 • Published 2 years ago

@han-moe-htet/funkify v0.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Funkify · GitHub license npm version

Serialize and deserialize objects including functions, async functions, class instances, classes. Uses JSON.stringify and JSON.parse under the hood with the replacer function that prepend myFunction.toString() with a <FUNCTION> prefix. Support for native functions is included. Variables used inside the function must be scoped correctly. See caveats section below.

Installation

yarn add @han-moe-htet/funkify

Or

npm install @han-moe-htet/funkify

Usage

Serialize object with function

import assert from 'assert';
import { Funkify } from '@han-moe-htet/funkify';

const funkify = new Funkify();

const obj = {
  name: 'world',
  hello: (name: string) => `Hello ${name}`,
};

const serialized = funkify.serialize(obj);

const deserialized = funkify.deserialize<typeof obj>(serialized);

assert.equal(obj.hello(obj.name), deserialized.hello(deserialized.name));

Serialize function

const hello = (name: string) => `Hello ${name}`;

const serialized = funkify.serializeFunction(hello);

const deserialized = funkify.deserializeFunction<typeof hello>(serialized);

assert.equal(hello('world'), deserialized('world'));

Serialize native function

Since toString of native methods returns function () { [native code] }, you need to use a special function serializeNativeFunction add pass the native function path to serialize native functions. Native functions will be prefixed with <FUNCTION><NATIVE>.

try {
  serialized = funkify.serialize(now);
} catch (e) {
  if (e instanceof InvalidFunctionException) {
    serialized = funkify.serializeNativeFunction('Date.now');
  } else {
    throw e;
  }
}

assert.equal(now, funkify.deserializeNativeFunction<typeof now>(serialized));

Or you can wrap the native function with a custom function and serialize the custom function.

const now = () => Date.now();

const serialized = funkify.serialize(now);
const deserialized = funkify.deserialize<typeof now>(serialized);

Serialize class instance

class Hello {
  constructor(private name: string) {}

  hello() {
    return `Hello ${this.name}`;
  }
}

const obj = new Hello('world');

const serialized = funkify.serialize({
  ...obj,
  hello: obj.hello,
});

const deserialized = funkify.deserialize<typeof obj>(serialized);

Serialize class

const serialized = funkify.serialize(Hello);

const NewHello = funkify.deserialize<typeof Hello>(serialized);

assert.equal(Hello.toString(), NewHello.toString());
assert.equal(new Hello('world').hello(), new NewHello('world').hello());

See more examples at examples.

Caveats

The following deserialized function will throw error because the scope of name variable is lost when serialized.

const name = 'world';
const hello = () => `Hello ${name}`;

const serialized = funkify.serialize(hello);
const deserialized = funkify.deserialize<typeof hello>(serialized);

Development

  1. Clone the repository
  2. Run the following command to install local package in the app directory.
yarn link && yarn --cwd app link @han-moe-htet/funkify
  1. Run the following command to run the app.
yarn app