Skip to content

Commit

Permalink
fix(@embark/contracts-manager): Remove logger from serialized contract
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
emizzle committed Feb 3, 2020
1 parent 6b502e1 commit c6b3c1f
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 2 deletions.
2 changes: 2 additions & 0 deletions packages/core/utils/src/index.ts
Expand Up @@ -3,6 +3,8 @@ const https = require('follow-redirects').https;
const shelljs = require('shelljs');
const clipboardy = require('clipboardy');

import * as Serialize from './serialize';
export { Serialize };
import { canonicalHost } from './host';
export { canonicalHost, defaultCorsHost, defaultHost, dockerHostSwap, isDocker } from './host';
export { downloadFile, findNextPort, getJson, httpGet, httpsGet, httpGetJson, httpsGetJson, pingEndpoint } from './network';
Expand Down
37 changes: 37 additions & 0 deletions packages/core/utils/src/serialize.ts
@@ -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);
}
}
4 changes: 3 additions & 1 deletion packages/stack/contracts-manager/src/contract.ts
@@ -1,9 +1,11 @@
import { ContractConfig } from "embark-core";
import { Logger } from 'embark-logger';
import { sha3 } from "embark-utils";
import { sha3, Serialize } from "embark-utils";
import { AbiItem } from "web3-utils";

@Serialize.Serializable
export default class Contract {
@Serialize.Ignore
private logger: Logger;
public abiDefinition?: AbiItem[];
public deployedAddress?: string;
Expand Down
3 changes: 2 additions & 1 deletion tsconfig.base.json
Expand Up @@ -6,6 +6,7 @@
"declarationMap": true,
"emitDeclarationOnly": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"isolatedModules": true,
"moduleResolution": "Node",
"noImplicitAny": false,
Expand All @@ -14,4 +15,4 @@
"strict": true,
"target": "ESNext"
}
}
}

0 comments on commit c6b3c1f

Please sign in to comment.