diff --git a/src/plugins/init/developer-settings/definitions/EvalJSSetting.tsx b/src/plugins/init/developer-settings/definitions/EvalJSSetting.tsx
index c5b0523..6fb673c 100644
--- a/src/plugins/init/developer-settings/definitions/EvalJSSetting.tsx
+++ b/src/plugins/init/developer-settings/definitions/EvalJSSetting.tsx
@@ -3,19 +3,20 @@ import { AlertActionCreators } from '@revenge-mod/discord/actions'
import { Design } from '@revenge-mod/discord/design'
import { nodeUtil } from '@revenge-mod/externals/browserify'
import { getErrorStack } from '@revenge-mod/utils/errors'
+import { sleep } from '@revenge-mod/utils/promises'
import { useRef, useState } from 'react'
import { api } from '..'
import { Setting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
-const ALERT_KEY = 'evaluate-javascript'
+const AlertKey = 'evaluate-javascript'
const EvalJSSetting: SettingsItem = {
parent: Setting.RevengeDeveloper,
IconComponent: () => ,
title: () => 'Evaluate JavaScript',
useDescription: () => 'Runs a JavaScript code snippet.',
- onPress: () => AlertActionCreators.openAlert(ALERT_KEY, ),
+ onPress: () => AlertActionCreators.openAlert(AlertKey, ),
type: 'pressable',
}
@@ -48,30 +49,29 @@ function EvalJSAlert() {
onPress={async function onPress() {
setLoading(true)
+ const key = `_${Math.random()
+ .toString(36)
+ .substring(2, 15)}`
+
try {
if (!api) {
alert(
'Unable to provide plugin API. Running snippet in a second...',
)
- await new Promise(rs =>
- setTimeout(rs, 1000),
- )
- } else {
- // @ts-expect-error
- globalThis.revenge = api.unscoped
- // @ts-expect-error
- globalThis.api = api
- }
- // Do a no-local-scope-access eval
- // biome-ignore lint/security/noGlobalEval: This is intentional
- const res = globalThis.eval?.(code.current)
+ await sleep(1000)
+ }
+ // @ts-expect-error
+ else globalThis[key] = api
+
+ const res = globalEvalWithSourceUrl(
+ `api=${key},{unscoped:revenge}=api;${code.current}`,
+ 'Revenge:EvalJS',
+ )
alert(
nodeUtil.inspect(
- awaitResult && res instanceof Promise
- ? await res
- : res,
+ awaitResult ? await res : res,
{
depth: inspectDepth,
showHidden,
@@ -80,17 +80,15 @@ function EvalJSAlert() {
)
// @ts-expect-error
- // biome-ignore lint/performance/noDelete: This is fine.
- delete globalThis.revenge, delete globalThis.api
+ delete globalThis[key]
} catch (e) {
alert(getErrorStack(e))
}
setLoading(false)
- AlertActionCreators.dismissAlert(ALERT_KEY)
+ AlertActionCreators.dismissAlert(AlertKey)
}}
text="Evaluate"
- // Async arrow functions are not supported
variant="primary"
/>