diff --git a/packages/core/utils/src/index.ts b/packages/core/utils/src/index.ts index c7d6a08372..bb181ab0bd 100644 --- a/packages/core/utils/src/index.ts +++ b/packages/core/utils/src/index.ts @@ -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'; diff --git a/packages/core/utils/src/serialize.ts b/packages/core/utils/src/serialize.ts new file mode 100644 index 0000000000..7205f329a1 --- /dev/null +++ b/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 = 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); + } +} diff --git a/packages/stack/contracts-manager/src/contract.ts b/packages/stack/contracts-manager/src/contract.ts index 60a047bd9a..6d743f9677 100644 --- a/packages/stack/contracts-manager/src/contract.ts +++ b/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; diff --git a/tsconfig.base.json b/tsconfig.base.json index f5e10fc7c6..3e28ade0de 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -6,6 +6,7 @@ "declarationMap": true, "emitDeclarationOnly": true, "esModuleInterop": true, + "experimentalDecorators": true, "isolatedModules": true, "moduleResolution": "Node", "noImplicitAny": false, @@ -14,4 +15,4 @@ "strict": true, "target": "ESNext" } -} +} \ No newline at end of file