mirror of
https://github.com/embarklabs/embark.git
synced 2025-02-23 10:58:28 +00:00
For all instances where a `Contract` instance is serialized using `JSON.stringify`, the `logger` property was being stringified and written to logs and contract artifact files. Add Serializer class that allows ignoring of class properties during serialization when using `JSON.stringify`. NOTE: The `Serializer` relies on TypeScript’s decorators which are still listed as experimental (requiring the necessary compiler flag) despite being around for several years. Decorators are a stage 2 proposal for JavaScript.
38 lines
958 B
TypeScript
38 lines
958 B
TypeScript
export function Serializable(target: any) {
|
|
target.prototype.toJSON = function() {
|
|
const props = Object.getOwnPropertyDescriptors(this);
|
|
const map = {};
|
|
Object.entries(props).map(([name, prop]) => {
|
|
if (Serialization.isIgnored(target.prototype, name)) {
|
|
return;
|
|
}
|
|
map[name] = prop.value;
|
|
});
|
|
return map;
|
|
};
|
|
}
|
|
|
|
export function Ignore(target: any, propertyKey: string) {
|
|
Serialization.registerIgnore(target, propertyKey);
|
|
}
|
|
|
|
class Serialization {
|
|
private static ignoreMap: Map<any, string[]> = new Map();
|
|
static registerIgnore(target: any, property: any): void {
|
|
let keys = this.ignoreMap.get(target);
|
|
if (!keys) {
|
|
keys = [];
|
|
this.ignoreMap.set(target, keys);
|
|
}
|
|
keys.push(property);
|
|
}
|
|
|
|
static isIgnored(target: any, property: any): boolean {
|
|
const keys = this.ignoreMap.get(target);
|
|
if (!keys) {
|
|
return false;
|
|
}
|
|
return keys.includes(property);
|
|
}
|
|
}
|