@han-moe-htet/funkify
v0.0.1
Published
Serialize and deserialize objects including functions, async functions, class instances, classes.
Downloads
1
Maintainers
Readme
Funkify ·
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
- Clone the repository
- Run the following command to install local package in the app directory.
yarn link && yarn --cwd app link @han-moe-htet/funkify
- Run the following command to run the app.
yarn app