2
0
mirror of https://github.com/tenrok/vue-meta.git synced 2026-06-18 16:10:37 +03:00
Files
vue-meta/src/proxy.ts
T
pimlie 27aaf4744a test: add render tests
fix: webpack dev server

chore: use eslint not prettier

unfeat: remove support for comments (its brokenn in Vue, maybe later)
2020-07-26 00:11:28 +02:00

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
}
}
}