diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts new file mode 100644 index 00000000..ff5e1576 --- /dev/null +++ b/packages/runtime-core/__tests__/apiCreateApp.spec.ts @@ -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') +}) diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 14cd6b13..b5a64c55 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -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 - keyCodes: Record - 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().` + ) + } +} diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index e42183f8..5249cb09 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -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) +} diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index e8079a2b..065f7bbd 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -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) +} diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index f312a2fe..cd890c9e 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -37,6 +37,7 @@ export { } from './errorHandling' // For the compiler +export { resolveComponent } from './component' export { applyDirectives, resolveDirective } from './directives' // Types -----------------------------------------------------------------------