diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 1cde73bd48a..823181d23a7 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -399,7 +399,7 @@ function applySingletonAppMutations(app: App) { } const val = singletonApp.config[key as keyof AppConfig] // @ts-ignore - app.config[key] = val + app.config[key] = isObject(val) ? Object.create(val) : val // compat for runtime ignoredElements -> isCustomElement if ( diff --git a/packages/vue-compat/__tests__/global.spec.ts b/packages/vue-compat/__tests__/global.spec.ts index 0bc18a5d588..eda08d3026e 100644 --- a/packages/vue-compat/__tests__/global.spec.ts +++ b/packages/vue-compat/__tests__/global.spec.ts @@ -1,6 +1,6 @@ import Vue from '@vue/compat' import { effect, isReactive } from '@vue/reactivity' -import { nextTick } from '@vue/runtime-core' +import { h, nextTick } from '@vue/runtime-core' import { DeprecationTypes, deprecationData, @@ -454,19 +454,51 @@ test('post-facto global asset registration should affect apps created via create template: '' }) Vue.component('foo', { template: 'foo' }) - const vm = app.mount(document.createElement('div')) as any; + const vm = app.mount(document.createElement('div')) as any expect(vm.$el.textContent).toBe('foo') delete singletonApp._context.components.foo }) test('local asset registration should not affect other local apps', () => { - const app1 = createApp({}); - const app2 = createApp({}); + const app1 = createApp({}) + const app2 = createApp({}) - app1.component('foo', {}); - app2.component('foo', {}); + app1.component('foo', {}) + app2.component('foo', {}) expect( `Component "foo" has already been registered in target app` ).not.toHaveBeenWarned() -}) \ No newline at end of file +}) + +test('local app-level mixin registration should not affect other local apps', () => { + const app1 = createApp({ render: () => h('div') }) + const app2 = createApp({}) + + const mixin = { created: jest.fn() } + app1.mixin(mixin) + app2.mixin(mixin) + + expect(`Mixin has already been applied`).not.toHaveBeenWarned() + + app1.mount(document.createElement('div')) + expect(mixin.created).toHaveBeenCalledTimes(1) +}) + +// #5699 +test('local app config should not affect other local apps in v3 mode', () => { + Vue.configureCompat({ MODE: 3 }) + const app1 = createApp({ + render: () => h('div'), + provide() { + return { + test: 123 + } + } + }) + app1.config.globalProperties.test = () => {} + app1.mount(document.createElement('div')) + + const app2 = createApp({}) + expect(app2.config.globalProperties.test).toBe(undefined) +})