feat: asset resolution

This commit is contained in:
Evan You 2019-09-02 16:43:26 -04:00
parent 67fd5b6091
commit 015d5dd0f1
5 changed files with 61 additions and 21 deletions

View File

@ -0,0 +1,19 @@
describe('api: createApp', () => {
test('mount', () => {})
test('provide', () => {})
test('component', () => {})
test('directive', () => {})
test('use', () => {})
test.todo('mixin')
test('config.errorHandler', () => {})
test('config.warnHandler', () => {})
test.todo('config.optionsMergeStrategies')
})

View File

@ -3,12 +3,14 @@ import {
Component,
ComponentRenderProxy,
Data,
ComponentInstance
ComponentInstance,
currentRenderingInstance,
currentInstance
} from './component'
import { Directive } from './directives'
import { HostNode, RootRenderFunction } from './createRenderer'
import { InjectionKey } from './apiInject'
import { isFunction } from '@vue/shared'
import { isFunction, camelize, capitalize } from '@vue/shared'
import { warn } from './warning'
import { createVNode } from './vnode'
@ -42,15 +44,6 @@ export interface AppConfig {
instance: ComponentRenderProxy,
trace: string
) => void
ignoredElements: Array<string | RegExp>
keyCodes: Record<string, number | number[]>
optionMergeStrategies: {
[key: string]: (
parent: any,
child: any,
instance: ComponentRenderProxy
) => any
}
}
export interface AppContext {
@ -76,10 +69,7 @@ export function createAppContext(): AppContext {
devtools: true,
performance: false,
errorHandler: undefined,
warnHandler: undefined,
ignoredElements: [],
keyCodes: {},
optionMergeStrategies: {}
warnHandler: undefined
},
mixins: [],
components: {},
@ -168,3 +158,29 @@ export function createAppAPI(render: RootRenderFunction): () => App {
return app
}
}
export function resolveAsset(type: 'components' | 'directives', name: string) {
const instance = currentRenderingInstance || currentInstance
if (instance) {
let camelized
let capitalized
const local = (instance.type as any)[type]
const global = instance.appContext[type]
const res =
local[name] ||
local[(camelized = camelize(name))] ||
local[(capitalized = capitalize(name))] ||
global[name] ||
global[camelized] ||
global[capitalized]
if (__DEV__ && !res) {
warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`)
}
return res
} else if (__DEV__) {
warn(
`resolve${capitalize(type.slice(0, -1))} ` +
`can only be used in render() or setup().`
)
}
}

View File

@ -13,7 +13,7 @@ import {
callWithErrorHandling,
callWithAsyncErrorHandling
} from './errorHandling'
import { AppContext, createAppContext } from './apiCreateApp'
import { AppContext, createAppContext, resolveAsset } from './apiCreateApp'
export type Data = { [key: string]: unknown }
@ -472,3 +472,7 @@ function hasPropsChanged(prevProps: Data, nextProps: Data): boolean {
}
return false
}
export function resolveComponent(name: string): Component | undefined {
return resolveAsset('components', name)
}

View File

@ -22,6 +22,7 @@ import {
} from './component'
import { callWithAsyncErrorHandling, ErrorTypes } from './errorHandling'
import { HostNode } from './createRenderer'
import { resolveAsset } from './apiCreateApp'
export interface DirectiveBinding {
instance: ComponentRenderProxy | null
@ -119,11 +120,6 @@ export function applyDirectives(
return vnode
}
export function resolveDirective(name: string): Directive {
// TODO
return {} as any
}
export function invokeDirectiveHook(
hook: Function | Function[],
instance: ComponentInstance | null,
@ -144,3 +140,7 @@ export function invokeDirectiveHook(
callWithAsyncErrorHandling(hook, instance, ErrorTypes.DIRECTIVE_HOOK, args)
}
}
export function resolveDirective(name: string): Directive | undefined {
return resolveAsset('directives', name)
}

View File

@ -37,6 +37,7 @@ export {
} from './errorHandling'
// For the compiler
export { resolveComponent } from './component'
export { applyDirectives, resolveDirective } from './directives'
// Types -----------------------------------------------------------------------