From 14e604a6d80ad4a67b8d55fec37f0bd49afc78d9 Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 15 Nov 2025 22:57:05 -0500 Subject: [PATCH 1/3] Completely rework monitor handling of Object and Arrays (Ported from NitroBolt) --- src/components/monitor-list/monitor-list.jsx | 3 +- src/lib/monitor-adapter.js | 21 +------------ src/lib/tw-sanitize.js | 32 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 src/lib/tw-sanitize.js diff --git a/src/components/monitor-list/monitor-list.jsx b/src/components/monitor-list/monitor-list.jsx index e4da715b0b4..1f01a837c9b 100644 --- a/src/components/monitor-list/monitor-list.jsx +++ b/src/components/monitor-list/monitor-list.jsx @@ -5,6 +5,7 @@ import Monitor from '../../containers/monitor.jsx'; import PropTypes from 'prop-types'; import {OrderedMap} from 'immutable'; import {stageSizeToTransform} from '../../lib/screen-utils'; +import {sanitizeVariableType} from '../../lib/tw-sanitize.js'; import styles from './monitor-list.css'; @@ -36,7 +37,7 @@ const MonitorList = props => ( params={monitorData.params} spriteName={monitorData.spriteName} targetId={monitorData.targetId} - value={monitorData.value} + value={sanitizeVariableType(monitorData.value, monitorData.mode)} width={monitorData.width} x={monitorData.x} y={monitorData.y} diff --git a/src/lib/monitor-adapter.js b/src/lib/monitor-adapter.js index 90a7d7b1c4c..d0d988e640a 100644 --- a/src/lib/monitor-adapter.js +++ b/src/lib/monitor-adapter.js @@ -2,17 +2,6 @@ import OpcodeLabels from './opcode-labels.js'; const isUndefined = a => typeof a === 'undefined'; -const circularReplacer = () => { - const stack = new Set(); - return (_, value) => { - if (typeof value === 'object' && value !== null) { - if (stack.has(value)) return Array.isArray(value) ? '[...]' : '{...}'; - stack.add(value); - } - return value; - }; -}; - /** * Convert monitors from VM format to what the GUI needs to render. * - Convert opcode to a label and a category @@ -48,21 +37,13 @@ export default function ({id, spriteName, opcode, params, value, vm}) { value = value.toString(); } - // Turn the value to a string, to handle JSON values - // do not convert arrays as it will be confused for lists - if (typeof value === 'object' && !Array.isArray(value)) { - value = JSON.stringify(value, circularReplacer()); - } - - // Lists can contain booleans or Objects, which should also be turned to strings + // Lists can contain booleans, which should also be turned to strings if (Array.isArray(value)) { value = value.slice(); for (let i = 0; i < value.length; i++) { const item = value[i]; if (typeof item === 'boolean') { value[i] = item.toString(); - } else if (typeof value[i] === 'object' && !Array.isArray(value[i])) { - value[i] = JSON.stringify(item, circularReplacer()); } } } diff --git a/src/lib/tw-sanitize.js b/src/lib/tw-sanitize.js new file mode 100644 index 00000000000..f1359ddb97c --- /dev/null +++ b/src/lib/tw-sanitize.js @@ -0,0 +1,32 @@ +const circularReplacer = () => { + const seen = new WeakSet(); + return (_, value) => { + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) { + return Array.isArray(value) ? '[...]' : '{...}'; + } + seen.add(value); + } + return value; + }; +}; + +const sanitize = (input) => { + if (typeof input === "object" && input !== null) { + return JSON.stringify(input, circularReplacer()); + } else { + return input; + } +}; + +const sanitizeVariableType = (input, type) => { + if (type === "list") { + return input.map(item => sanitize(item)); + } else { + return sanitize(input); + } +}; + +module.exports = { + sanitizeVariableType +}; \ No newline at end of file From a62d60446f52fd31d8c678c3b1deca4220598a89 Mon Sep 17 00:00:00 2001 From: Cubester Date: Thu, 20 Nov 2025 21:16:05 -0500 Subject: [PATCH 2/3] Switch to es6 modules and rename `tw-sanitize` to `tw-safe-stringify` --- src/lib/{tw-sanitize.js => tw-safe-stringify.js} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename src/lib/{tw-sanitize.js => tw-safe-stringify.js} (93%) diff --git a/src/lib/tw-sanitize.js b/src/lib/tw-safe-stringify.js similarity index 93% rename from src/lib/tw-sanitize.js rename to src/lib/tw-safe-stringify.js index f1359ddb97c..0be17ec3dbb 100644 --- a/src/lib/tw-sanitize.js +++ b/src/lib/tw-safe-stringify.js @@ -27,6 +27,4 @@ const sanitizeVariableType = (input, type) => { } }; -module.exports = { - sanitizeVariableType -}; \ No newline at end of file +export { sanitizeVariableType }; \ No newline at end of file From e3284b4b8dee9fefe3dc56574c2c36f87578c8d6 Mon Sep 17 00:00:00 2001 From: Cubester Date: Thu, 20 Nov 2025 21:21:01 -0500 Subject: [PATCH 3/3] Whoops --- src/components/monitor-list/monitor-list.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/monitor-list/monitor-list.jsx b/src/components/monitor-list/monitor-list.jsx index 1f01a837c9b..c50df697c1c 100644 --- a/src/components/monitor-list/monitor-list.jsx +++ b/src/components/monitor-list/monitor-list.jsx @@ -5,7 +5,7 @@ import Monitor from '../../containers/monitor.jsx'; import PropTypes from 'prop-types'; import {OrderedMap} from 'immutable'; import {stageSizeToTransform} from '../../lib/screen-utils'; -import {sanitizeVariableType} from '../../lib/tw-sanitize.js'; +import {sanitizeVariableType} from '../../lib/tw-safe-stringify.js'; import styles from './monitor-list.css';