mirror of
https://github.com/tenrok/vue-meta.git
synced 2026-06-18 16:10:37 +03:00
27aaf4744a
fix: webpack dev server chore: use eslint not prettier unfeat: remove support for comments (its brokenn in Vue, maybe later)
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { markRaw } from 'vue'
|
|
import { isObject } from '@vue/shared'
|
|
import { update } from './info/update'
|
|
import { MetaContext, MetainfoInput, PathSegments } from './types'
|
|
|
|
interface Target extends MetainfoInput {
|
|
__vm_proxy?: any // eslint-disable-line camelcase
|
|
}
|
|
|
|
export function createProxy (
|
|
target: Target,
|
|
handler: ProxyHandler<object>
|
|
): Target {
|
|
return markRaw(new Proxy(target, handler))
|
|
}
|
|
|
|
export function createHandler (
|
|
context: MetaContext,
|
|
pathSegments: PathSegments = []
|
|
): ProxyHandler<object> {
|
|
return {
|
|
get (target: object, key: string, receiver: object) {
|
|
const value = Reflect.get(target, key, receiver)
|
|
|
|
if (!isObject(value)) {
|
|
return value
|
|
}
|
|
|
|
if (!value.__vm_proxy) {
|
|
const keyPath: PathSegments = [...pathSegments, key]
|
|
|
|
const handler = /* #__PURE__ */ createHandler(context, keyPath)
|
|
value.__vm_proxy = createProxy(value, handler)
|
|
}
|
|
|
|
return value.__vm_proxy
|
|
},
|
|
set (
|
|
target: object, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
key: string,
|
|
value: unknown
|
|
): boolean {
|
|
update(context, pathSegments, key, value)
|
|
return true
|
|
}
|
|
}
|
|
}
|