import { InjectionKey, provide, inject, reactive, readonly as defineReadonly, UnwrapRef } from 'vue' export interface CreateContextOptions { readonly?: boolean createProvider?: boolean native?: boolean } type ShallowUnwrap = { [P in keyof T]: UnwrapRef } export function createContext(context: any, key: InjectionKey = Symbol(), options: CreateContextOptions = {}) { const { readonly = true, createProvider = false, native = false } = options const state = reactive(context) const provideData = readonly ? defineReadonly(state) : state !createProvider && provide(key, native ? context : provideData) return { state } } export function useContext(key: InjectionKey, native?: boolean): T export function useContext(key: InjectionKey = Symbol(), defaultValue?: any): ShallowUnwrap { return inject(key, defaultValue || {}) }