From 9aa739a4f0cc5fc99a50a4d0c2e0c4cc14acbde9 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sun, 25 Nov 2018 08:51:58 +0000 Subject: [PATCH 1/3] fix: support async components in stubs --- .../create-component-stubs.js | 26 +++++++++-------- packages/create-instance/create-instance.js | 2 +- packages/create-instance/patch-render.js | 2 +- test/specs/mounting-options/stubs.spec.js | 28 +++++++++++++++++++ 4 files changed, 45 insertions(+), 13 deletions(-) rename packages/{shared => create-instance}/create-component-stubs.js (87%) diff --git a/packages/shared/create-component-stubs.js b/packages/create-instance/create-component-stubs.js similarity index 87% rename from packages/shared/create-component-stubs.js rename to packages/create-instance/create-component-stubs.js index 82e034610..c3fbd94a1 100644 --- a/packages/shared/create-component-stubs.js +++ b/packages/create-instance/create-component-stubs.js @@ -6,16 +6,16 @@ import { camelize, capitalize, hyphenate -} from './util' +} from '../shared/util' import { componentNeedsCompiling, templateContainsComponent, isVueComponent -} from './validators' +} from '../shared/validators' import { compileTemplate, compileFromString -} from './compile-template' +} from '../shared/compile-template' function isVueComponentStub (comp): boolean { return comp && comp.template || isVueComponent(comp) @@ -68,10 +68,12 @@ export function createStubFromComponent ( originalComponent: Component, name: string ): Component { - const componentOptions = typeof originalComponent === 'function' - ? originalComponent.extendOptions - : originalComponent - const tagName = `${name}-stub` + const componentOptions = + typeof originalComponent === 'function' && originalComponent.cid + ? originalComponent.extendOptions + : originalComponent + + const tagName = `${name || 'anonymous'}-stub` // ignoreElements does not exist in Vue 2.0.x if (Vue.config.ignoredElements) { @@ -112,9 +114,10 @@ export function createStubFromString ( throwError('options.stub cannot contain a circular reference') } - const componentOptions = typeof originalComponent === 'function' - ? originalComponent.extendOptions - : originalComponent + const componentOptions = + typeof originalComponent === 'function' && originalComponent.cid + ? originalComponent.extendOptions + : originalComponent return { ...getCoreProperties(componentOptions), @@ -152,9 +155,10 @@ export function createStubsFromStubsObject ( } if (typeof stub === 'string') { + const component = resolveComponent(originalComponents, stubName) acc[stubName] = createStubFromString( stub, - originalComponents[stubName], + component, stubName ) return acc diff --git a/packages/create-instance/create-instance.js b/packages/create-instance/create-instance.js index 44d99f4d9..eb473927e 100644 --- a/packages/create-instance/create-instance.js +++ b/packages/create-instance/create-instance.js @@ -14,7 +14,7 @@ import createFunctionalComponent from './create-functional-component' import { componentNeedsCompiling, isPlainObject } from 'shared/validators' import { validateSlots } from './validate-slots' import createScopedSlots from './create-scoped-slots' -import { createStubsFromStubsObject } from 'shared/create-component-stubs' +import { createStubsFromStubsObject } from './create-component-stubs' import { patchRender } from './patch-render' function vueExtendUnsupportedOption (option: string) { diff --git a/packages/create-instance/patch-render.js b/packages/create-instance/patch-render.js index b30b774bf..fb3b463d3 100644 --- a/packages/create-instance/patch-render.js +++ b/packages/create-instance/patch-render.js @@ -1,4 +1,4 @@ -import { createStubFromComponent } from 'shared/create-component-stubs' +import { createStubFromComponent } from './create-component-stubs' import { resolveComponent, semVerGreaterThan } from 'shared/util' import { isReservedTag } from 'shared/validators' import { addHook } from './add-hook' diff --git a/test/specs/mounting-options/stubs.spec.js b/test/specs/mounting-options/stubs.spec.js index c2e2c2dc6..b5d8af42d 100644 --- a/test/specs/mounting-options/stubs.spec.js +++ b/test/specs/mounting-options/stubs.spec.js @@ -532,4 +532,32 @@ describeWithMountingMethods('options.stub', mountingMethod => { expect(fn).to.throw() .with.property('message', message) }) + + it('works with async components', () => { + const StubComponent = { + template: '

' + } + const TestComponent = { + template: `
+ + + +
`, + components: { + DynamicHello: () => import('~resources/components/component.vue'), + DynamicHello2: () => import('~resources/components/component.vue'), + DynamicHello3: () => import('~resources/components/component.vue') + } + } + const wrapper = mountingMethod(TestComponent, { + stubs: { + DynamicHello: '', + DynamicHello2: true, + DynamicHello3: StubComponent + } + }) + expect(wrapper.html()).to.contain('span') + expect(wrapper.html()).to.contain('dynamichello2-stub') + expect(wrapper.html()).to.contain('h1') + }) }) From 7afe09ca5c78a68194787a3de2607294e4fa2004 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sun, 25 Nov 2018 09:01:43 +0000 Subject: [PATCH 2/3] test: support renderToString --- test/specs/mounting-options/stubs.spec.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/specs/mounting-options/stubs.spec.js b/test/specs/mounting-options/stubs.spec.js index b5d8af42d..3be9bfa65 100644 --- a/test/specs/mounting-options/stubs.spec.js +++ b/test/specs/mounting-options/stubs.spec.js @@ -556,8 +556,15 @@ describeWithMountingMethods('options.stub', mountingMethod => { DynamicHello3: StubComponent } }) - expect(wrapper.html()).to.contain('span') - expect(wrapper.html()).to.contain('dynamichello2-stub') - expect(wrapper.html()).to.contain('h1') + const HTML = + mountingMethod.name === 'renderToString' ? wrapper : wrapper.html() + + expect(HTML).to.contain('span') + expect(HTML).to.contain( + mountingMethod.name === 'renderToString' + ? 'DymaicHello2-stub' + : 'dynamichello2-stub' + ) + expect(HTML).to.contain('h1') }) }) From 0ba1ae6be40b5e8deb07a92d3bcfc0c9c6f8605f Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sun, 25 Nov 2018 09:06:52 +0000 Subject: [PATCH 3/3] test: fix test --- test/specs/mounting-options/stubs.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/specs/mounting-options/stubs.spec.js b/test/specs/mounting-options/stubs.spec.js index 3be9bfa65..7f5a565d6 100644 --- a/test/specs/mounting-options/stubs.spec.js +++ b/test/specs/mounting-options/stubs.spec.js @@ -562,7 +562,7 @@ describeWithMountingMethods('options.stub', mountingMethod => { expect(HTML).to.contain('span') expect(HTML).to.contain( mountingMethod.name === 'renderToString' - ? 'DymaicHello2-stub' + ? 'DynamicHello2-stub' : 'dynamichello2-stub' ) expect(HTML).to.contain('h1')