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
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: '<foo/>'
+ })
+ 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