diff --git a/src/components/ParamsList/index.js b/src/components/ParamsList/index.js index ba27ffc2..dd33489a 100644 --- a/src/components/ParamsList/index.js +++ b/src/components/ParamsList/index.js @@ -1,168 +1,132 @@ import React from 'react'; import * as antd from 'antd' import * as Icons from 'components/Icons' -import { __legacy__objectToArray } from 'core' +import { __legacy__objectToArray, getCircularReplacer, decycle } from 'core' +const serializeFlags = { + __cycle_flag: true // with id 0 +} -export default function DebugPanel(data) { +function isFlagId(e, id) { + return serializeFlags[Object.keys(e)[id ?? 0]] +} - const serializeFlags = { - __cycle_flag: true // with id 0 - } - - function isFlagId(e, id) { - return serializeFlags[Object.keys(e)[id ?? 0]] - } - - function getCircularReplacer() { - const seen = new WeakSet(); - return (key, value) => { - if (typeof value === "object" && value !== null) { - if (seen.has(value)) { - return { __cycle_flag: true } - } - seen.add(value) - } - return value - } - } - - function decycle(obj, stack = []) { - if (!obj || typeof obj !== 'object') - return obj; - - if (stack.includes(obj)) { - return { __cycle_flag: true } - } - - let s = stack.concat([obj]); - - return Array.isArray(obj) - ? obj.map(x => decycle(x, s)) - : Object.fromEntries( - Object.entries(obj) - .map(([k, v]) => [k, decycle(v, s)])); - } - - const getErrorRender = (e, error) => { - return ( -
-
- This could not be rendered > ({e.key}) [{typeof (e.value)}] -
-
- - -
- {error.toString()} -
-
-
-
+const getErrorRender = (e, error) => { + return ( +
+
+ This could not be rendered > ({e.key}) [{typeof (e.value)}]
- ) - } +
+ + +
+ {error.toString()} +
+
+
+
+
+ ) +} - const getDecoratorStr = (e, json) => { - try { - switch (typeof (e.value)) { - case "string": { - return `(${json.length}) characters` +const getDecoratorStr = (e, json) => { + try { + switch (typeof (e.value)) { + case "string": { + return `(${json.length}) characters` + } + case "object": { + if (e.value == null) { + return `Empty (null/undefined)` } - case "object": { - if (e.value == null) { - return `Empty (null/undefined)` - } - if (isFlagId(e.value, 0)) { - return Cylic - } - if (typeof (e.value.length) !== "undefined") { - return `Lenght (${e.value.length})` - } - if (typeof (Object.keys(e.value).length) !== "undefined") { - return `Lenght (${Object.keys(e.value).length})` - } - return `Immeasurable (by error) (not valid object)` + if (isFlagId(e.value, 0)) { + return Cylic } - case "array": { + if (typeof (e.value.length) !== "undefined") { return `Lenght (${e.value.length})` } - case "boolean": { - return {e.value ? "true" : "false"} + if (typeof (Object.keys(e.value).length) !== "undefined") { + return `Lenght (${Object.keys(e.value).length})` } - case "number": { - return {e.value} - } - default: - return `Immeasurable / Invalid` + return `Immeasurable (by error) (not valid object)` } - } catch (error) { - return Immeasurable (by error) + case "array": { + return `Lenght (${e.value.length})` + } + case "boolean": { + return {e.value ? "true" : "false"} + } + case "number": { + return {e.value} + } + default: + return `Immeasurable / Invalid` } + } catch (error) { + return Immeasurable (by error) } +} - const getContent = (e) => { - try { - switch (typeof (e.value)) { - case "string": { - return e.value - } - case "object": { - if (e.value == null) { - return `${e.value}` - } - if (isFlagId(e.value, 0)) { - return
- This cannot be rendered because a cylic has been detected -
- } - if (Object.keys(e.value).length > 0) { // trying create nested - return
- {DebugPanel(e.value)} -
- } - return JSON.stringify(e.value, getCircularReplacer()) - } - case "array": { - return JSON.stringify(e.value, getCircularReplacer()) - } - case "boolean": { - return `${e.value}` - } - default: - return `${e.value}` +const getContent = (e) => { + try { + switch (typeof (e.value)) { + case "string": { + return e.value } + case "object": { + if (e.value == null) { + return `${e.value}` + } + if (isFlagId(e.value, 0)) { + return
+ This cannot be rendered because a cylic has been detected +
+ } + if (Object.keys(e.value).length > 0) { // trying create nested + return
+ {DebugPanel(e.value)} +
+ } + return JSON.stringify(e.value, getCircularReplacer()) + } + case "array": { + return JSON.stringify(e.value, getCircularReplacer()) + } + case "boolean": { + return `${e.value}` + } + default: + return `${e.value}` + } + } catch (error) { + return getErrorRender(e, error) + } +} + +const getType = (e) => { + if (e !== null && isFlagId(e, 0)) { + return `[loop]` + } + return `[${typeof (e)}]` +} + +export default function DebugPanel(data) { + if (!data) return false + return __legacy__objectToArray(decycle(data)).map(e => { + try { + const content = getContent(e) + return ( + + {getType(e.value)} {e.key} | {getDecoratorStr(e, content)}
} > +
+ {content} +
+ + + ) } catch (error) { return getErrorRender(e, error) } - } - - const modelToMap = (data) => { - if (!data) return false - const getType = (e) => { - if (e !== null && isFlagId(e, 0)) { - return `[loop]` - } - return `[${typeof (e)}]` - } - - return __legacy__objectToArray(decycle(data)).map(e => { - try { - const content = getContent(e) - return ( - - {getType(e.value)} {e.key} | {getDecoratorStr(e, content)} } > -
- {content} -
-
-
- ) - } catch (error) { - return getErrorRender(e, error) - } - }) - } - - return modelToMap(data) + }) } \ No newline at end of file diff --git a/src/core/index.js b/src/core/index.js index 2c3b8838..1cbaa5cc 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -34,6 +34,36 @@ export const clientInfo = { layout: platform.layout }; +export function getCircularReplacer() { + const seen = new WeakSet(); + return (key, value) => { + if (typeof value === "object" && value !== null) { + if (seen.has(value)) { + return { __cycle_flag: true } + } + seen.add(value) + } + return value + } +} + +export function decycle(obj, stack = []) { + if (!obj || typeof obj !== 'object') + return obj; + + if (stack.includes(obj)) { + return { __cycle_flag: true } + } + + let s = stack.concat([obj]); + + return Array.isArray(obj) + ? obj.map(x => decycle(x, s)) + : Object.fromEntries( + Object.entries(obj) + .map(([k, v]) => [k, decycle(v, s)])); +} + export function getBuild() { let build = { stable: false