From 7fb57327b9d0e4d9eb675149f167d915fb0d59fa Mon Sep 17 00:00:00 2001 From: Alex Van Liew Date: Sun, 22 May 2022 18:41:39 -0700 Subject: [PATCH] fix(compat): fix app-level asset registration affecting other local apps (#5979) --- packages/runtime-core/src/compat/global.ts | 5 +++-- packages/vue-compat/__tests__/global.spec.ts | 22 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index e0fc699fa5f..1cde73bd48a 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -381,9 +381,10 @@ function installLegacyAPIs(app: App) { function applySingletonAppMutations(app: App) { // copy over asset registries and deopt flag - ;['mixins', 'components', 'directives', 'filters', 'deopt'].forEach(key => { + app._context.mixins = [...singletonApp._context.mixins] + ;['components', 'directives', 'filters'].forEach(key => { // @ts-ignore - app._context[key] = singletonApp._context[key] + app._context[key] = Object.create(singletonApp._context[key]) }) // copy over global config mutations diff --git a/packages/vue-compat/__tests__/global.spec.ts b/packages/vue-compat/__tests__/global.spec.ts index e4cd30074da..0bc18a5d588 100644 --- a/packages/vue-compat/__tests__/global.spec.ts +++ b/packages/vue-compat/__tests__/global.spec.ts @@ -448,3 +448,25 @@ test('global asset registration should affect apps created via createApp', () => expect(vm.$el.textContent).toBe('foo') delete singletonApp._context.components.foo }) + +test('post-facto global asset registration should affect apps created via createApp', () => { + const app = createApp({ + template: '' + }) + Vue.component('foo', { template: 'foo' }) + 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({}); + + app1.component('foo', {}); + app2.component('foo', {}); + + expect( + `Component "foo" has already been registered in target app` + ).not.toHaveBeenWarned() +}) \ No newline at end of file