From a173d8cb47b10c3abad105db9d8d89c23d8a2cb0 Mon Sep 17 00:00:00 2001 From: 38elements Date: Sun, 1 Jul 2018 02:10:08 +0900 Subject: [PATCH] refactor(types): improve types --- packages/create-instance/add-mocks.js | 5 ++++- packages/create-instance/add-slots.js | 4 ++-- .../create-functional-component.js | 2 +- .../create-instance/extract-instance-options.js | 6 +++++- packages/create-instance/log-events.js | 4 ++-- packages/create-instance/validate-slots.js | 2 +- packages/shared/compile-template.js | 2 +- packages/shared/util.js | 10 +++++----- packages/shared/validators.js | 15 +++++++++------ packages/test-utils/src/add-scoped-slots.js | 5 ++++- packages/test-utils/src/error-handler.js | 7 ++++++- packages/test-utils/src/find-vue-components.js | 7 +++++-- packages/test-utils/src/order-watchers.js | 8 +++++--- packages/test-utils/src/set-watchers-to-sync.js | 8 +++++--- packages/test-utils/src/warn-if-no-window.js | 4 +++- 15 files changed, 58 insertions(+), 31 deletions(-) diff --git a/packages/create-instance/add-mocks.js b/packages/create-instance/add-mocks.js index 6da38579e..59407944a 100644 --- a/packages/create-instance/add-mocks.js +++ b/packages/create-instance/add-mocks.js @@ -2,7 +2,10 @@ import $$Vue from 'vue' import { warn } from 'shared/util' -export default function addMocks (mockedProperties: Object, Vue: Component) { +export default function addMocks ( + mockedProperties: Object, + Vue: Component +): void { Object.keys(mockedProperties).forEach(key => { try { Vue.prototype[key] = mockedProperties[key] diff --git a/packages/create-instance/add-slots.js b/packages/create-instance/add-slots.js index 8e3a5409e..86f430f82 100644 --- a/packages/create-instance/add-slots.js +++ b/packages/create-instance/add-slots.js @@ -2,8 +2,8 @@ import { compileToFunctions } from 'vue-template-compiler' -function startsWithTag (str) { - return str && str.trim()[0] === '<' +function startsWithTag (str: SlotValue): boolean { + return typeof str === 'string' && str.trim()[0] === '<' } function createVNodesForSlot ( diff --git a/packages/create-instance/create-functional-component.js b/packages/create-instance/create-functional-component.js index eaf843982..ee3feb392 100644 --- a/packages/create-instance/create-functional-component.js +++ b/packages/create-instance/create-functional-component.js @@ -7,7 +7,7 @@ import { createSlotVNodes } from './add-slots' export default function createFunctionalComponent ( component: Component, mountingOptions: Options -) { +): Component { if (mountingOptions.context && typeof mountingOptions.context !== 'object') { throwError('mount.context must be an object') } diff --git a/packages/create-instance/extract-instance-options.js b/packages/create-instance/extract-instance-options.js index f72851ba2..ea6afad72 100644 --- a/packages/create-instance/extract-instance-options.js +++ b/packages/create-instance/extract-instance-options.js @@ -1,3 +1,5 @@ +// @flow + const MOUNTING_OPTIONS = [ 'attachToDocument', 'mocks', @@ -11,7 +13,9 @@ const MOUNTING_OPTIONS = [ 'propsData' ] -export default function extractInstanceOptions (options) { +export default function extractInstanceOptions ( + options: Object +): Object { const instanceOptions = { ...options } MOUNTING_OPTIONS.forEach(mountingOption => { delete instanceOptions[mountingOption] diff --git a/packages/create-instance/log-events.js b/packages/create-instance/log-events.js index 26cb07970..2e71e4bcc 100644 --- a/packages/create-instance/log-events.js +++ b/packages/create-instance/log-events.js @@ -4,7 +4,7 @@ export function logEvents ( vm: Component, emitted: Object, emittedByOrder: Array -) { +): void { const emit = vm.$emit vm.$emit = (name, ...args) => { (emitted[name] || (emitted[name] = [])).push(args) @@ -13,7 +13,7 @@ export function logEvents ( } } -export function addEventLogger (vue: Component) { +export function addEventLogger (vue: Component): void { vue.mixin({ beforeCreate: function () { this.__emitted = Object.create(null) diff --git a/packages/create-instance/validate-slots.js b/packages/create-instance/validate-slots.js index 1bafc2e5c..f4487c8ea 100644 --- a/packages/create-instance/validate-slots.js +++ b/packages/create-instance/validate-slots.js @@ -11,7 +11,7 @@ function isValidSlot (slot: any): boolean { ) } -function requiresTemplateCompiler (slot) { +function requiresTemplateCompiler (slot: any): void { if (typeof slot === 'string' && !compileToFunctions) { throwError( `vueTemplateCompiler is undefined, you must pass ` + diff --git a/packages/shared/compile-template.js b/packages/shared/compile-template.js index f0abdce91..c19078238 100644 --- a/packages/shared/compile-template.js +++ b/packages/shared/compile-template.js @@ -2,7 +2,7 @@ import { compileToFunctions } from 'vue-template-compiler' -export function compileTemplate (component: Component) { +export function compileTemplate (component: Component): void { if (component.template) { Object.assign(component, compileToFunctions(component.template)) } diff --git a/packages/shared/util.js b/packages/shared/util.js index be9858964..1b78c8506 100644 --- a/packages/shared/util.js +++ b/packages/shared/util.js @@ -1,16 +1,16 @@ // @flow import Vue from 'vue' -export function throwError (msg: string) { +export function throwError (msg: string): void { throw new Error(`[vue-test-utils]: ${msg}`) } -export function warn (msg: string) { +export function warn (msg: string): void { console.error(`[vue-test-utils]: ${msg}`) } const camelizeRE = /-(\w)/g -export const camelize = (str: string) => { +export const camelize = (str: string): string => { const camelizedStr = str.replace( camelizeRE, (_, c) => (c ? c.toUpperCase() : '') @@ -21,14 +21,14 @@ export const camelize = (str: string) => { /** * Capitalize a string. */ -export const capitalize = (str: string) => +export const capitalize = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1) /** * Hyphenate a camelCase string. */ const hyphenateRE = /\B([A-Z])/g -export const hyphenate = (str: string) => +export const hyphenate = (str: string): string => str.replace(hyphenateRE, '-$1').toLowerCase() export const vueVersion = Number( diff --git a/packages/shared/validators.js b/packages/shared/validators.js index 1d0ed05a9..2ba725dec 100644 --- a/packages/shared/validators.js +++ b/packages/shared/validators.js @@ -1,7 +1,7 @@ // @flow import { throwError, capitalize, camelize, hyphenate } from './util' -export function isDomSelector (selector: any) { +export function isDomSelector (selector: any): boolean { if (typeof selector !== 'string') { return false } @@ -28,7 +28,7 @@ export function isDomSelector (selector: any) { } } -export function isVueComponent (component: any) { +export function isVueComponent (component: any): boolean { if (typeof component === 'function' && component.options) { return true } @@ -44,7 +44,7 @@ export function isVueComponent (component: any) { return typeof component.render === 'function' } -export function componentNeedsCompiling (component: Component) { +export function componentNeedsCompiling (component: Component): boolean { return ( component && !component.render && @@ -53,7 +53,7 @@ export function componentNeedsCompiling (component: Component) { ) } -export function isRefSelector (refOptionsObject: any) { +export function isRefSelector (refOptionsObject: any): boolean { if ( typeof refOptionsObject !== 'object' || Object.keys(refOptionsObject || {}).length !== 1 @@ -64,7 +64,7 @@ export function isRefSelector (refOptionsObject: any) { return typeof refOptionsObject.ref === 'string' } -export function isNameSelector (nameOptionsObject: any) { +export function isNameSelector (nameOptionsObject: any): boolean { if (typeof nameOptionsObject !== 'object' || nameOptionsObject === null) { return false } @@ -72,7 +72,10 @@ export function isNameSelector (nameOptionsObject: any) { return !!nameOptionsObject.name } -export function templateContainsComponent (template: string, name: string) { +export function templateContainsComponent ( + template: string, + name: string +): boolean { return [capitalize, camelize, hyphenate].some(format => { const re = new RegExp(`<${format(name)}\\s*(\\s|>|(\/>))`, 'g') return re.test(template) diff --git a/packages/test-utils/src/add-scoped-slots.js b/packages/test-utils/src/add-scoped-slots.js index b99cf93aa..2793371a7 100644 --- a/packages/test-utils/src/add-scoped-slots.js +++ b/packages/test-utils/src/add-scoped-slots.js @@ -32,7 +32,10 @@ function getVueTemplateCompilerHelpers (proxy: Object): Object { return helpers } -export function addScopedSlots (vm: Component, scopedSlots: any) { +export function addScopedSlots ( + vm: Component, + scopedSlots: { [name: string]: string } +): void { if (window.navigator.userAgent.match(/PhantomJS/i)) { throwError( `the scopedSlots option does not support PhantomJS. ` + diff --git a/packages/test-utils/src/error-handler.js b/packages/test-utils/src/error-handler.js index 142a3ce77..0706fb2ef 100644 --- a/packages/test-utils/src/error-handler.js +++ b/packages/test-utils/src/error-handler.js @@ -1,4 +1,9 @@ -export default function errorHandler (errorOrString, vm) { +// @flow + +export default function errorHandler ( + errorOrString: any, + vm: Component +): void { const error = typeof errorOrString === 'object' ? errorOrString diff --git a/packages/test-utils/src/find-vue-components.js b/packages/test-utils/src/find-vue-components.js index d04013500..ff6b5d8f7 100644 --- a/packages/test-utils/src/find-vue-components.js +++ b/packages/test-utils/src/find-vue-components.js @@ -56,7 +56,10 @@ export function vmCtorMatchesName (vm: Component, name: string): boolean { )) } -export function vmCtorMatchesSelector (component: Component, selector: Object) { +export function vmCtorMatchesSelector ( + component: Component, + selector: Object +): boolean { const Ctor = selector._Ctor || (selector.options && selector.options._Ctor) if (!Ctor) { return false @@ -70,7 +73,7 @@ export function vmCtorMatchesSelector (component: Component, selector: Object) { export function vmFunctionalCtorMatchesSelector ( component: VNode, Ctor: Object -) { +): boolean { if (VUE_VERSION < 2.3) { throwError( `find for functional components is not support in ` + `Vue < 2.3` diff --git a/packages/test-utils/src/order-watchers.js b/packages/test-utils/src/order-watchers.js index ddc690f3b..c1dc6558b 100644 --- a/packages/test-utils/src/order-watchers.js +++ b/packages/test-utils/src/order-watchers.js @@ -1,6 +1,8 @@ +// @flow + let i = 0 -function orderDeps (watcher) { +function orderDeps (watcher): void { watcher.deps.forEach(dep => { if (dep._sortedId === i) { return @@ -11,7 +13,7 @@ function orderDeps (watcher) { }) } -function orderVmWatchers (vm) { +function orderVmWatchers (vm: Component): void { if (vm._watchers) { vm._watchers.forEach(orderDeps) } @@ -27,7 +29,7 @@ function orderVmWatchers (vm) { vm.$children.forEach(orderVmWatchers) } -export function orderWatchers (vm) { +export function orderWatchers (vm: Component): void { orderVmWatchers(vm) i++ } diff --git a/packages/test-utils/src/set-watchers-to-sync.js b/packages/test-utils/src/set-watchers-to-sync.js index d5a06f44a..e59d62133 100644 --- a/packages/test-utils/src/set-watchers-to-sync.js +++ b/packages/test-utils/src/set-watchers-to-sync.js @@ -1,10 +1,12 @@ +// @flow + import { VUE_VERSION } from './consts' -function setDepsSync (dep) { +function setDepsSync (dep): void { dep.subs.forEach(setWatcherSync) } -function setWatcherSync (watcher) { +function setWatcherSync (watcher): void { if (watcher.sync === true) { return } @@ -12,7 +14,7 @@ function setWatcherSync (watcher) { watcher.deps.forEach(setDepsSync) } -export function setWatchersToSync (vm) { +export function setWatchersToSync (vm: Component): void { if (vm._watchers) { vm._watchers.forEach(setWatcherSync) } diff --git a/packages/test-utils/src/warn-if-no-window.js b/packages/test-utils/src/warn-if-no-window.js index 1913fd9d8..d325b4601 100644 --- a/packages/test-utils/src/warn-if-no-window.js +++ b/packages/test-utils/src/warn-if-no-window.js @@ -1,6 +1,8 @@ +// @flow + import { throwError } from 'shared/util' -export default function warnIfNoWindow () { +export default function warnIfNoWindow (): void { if (typeof window === 'undefined') { throwError( `window is undefined, vue-test-utils needs to be ` +