UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines 10.1 kB
{"version":3,"file":"route-metadata.cjs","sources":["../../../../src/query/compiler/route-metadata.ts"],"sourcesContent":["import { isPlainObject } from '../../utils/type-guards.js'\n\nconst ROUTED_SCALAR_VALUE = Symbol(`tanstack_db_routed_scalar_value`)\nconst ROUTE_METADATA = Symbol(`tanstack_db_route_metadata`)\nexport const INCLUDES_PUBLIC_KEY = Symbol(`includesPublicKey`)\nexport const INCLUDES_ROUTING = Symbol(`includesRouting`)\nconst INTERNAL_ROUTE_KEYS = new Set<PropertyKey>([\n ROUTE_METADATA,\n INCLUDES_PUBLIC_KEY,\n])\nconst INTERNAL_CALLBACK_KEYS = new Set<PropertyKey>([\n ...INTERNAL_ROUTE_KEYS,\n INCLUDES_ROUTING,\n])\n\ntype RoutedResult = {\n [ROUTED_SCALAR_VALUE]: unknown\n [ROUTE_METADATA]: RouteMetadata\n [INCLUDES_PUBLIC_KEY]: unknown\n}\n\ntype PublicContainerProperty = {\n descriptor: PropertyDescriptor\n value?: { original: unknown; replacement: unknown }\n}\n\nexport type RouteMetadata = {\n correlationKey: unknown\n parentContext: unknown\n}\n\nexport type RoutedScalarMetadata = {\n value: unknown\n correlationKey: unknown\n parentContext: unknown\n publicKey: unknown\n}\n\nexport function attachRouteMetadata<T extends object>(\n value: T,\n correlationKey: unknown,\n parentContext: unknown,\n): T {\n return Object.assign(value, {\n [ROUTE_METADATA]: { correlationKey, parentContext } satisfies RouteMetadata,\n })\n}\n\nexport function getRouteMetadata(value: unknown): RouteMetadata | undefined {\n if (\n value == null ||\n typeof value !== `object` ||\n !(ROUTE_METADATA in value)\n ) {\n return undefined\n }\n return (value as { [ROUTE_METADATA]: RouteMetadata })[ROUTE_METADATA]\n}\n\nexport function getNamespacedRouteMetadata(\n row: unknown,\n source: string,\n): RouteMetadata | undefined {\n return (\n getRouteMetadata(row) ??\n (row != null && typeof row === `object`\n ? getRouteMetadata((row as Record<string, unknown>)[source])\n : undefined)\n )\n}\n\nexport function stripRouteMetadata<T extends object>(value: T): T {\n const result = { ...value } as T & Record<PropertyKey, unknown>\n delete result[ROUTE_METADATA]\n return result\n}\n\nexport function attachRouteMetadataToResult(\n value: unknown,\n correlationKey: unknown,\n parentContext: unknown,\n publicKey: unknown,\n): unknown {\n if (\n correlationKey === undefined &&\n parentContext === undefined &&\n publicKey === undefined\n ) {\n return value\n }\n\n if (isPlainObject(value)) {\n return {\n ...value,\n [ROUTE_METADATA]: { correlationKey, parentContext },\n [INCLUDES_PUBLIC_KEY]: publicKey,\n }\n }\n\n return {\n [ROUTED_SCALAR_VALUE]: value,\n [ROUTE_METADATA]: { correlationKey, parentContext },\n [INCLUDES_PUBLIC_KEY]: publicKey,\n } satisfies RoutedResult\n}\n\nexport function getRoutedScalarMetadata(\n value: unknown,\n): RoutedScalarMetadata | undefined {\n if (\n value == null ||\n typeof value !== `object` ||\n !(ROUTED_SCALAR_VALUE in value)\n ) {\n return undefined\n }\n\n const routed = value as RoutedResult\n const route = routed[ROUTE_METADATA]\n return {\n value: routed[ROUTED_SCALAR_VALUE],\n correlationKey: route.correlationKey,\n parentContext: route.parentContext,\n publicKey: routed[INCLUDES_PUBLIC_KEY],\n }\n}\n\n/** Copy public containers while removing private route state at every depth. */\nexport function stripInternalRouteMetadata(value: unknown): unknown {\n return transformPublicContainers(value, (leaf) => leaf, INTERNAL_ROUTE_KEYS)\n}\n\n/** Remove every compiler-owned key before invoking user code. */\nexport function stripInternalCallbackMetadata(value: unknown): unknown {\n return transformPublicContainers(\n value,\n (leaf) => leaf,\n INTERNAL_CALLBACK_KEYS,\n )\n}\n\n/** Copy only paths changed by a leaf transform or an omitted private key. */\nexport function transformPublicContainers(\n value: unknown,\n transformLeaf: (value: unknown) => unknown,\n omittedKeys: ReadonlySet<PropertyKey>,\n): unknown {\n const rootReplacement = transformLeaf(value)\n if (!Object.is(rootReplacement, value)) return rootReplacement\n if (!isPublicContainer(value)) return value\n\n const parents = new WeakMap<object, Set<object>>()\n const properties = new WeakMap<\n object,\n Map<PropertyKey, PublicContainerProperty>\n >()\n const dirty = new Set<object>()\n const visit = (current: object): void => {\n if (properties.has(current)) return\n const currentProperties = new Map<PropertyKey, PublicContainerProperty>()\n properties.set(current, currentProperties)\n for (const key of Reflect.ownKeys(current)) {\n if (omittedKeys.has(key)) {\n dirty.add(current)\n continue\n }\n const descriptor = Object.getOwnPropertyDescriptor(current, key)\n if (!descriptor) continue\n const property: PublicContainerProperty = { descriptor }\n currentProperties.set(key, property)\n if (!descriptor.enumerable || !(`value` in descriptor)) continue\n const child = descriptor.value\n const replacement = transformLeaf(child)\n property.value = { original: child, replacement }\n if (!Object.is(replacement, child)) {\n dirty.add(current)\n continue\n }\n if (!isPublicContainer(child)) continue\n const childParents = parents.get(child) ?? new Set<object>()\n childParents.add(current)\n parents.set(child, childParents)\n visit(child)\n }\n }\n visit(value)\n\n const queue = [...dirty]\n for (const current of queue) {\n for (const parent of parents.get(current) ?? []) {\n if (dirty.has(parent)) continue\n dirty.add(parent)\n queue.push(parent)\n }\n }\n if (!dirty.has(value)) return value\n\n const copies = new WeakMap<object, object>()\n const copy = (current: object): object => {\n if (!dirty.has(current)) return current\n const existing = copies.get(current)\n if (existing) return existing\n\n const result = Array.isArray(current)\n ? []\n : Object.create(Object.getPrototypeOf(current))\n copies.set(current, result)\n for (const [key, property] of properties.get(current) ?? []) {\n const descriptor = { ...property.descriptor }\n if (property.value) {\n const { original, replacement } = property.value\n descriptor.value = !Object.is(replacement, original)\n ? replacement\n : isPublicContainer(original)\n ? copy(original)\n : original\n }\n Object.defineProperty(result, key, descriptor)\n }\n return result\n }\n\n return copy(value)\n}\n\nfunction isPublicContainer(value: unknown): value is object {\n return Array.isArray(value) || isPlainObject(value)\n}\n"],"names":["isPlainObject"],"mappings":"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"}