mirror of https://github.com/embarklabs/embark.git
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:
parent
c7eb2744cd
commit
d5294203b7
|
@ -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';
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
@ -14,4 +15,4 @@
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"target": "ESNext"
|
"target": "ESNext"
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue