]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat: asset resolution
authorEvan You <yyx990803@gmail.com>
Mon, 2 Sep 2019 20:43:26 +0000 (16:43 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 2 Sep 2019 20:43:26 +0000 (16:43 -0400)
packages/runtime-core/__tests__/apiCreateApp.spec.ts [new file with mode: 0644]
packages/runtime-core/src/apiCreateApp.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/directives.ts
packages/runtime-core/src/index.ts

diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts
new file mode 100644 (file)
index 0000000..ff5e157
--- /dev/null
@@ -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')
+})
index 14cd6b13b28a1c90fff6dd6c32b35e052ab45f12..b5a64c5557fac00c9244f26ffa0cf3d28c04fce4 100644 (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().`
+    )
+  }
+}
index e42183f824979565b5fad88db5025b2a09b81c72..5249cb09c9964b97f1016b151d7664b28efea0d0 100644 (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)
+}
index e8079a2bdbbfa2e93ed6fc2e4e3e8f76d7472bcf..065f7bbd9b197294d9f98cdeaa9cc6d3fb94c0b4 100644 (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)
+}
index f312a2fe98f1b33aacfe6d3dfc1e6937ba464b8a..cd890c9e261b239dd7e9ec4c77988bb64f45b0ca 100644 (file)
@@ -37,6 +37,7 @@ export {
 } from './errorHandling'
 
 // For the compiler
+export { resolveComponent } from './component'
 export { applyDirectives, resolveDirective } from './directives'
 
 // Types -----------------------------------------------------------------------