fix(@embark/contracts-manager): Remove `logger` from serialized contract

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.
This commit is contained in:
emizzle 2020-02-03 20:56:18 +11:00 committed by Iuri Matias
parent c7eb2744cd
commit d5294203b7
4 changed files with 44 additions and 2 deletions

View File

@ -3,6 +3,8 @@ const https = require('follow-redirects').https;
const shelljs = require('shelljs'); const shelljs = require('shelljs');
const clipboardy = require('clipboardy'); const clipboardy = require('clipboardy');
import * as Serialize from './serialize';
export { Serialize };
import { canonicalHost } from './host'; import { canonicalHost } from './host';
export { canonicalHost, defaultCorsHost, defaultHost, dockerHostSwap, isDocker } from './host'; export { canonicalHost, defaultCorsHost, defaultHost, dockerHostSwap, isDocker } from './host';
export { downloadFile, findNextPort, getJson, httpGet, httpsGet, httpGetJson, httpsGetJson, pingEndpoint } from './network'; export { downloadFile, findNextPort, getJson, httpGet, httpsGet, httpGetJson, httpsGetJson, pingEndpoint } from './network';

View File

@ -0,0 +1,37 @@
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);
}
}

View File

@ -1,9 +1,11 @@
import { ContractConfig } from "embark-core"; import { ContractConfig } from "embark-core";
import { Logger } from 'embark-logger'; import { Logger } from 'embark-logger';
import { sha3 } from "embark-utils"; import { sha3, Serialize } from "embark-utils";
import { AbiItem } from "web3-utils"; import { AbiItem } from "web3-utils";
@Serialize.Serializable
export default class Contract { export default class Contract {
@Serialize.Ignore
private logger: Logger; private logger: Logger;
public abiDefinition?: AbiItem[]; public abiDefinition?: AbiItem[];
public deployedAddress?: string; public deployedAddress?: string;

View File

@ -6,6 +6,7 @@
"declarationMap": true, "declarationMap": true,
"emitDeclarationOnly": true, "emitDeclarationOnly": true,
"esModuleInterop": true, "esModuleInterop": true,
"experimentalDecorators": true,
"isolatedModules": true, "isolatedModules": true,
"moduleResolution": "Node", "moduleResolution": "Node",
"noImplicitAny": false, "noImplicitAny": false,