From 52bc354bce04c979959bd6a7c37c38ba97bd6f09 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 2 Oct 2025 12:27:45 -0400 Subject: [PATCH] Improve `trusted-replace-argument` scriptlet --- src/js/resources/replace-argument.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/js/resources/replace-argument.js b/src/js/resources/replace-argument.js index 638eaeee6..a581aba09 100644 --- a/src/js/resources/replace-argument.js +++ b/src/js/resources/replace-argument.js @@ -65,10 +65,19 @@ export function trustedReplaceArgument( const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argposRaw, argraw); const argoffset = parseInt(argposRaw, 10) || 0; const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const replacer = argraw.startsWith('repl:/') && - parseReplaceFn(argraw.slice(5)) || undefined; - const value = replacer === undefined && - validateConstantFn(true, argraw, extraArgs); + let replacer; + if ( argraw.startsWith('repl:/') ) { + const parsed = parseReplaceFn(argraw.slice(5)); + if ( parsed === undefined ) { return; } + replacer = arg => `${arg}`.replace(replacer.re, replacer.replacement); + } else if ( argraw.startsWith('add:') ) { + const delta = parseFloat(argraw.slice(4)); + if ( isNaN(delta) ) { return; } + replacer = arg => Number(arg) + delta; + } else { + const value = validateConstantFn(true, argraw, extraArgs); + replacer = ( ) => value; + } const reCondition = extraArgs.condition ? safe.patternToRegex(extraArgs.condition) : /^/; @@ -100,9 +109,7 @@ export function trustedReplaceArgument( return context.reflect(); } } - const argAfter = replacer && typeof argBefore === 'string' - ? argBefore.replace(replacer.re, replacer.replacement) - : value; + const argAfter = replacer(argBefore); if ( argAfter !== argBefore ) { setArg(context, argAfter); safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${argAfter}`);