vue3-core/packages/runtime-core/src/compat/customDirective.ts

61 lines
1.5 KiB
TypeScript
Raw Normal View History

2021-04-07 00:17:17 +08:00
import { isArray } from '@vue/shared'
2021-04-10 06:52:14 +08:00
import { ComponentInternalInstance } from '../component'
2021-04-06 23:57:10 +08:00
import { ObjectDirective, DirectiveHook } from '../directives'
import { softAssertCompatEnabled, DeprecationTypes } from './compatConfig'
2021-04-06 23:57:10 +08:00
export interface LegacyDirective {
bind?: DirectiveHook
inserted?: DirectiveHook
update?: DirectiveHook
componentUpdated?: DirectiveHook
unbind?: DirectiveHook
}
const legacyDirectiveHookMap: Partial<
Record<
keyof ObjectDirective,
keyof LegacyDirective | (keyof LegacyDirective)[]
>
> = {
beforeMount: 'bind',
mounted: 'inserted',
updated: ['update', 'componentUpdated'],
unmounted: 'unbind'
}
export function mapCompatDirectiveHook(
name: keyof ObjectDirective,
2021-04-10 06:52:14 +08:00
dir: ObjectDirective & LegacyDirective,
instance: ComponentInternalInstance | null
2021-04-06 23:57:10 +08:00
): DirectiveHook | DirectiveHook[] | undefined {
const mappedName = legacyDirectiveHookMap[name]
if (mappedName) {
if (isArray(mappedName)) {
const hook: DirectiveHook[] = []
2021-04-30 02:45:22 +08:00
mappedName.forEach(mapped => {
const mappedHook = dir[mapped]
2021-04-06 23:57:10 +08:00
if (mappedHook) {
2021-04-10 06:52:14 +08:00
softAssertCompatEnabled(
DeprecationTypes.CUSTOM_DIR,
instance,
2021-04-30 02:45:22 +08:00
mapped,
2021-04-10 06:52:14 +08:00
name
)
2021-04-06 23:57:10 +08:00
hook.push(mappedHook)
}
})
return hook.length ? hook : undefined
} else {
if (dir[mappedName]) {
2021-04-10 06:52:14 +08:00
softAssertCompatEnabled(
DeprecationTypes.CUSTOM_DIR,
instance,
mappedName,
name
)
2021-04-06 23:57:10 +08:00
}
return dir[mappedName]
}
}
}