diff --git a/flow/modules.flow.js b/flow/modules.flow.js index fe37dfd20..4849dd3e0 100644 --- a/flow/modules.flow.js +++ b/flow/modules.flow.js @@ -27,3 +27,11 @@ declare module 'vue-server-renderer' { declare module 'cheerio' { declare module.exports: any; } + +declare module 'html-tags' { + declare module.exports: any; +} + +declare module 'svg-elements' { + declare module.exports: any; +} diff --git a/packages/shared/validators.js b/packages/shared/validators.js index bfecebca4..f4b1565ca 100644 --- a/packages/shared/validators.js +++ b/packages/shared/validators.js @@ -1,4 +1,7 @@ // @flow + +import htmlTags from 'html-tags' +import svgElements from 'svg-elements' import { throwError, capitalize, @@ -18,10 +21,17 @@ export function isDomSelector (selector: any) { } catch (error) { throwError('mount must be run in a browser environment like PhantomJS, jsdom or chrome') } - try { document.querySelector(selector) - return true + + const pseudoSelectors = ['.', '#', '[', ':', '>', ' '] + if (htmlTags.includes(selector) || + svgElements.includes(selector) || + selector.split('').some(char => pseudoSelectors.includes(char))) { + return true + } else { + return false + } } catch (error) { return false } @@ -61,11 +71,15 @@ export function isRefSelector (refOptionsObject: any) { } export function isNameSelector (nameOptionsObject: any) { - if (typeof nameOptionsObject !== 'object' || nameOptionsObject === null) { + if (nameOptionsObject === null) { return false } - - return !!nameOptionsObject.name + if (typeof nameOptionsObject === 'object') { + return !!nameOptionsObject.name + } + if (typeof nameOptionsObject === 'string' && !/[^A-Za-z0-9\-_]/.exec(nameOptionsObject)) { + return !!nameOptionsObject + } } export function templateContainsComponent (template: string, name: string) { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 4c164bc83..6c7289fb9 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -37,6 +37,8 @@ "vue-template-compiler": "^2.x" }, "dependencies": { - "lodash": "^4.17.4" + "html-tags": "^2.0.0", + "lodash": "^4.17.4", + "svg-elements": "^1.0.2" } } diff --git a/packages/test-utils/src/find-vue-components.js b/packages/test-utils/src/find-vue-components.js index 28e73e298..a4be89563 100644 --- a/packages/test-utils/src/find-vue-components.js +++ b/packages/test-utils/src/find-vue-components.js @@ -1,4 +1,5 @@ // @flow + import { FUNCTIONAL_OPTIONS, VUE_VERSION @@ -51,8 +52,11 @@ function findAllFunctionalComponentsFromVnode ( } export function vmCtorMatchesName (vm: Component, name: string): boolean { - return !!((vm.$vnode && vm.$vnode.componentOptions && - vm.$vnode.componentOptions.Ctor.options.name === name) || + if (!name) { + return false + } + return !!((vm.$vnode && vm.$vnode.componentOptions && vm.$vnode.componentOptions.Ctor.options.name === name) || + vm.$vnode.componentOptions.tag === name || (vm._vnode && vm._vnode.functionalOptions && vm._vnode.functionalOptions.name === name) || @@ -102,7 +106,11 @@ export default function findVueComponents ( node[FUNCTIONAL_OPTIONS].name === selector.name ) } - const nameSelector = typeof selector === 'function' ? selector.options.name : selector.name + + const nameSelector = typeof selector === 'function' + ? selector.options.name + : typeof selector === 'object' ? selector.name : selector + const components = root._isVue ? findAllVueComponentsFromVm(root) : findAllVueComponentsFromVnode(root) diff --git a/test/specs/wrapper/find.spec.js b/test/specs/wrapper/find.spec.js index a4c7c281e..94d358c3b 100644 --- a/test/specs/wrapper/find.spec.js +++ b/test/specs/wrapper/find.spec.js @@ -115,6 +115,11 @@ describeWithShallowAndMount('find', (mountingMethod) => { expect(wrapper.find(Component).vnode).to.be.an('object') }) + it('returns Wrapper of Vue Components matching component', () => { + const wrapper = mountingMethod(ComponentWithChild) + expect(wrapper.find('child-component').vnode).to.be.an('object') + }) + itSkipIf( isRunningPhantomJS, 'returns Wrapper of class component', () => { diff --git a/yarn.lock b/yarn.lock index b78e59e32..517912935 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4983,6 +4983,10 @@ html-minifier@^3.2.3: relateurl "0.2.x" uglify-js "3.3.x" +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + htmlparser2@^3.8.2, htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -9004,6 +9008,10 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" +svg-elements@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/svg-elements/-/svg-elements-1.0.2.tgz#0d976a499055e26429c136b4bca07c12fac8c8c3" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"