Skip to content

Commit

Permalink
fix(compat): fix globalProperties pollution in v3 mode
Browse files Browse the repository at this point in the history
fix #5699
  • Loading branch information
yyx990803 committed May 23, 2022
1 parent 108474e commit 2f07e34
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 8 deletions.
2 changes: 1 addition & 1 deletion packages/runtime-core/src/compat/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
46 changes: 39 additions & 7 deletions packages/vue-compat/__tests__/global.spec.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -454,19 +454,51 @@ test('post-facto global asset registration should affect apps created via create
template: '<foo/>'
})
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()
})
})

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)
})

0 comments on commit 2f07e34

Please sign in to comment.