import { currentInstance } from './component' import { warn } from './warning' export interface InjectionKey extends Symbol {} export function provide(key: InjectionKey | string, value: T) { if (!currentInstance) { if (__DEV__) { warn(`provide() is used without an active component instance.`) } } else { let provides = currentInstance.provides // by default an instance inherits its parent's provides object // but when it needs to provide values of its own, it creates its // own provides object using parent provides object as prototype. // this way in `inject` we can simply look up injections from direct // parent and let the prototype chain do the work. const parentProvides = currentInstance.parent && currentInstance.parent.provides if (parentProvides === provides) { provides = currentInstance.provides = Object.create(parentProvides) } provides[key as any] = value } } export function inject(key: InjectionKey | string): T | undefined export function inject(key: InjectionKey | string, defaultValue: T): T export function inject(key: InjectionKey | string, defaultValue?: any) { if (!currentInstance) { // TODO warn } else { // TODO should also check for app-level provides const provides = currentInstance.parent && currentInstance.provides if (provides && key in provides) { return provides[key as any] as any } else if (defaultValue !== undefined) { return defaultValue } else if (__DEV__) { warn(`injection "${key}" not found.`) } } }