From a5a2af548680f940e9414c27ae85744d2d1c7776 Mon Sep 17 00:00:00 2001 From: onmax Date: Fri, 6 Mar 2026 16:13:53 +0100 Subject: [PATCH] fix: avoid mutating runtimeConfig scriptOptions via Object.assign --- src/runtime/utils.ts | 2 +- test/unit/utils.test.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/runtime/utils.ts b/src/runtime/utils.ts index 1e22e9b59..640c790bc 100644 --- a/src/runtime/utils.ts +++ b/src/runtime/utils.ts @@ -83,7 +83,7 @@ export function useRegistryScript, O = Em } const scriptInput = defu(finalScriptInput, userOptions.scriptInput, { key: registryKey }) as any as UseScriptInput - const scriptOptions = Object.assign(userOptions?.scriptOptions || {}, options.scriptOptions || {}) + const scriptOptions = { ...userOptions?.scriptOptions, ...options.scriptOptions } if (import.meta.dev) { // Capture where the component was loaded from const error = new Error('Stack trace for component location') diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index 4f7e07ab7..f21b61024 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -14,6 +14,21 @@ vi.mock('#nuxt-scripts-validator', () => ({ parse: vi.fn(), })) +describe('useRegistryScript scriptOptions', () => { + it('should not mutate user-provided scriptOptions', () => { + const mockOptionsFunction = vi.fn((_opts, _ctx) => ({ + scriptInput: { src: 'https://example.com/script.js' }, + scriptOptions: { use: () => ({ test: true }) }, + })) + + const userScriptOptions = { trigger: 'onNuxtReady' as const } + const userOptions = { scriptOptions: userScriptOptions } + useRegistryScript('test', mockOptionsFunction, userOptions) + + expect(userScriptOptions).not.toHaveProperty('use') + }) +}) + describe('useRegistryScript query param merging', () => { it('should merge query params when user provides custom src', () => { const mockOptionsFunction = vi.fn((_opts, _ctx) => ({