qiwi/deep-proxy

View on GitHub
src/main/ts/interface.ts

Summary

Maintainability
A
0 mins
Test Coverage
export {}

// eslint-disable-next-line
export type TTarget = (object | ((...args: any[]) => any)) & Record<any, any>

export type TProxy<T extends TTarget> = T

export type TTrapName = keyof typeof Reflect

export type TTraps = ProxyHandler<TTarget>

export type THandlerContext<T extends TTarget> = {
  target: T
  name: keyof T,
  val: any,
  receiver: any,
  args: any[],
  descriptor: PropertyDescriptor,
  thisValue: any,
  prototype: any,

  trapName: TTrapName
  traps: TTraps
  root: TTarget
  parameters: any[]
  path: string[]
  value: any
  newValue?: any
  key?: keyof T
  handler: TProxyHandler // eslint-disable-line
  PROXY: TProxyFactory // eslint-disable-line
  DEFAULT: symbol
  proxy: TProxy<T>
}

export type TProxyHandler = <T extends TTarget>(proxyContext: THandlerContext<T>) => any

export type TProxyFactoryThis = {
  handler?: TProxyHandler
  path?: string[]
  root?: TTarget
}

export type TProxyFactory<P extends TTarget = TTarget> = <T extends P>(
  this: TProxyFactoryThis | void,
  target: T,
  handler?: TProxyHandler,
  path?: string[],
  root?: T,
) => TProxy<T>

export type TTrapContext = {
  trapName: TTrapName
  handler: TProxyHandler
  traps: TTraps
  root: TTarget
  path: string[]
}

export type TProxyCache = {
  // root object refers to some targets objects,
  // that refer to map, that binds nested paths with their traps
  traps: WeakMap<TTarget, WeakMap<TTarget, Map<string, TTraps>>>

  // And these traps refer to proxies
  proxies: WeakMap<TTraps, TProxy<TTarget>>
}

export interface DeepProxyConstructor {
  new <T extends TTarget>(
    target: T,
    handler?: TProxyHandler,
    path?: string[],
    root?: TTarget,
  ): TProxy<T>
}