https://github.com/hanmoehtet/funkify
Serialize and deserialize objects including functions, async functions, class instances, classes.
https://github.com/hanmoehtet/funkify
deserialize function funkify javascript json serialize stringify
Last synced: 8 months ago
JSON representation
Serialize and deserialize objects including functions, async functions, class instances, classes.
- Host: GitHub
- URL: https://github.com/hanmoehtet/funkify
- Owner: HanMoeHtet
- License: mit
- Created: 2022-08-10T07:17:10.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-08-10T10:47:46.000Z (over 3 years ago)
- Last Synced: 2025-05-08T23:53:08.026Z (8 months ago)
- Topics: deserialize, function, funkify, javascript, json, serialize, stringify
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/@han-moe-htet/funkify
- Size: 71.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# [Funkify](https://github.com/HanMoeHtet/funkify) · [](./LICENSE) [](https://www.npmjs.com/package/@han-moe-htet/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 `` prefix.
Support for native functions is included. Variables used inside the function must be scoped correctly. See [caveats](#caveats) section below.
## Installation
```bash
yarn add @han-moe-htet/funkify
```
Or
```bash
npm install @han-moe-htet/funkify
```
## Usage
### Serialize object with function
```typescript
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(serialized);
assert.equal(obj.hello(obj.name), deserialized.hello(deserialized.name));
```
### Serialize function
```typescript
const hello = (name: string) => `Hello ${name}`;
const serialized = funkify.serializeFunction(hello);
const deserialized = funkify.deserializeFunction(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 ``.
```typescript
try {
serialized = funkify.serialize(now);
} catch (e) {
if (e instanceof InvalidFunctionException) {
serialized = funkify.serializeNativeFunction('Date.now');
} else {
throw e;
}
}
assert.equal(now, funkify.deserializeNativeFunction(serialized));
```
Or you can wrap the native function with a custom function and serialize the custom function.
```typescript
const now = () => Date.now();
const serialized = funkify.serialize(now);
const deserialized = funkify.deserialize(serialized);
```
### Serialize class instance
```typescript
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(serialized);
```
### Serialize class
```typescript
const serialized = funkify.serialize(Hello);
const NewHello = funkify.deserialize(serialized);
assert.equal(Hello.toString(), NewHello.toString());
assert.equal(new Hello('world').hello(), new NewHello('world').hello());
```
See more examples at [examples](https://github.com/HanMoeHtet/funkify/tree/main/app/src/examples).
## Caveats
The following deserialized function will throw error because the scope of `name` variable is lost when serialized.
```typescript
const name = 'world';
const hello = () => `Hello ${name}`;
const serialized = funkify.serialize(hello);
const deserialized = funkify.deserialize(serialized);
```
## Development
1. Clone the repository
2. Run the following command to install local package in the app directory.
```bash
yarn link && yarn --cwd app link @han-moe-htet/funkify
```
3. Run the following command to run the app.
```bash
yarn app
```