import { Affine } from "../util" const pathValue = Symbol("pathValue") export type PathValue = typeof pathValue export type PathBuilderStored = { [K in PathValue]: [AllStore, Store] } export type PathBuilder = (Store extends Record< string, unknown > ? { [K in keyof Store]: PathBuilder } : {}) & PathBuilderStored export type StorePath = string & Affine<"StorePath"> const privateSymbol = Symbol("jsonPath") export const extractJsonPath = (builder: PathBuilder) => { return (builder as any)[privateSymbol] as StorePath } export const pathBuilder = ( paths: string[] = [], ): PathBuilder => { return new Proxy({} as PathBuilder, { get(target, prop) { if (prop === privateSymbol) { if (paths.length === 0) return "" return `/${paths.join("/")}` } return pathBuilder([...paths, prop as string]) }, }) as PathBuilder }