From a5cffcc1ed29c424f6e7d20fbc72155e186ac71a Mon Sep 17 00:00:00 2001 From: sadkodev Date: Fri, 17 Jul 2026 15:30:43 -0400 Subject: [PATCH] fix(editor): reject partially numeric opacity buffers Add /^\d+$/ guard to opacityFromBuffer so strings like '12x', '5abc', or '3.5' return 100% instead of silently parsing the numeric prefix. Add unit tests for partial, decimal, scientific, negative, and whitespace-prefixed buffers. --- packages/core/src/editor/nodes.ts | 1 + tests/engine/editor/opacity.test.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/core/src/editor/nodes.ts b/packages/core/src/editor/nodes.ts index f5fcb3337..0a35eea31 100644 --- a/packages/core/src/editor/nodes.ts +++ b/packages/core/src/editor/nodes.ts @@ -10,6 +10,7 @@ import { createVariableBindingActions } from './variable-bindings' export function opacityFromBuffer(buffer: string): number { if (buffer === '0') return 1 + if (!/^\d+$/.test(buffer)) return 1 const n = Number.parseInt(buffer, 10) if (!Number.isFinite(n)) return 1 const percent = buffer.length === 1 ? n * 10 : n diff --git a/tests/engine/editor/opacity.test.ts b/tests/engine/editor/opacity.test.ts index 5e8e3de8b..0f3fafa71 100644 --- a/tests/engine/editor/opacity.test.ts +++ b/tests/engine/editor/opacity.test.ts @@ -150,4 +150,13 @@ describe('opacityFromBuffer', () => { expect(opacityFromBuffer('')).toBe(1) expect(opacityFromBuffer('abc')).toBe(1) }) + + test('rejects partially numeric buffers', () => { + expect(opacityFromBuffer('12x')).toBe(1) + expect(opacityFromBuffer('5abc')).toBe(1) + expect(opacityFromBuffer('3.5')).toBe(1) + expect(opacityFromBuffer('1e2')).toBe(1) + expect(opacityFromBuffer('-5')).toBe(1) + expect(opacityFromBuffer(' 5')).toBe(1) + }) })