import type { InjectionKey, UnwrapRef } from 'vue' import { readonly as defineReadonly, inject, provide, reactive } 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('create-context'), options: CreateContextOptions = {}) { const { readonly = true, createProvider = true, 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('use-context'), defaultValue?: any): ShallowUnwrap { return inject(key, defaultValue || {}) }