
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
JSON.stringify/parse for complex data structures
Uncomplex is a library without dependencies for serializing and deserializing JavaScript datastructures that contain complex objects such as class instances. It works be defining so called EntityInterfaces that detect whether they are compatible with a specified substructure, convert it when serializing an object and reconvert it when parsing an object.
Install the package via
yarn add uncomplex
and call the following methods:
import { Uncomplex } from 'uncomplex';
const uncomplex = Uncomplex.new().withEntityInterfaces(...entityInterfaces);
const stringified: string = uncomplex.stringifyObject(object);
const parsed: CustomDataStructure = uncomplex.parseObject(stringified);
You can define a custom EntityInterface by implementing EntityInterface:
export interface UncomplexEntityInterface<Original = any, Simplified extends object = object, SimplifyState extends object = any, ParseState extends object = SimplifyState> {
entityId: string;
applicableClasses?: any[];
isApplicable?: (object: Original) => boolean;
simplifyObject: (object: Original, key: string | number | undefined, state: Partial<SimplifyState>) => Simplified;
parseObject: (object: Simplified, key: string | number | undefined, state: Partial<ParseState>) => Original;
}
Note that either applicableClasses (specifies a list of classes for which instanceof is used
to determine whether the class can be mapped by the EntityInterface) or isApplicable must be
implemented.
Alternatively, the following EntityInterfaces are implemented and can be imported from the uncomplex library:
BigIntEntityInterface: Converts bigint instancesDateEntityInterface: Converts Date instancesMapEntityInterface: Converts Map instancesSymbolEntityInterface: Converts symbol instancesThe following example can be found at examples/customDataStructure.ts and can be run
via yarn example:customDataStructure.
class Example {
public param: string;
constructor(param: string) {
this.param = param;
}
}
export const ExampleEntityInterface: UncomplexEntityInterface<Example, { p: string }> = {
entityId: 'Example',
applicableClasses: [Example],
simplifyObject: object => ({ p: object.param }),
parseObject: object => new Example(object.p)
};
const uncomplex = Uncomplex.new().withEntityInterfaces(ExampleEntityInterface);
const example = { ex: new Example('test') };
const asString = uncomplex.stringifyObject(example);
console.log(asString);
// {"ex":{"p":"test","__uncomplexId":"Example"}}
const parsed = uncomplex.parseObject(asString);
console.log(parsed.ex instanceof Example, parsed.ex.param);
// true 'test'
The following example can be found at examples/nativeDataStructure.ts and can be run
via yarn example:nativeDataStructure.
const uncomplex = Uncomplex.new().withEntityInterfaces(
BigIntEntityInterface, DateEntityInterface, MapEntityInterface, SymbolEntityInterface);
const map = new Map();
map.set('a', 'aa');
map.set('b', 42);
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const example = { bigInt: BigInt(9999999999999), date: new Date(1800000000000), map, sym1, sym2, sym1alt: sym1 };
const asString = uncomplex.stringifyObject(example);
console.log(asString);
// {
// "bigInt":{"n":"9999999999999","__uncomplexId":"BigInt"},
// "date":{"iso":"2027-01-15T08:00:00.000Z","__uncomplexId":"Date"},
// "map":{"entries":[["a","aa"],["b",42]],"__uncomplexId":"Map"},
// "sym1":{"id":0,"key":"a","__uncomplexId":"Symbol"},
// "sym2":{"id":1,"key":"b","__uncomplexId":"Symbol"},
// "sym1alt":{"id":2,"key":"a","__uncomplexId":"Symbol"}
// }
const parsed = uncomplex.parseObject(asString);
console.log(parsed);
// data structure with recreated instances
FAQs
JSON.stringify/parse for complex data structures
We found that uncomplex demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.