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) => ({