@tanstack/db
Version:
A reactive client store for building super fast apps on sync
156 lines (155 loc) • 6.01 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const virtualProps = require("../../virtual-props.cjs");
const typeGuards = require("../../utils/type-guards.cjs");
const equalityValueIdentity = require("../equality-value-identity.cjs");
const ROUTED_SCALAR_VALUE = /* @__PURE__ */ Symbol(`tanstack_db_routed_scalar_value`);
const ROUTE_METADATA = /* @__PURE__ */ Symbol(`tanstack_db_route_metadata`);
const INCLUDES_PUBLIC_KEY = /* @__PURE__ */ Symbol(`includesPublicKey`);
const SOURCE_METADATA = /* @__PURE__ */ Symbol(`sourceMetadata`);
const SOURCE_ROUTING = /* @__PURE__ */ Symbol(`sourceRouting`);
const ROW_METADATA = /* @__PURE__ */ Symbol(`rowMetadata`);
const INCLUDES_ROUTING = /* @__PURE__ */ Symbol(`includesRouting`);
const INTERNAL_ROUTE_KEYS = /* @__PURE__ */ new Set([
ROUTE_METADATA,
INCLUDES_PUBLIC_KEY,
SOURCE_METADATA,
ROW_METADATA,
SOURCE_ROUTING
]);
const INTERNAL_CALLBACK_KEYS = /* @__PURE__ */ new Set([
...INTERNAL_ROUTE_KEYS,
INCLUDES_ROUTING
]);
function attachRouteMetadata(value, correlationKey, parentContext) {
return Object.assign(value, {
[ROUTE_METADATA]: { correlationKey, parentContext }
});
}
function getRouteMetadata(value) {
if (value == null || typeof value !== `object` || !(ROUTE_METADATA in value)) {
return void 0;
}
return value[ROUTE_METADATA];
}
function getNamespacedRouteMetadata(row, source) {
return getRouteMetadata(row) ?? (row != null && typeof row === `object` ? getRouteMetadata(row[source]) : void 0);
}
function attachRouteMetadataToResult(value, correlationKey, parentContext, publicKey) {
if (correlationKey === void 0 && parentContext === void 0 && publicKey === void 0) {
return value;
}
return Object.assign(
typeGuards.isPlainObject(value) ? { ...value } : { [ROUTED_SCALAR_VALUE]: value },
{
[ROUTE_METADATA]: { correlationKey, parentContext },
[INCLUDES_PUBLIC_KEY]: publicKey
}
);
}
function getRoutedScalarMetadata(value) {
if (value == null || typeof value !== `object` || !(ROUTED_SCALAR_VALUE in value)) {
return void 0;
}
const routed = value;
return {
value: routed[ROUTED_SCALAR_VALUE],
...routed[ROUTE_METADATA],
publicKey: routed[INCLUDES_PUBLIC_KEY]
};
}
function wrapInputRow(alias, row, metadata, hasInternalState = true) {
if (!hasInternalState) return { [alias]: row };
const scalar = getRoutedScalarMetadata(row);
const route = scalar ?? getRouteMetadata(row);
const namespaced = {
...equalityValueIdentity.getParentContextValue(route?.parentContext),
[alias]: scalar ? scalar.value : stripInternalCallbackMetadata(row)
};
if (route)
attachRouteMetadata(namespaced, route.correlationKey, route.parentContext);
if (route)
Object.assign(namespaced, {
[INCLUDES_PUBLIC_KEY]: scalar?.publicKey ?? row[INCLUDES_PUBLIC_KEY]
});
if (metadata !== void 0)
Object.assign(namespaced, { [SOURCE_METADATA]: { [alias]: metadata } });
if (row !== null && typeof row === `object` && INCLUDES_ROUTING in row)
Object.assign(namespaced, {
[SOURCE_ROUTING]: {
[alias]: row[INCLUDES_ROUTING]
}
});
return namespaced;
}
function getSourceMetadata(row, alias) {
const metadata = row[SOURCE_METADATA];
if (metadata && Object.hasOwn(metadata, alias)) return metadata[alias];
const source = row[alias];
if (source == null || typeof source !== `object`) return null;
const result = {};
for (const name of virtualProps.VIRTUAL_PROP_NAMES)
if (name in source) result[name] = source[name];
return result;
}
function getSourceRouting(row, alias) {
return row[SOURCE_ROUTING]?.[alias];
}
function mergeSourceContext(target, left, right) {
for (const field of [SOURCE_METADATA, SOURCE_ROUTING])
if (left?.[field] || right?.[field])
target[field] = {
...left?.[field],
...right?.[field]
};
}
function restoreInternalRouteMetadata(target, source) {
for (const key of INTERNAL_ROUTE_KEYS)
if (Object.hasOwn(source, key))
target[key] = source[key];
}
function stripInternalRouteMetadata(value) {
return stripInternalMetadata(value, INTERNAL_ROUTE_KEYS);
}
function stripInternalCallbackMetadata(value) {
return stripInternalMetadata(value, INTERNAL_CALLBACK_KEYS);
}
function stripInternalMetadata(value, keys) {
if (!isPublicContainer(value)) return value;
for (const key of keys)
if (Object.hasOwn(value, key)) {
const properties = Object.getOwnPropertyDescriptors(value);
for (const omitted of keys) delete properties[omitted];
return Object.defineProperties(
createPublicContainerShell(value),
properties
);
}
return value;
}
function createPublicContainerShell(value) {
const prototype = Object.getPrototypeOf(value);
return Array.isArray(value) ? Object.setPrototypeOf([], prototype) : Object.create(prototype);
}
function isPublicContainer(value) {
return Array.isArray(value) || typeGuards.isPlainObject(value);
}
exports.INCLUDES_PUBLIC_KEY = INCLUDES_PUBLIC_KEY;
exports.INCLUDES_ROUTING = INCLUDES_ROUTING;
exports.ROW_METADATA = ROW_METADATA;
exports.SOURCE_METADATA = SOURCE_METADATA;
exports.attachRouteMetadata = attachRouteMetadata;
exports.attachRouteMetadataToResult = attachRouteMetadataToResult;
exports.createPublicContainerShell = createPublicContainerShell;
exports.getNamespacedRouteMetadata = getNamespacedRouteMetadata;
exports.getRouteMetadata = getRouteMetadata;
exports.getRoutedScalarMetadata = getRoutedScalarMetadata;
exports.getSourceMetadata = getSourceMetadata;
exports.getSourceRouting = getSourceRouting;
exports.isPublicContainer = isPublicContainer;
exports.mergeSourceContext = mergeSourceContext;
exports.restoreInternalRouteMetadata = restoreInternalRouteMetadata;
exports.stripInternalCallbackMetadata = stripInternalCallbackMetadata;
exports.stripInternalRouteMetadata = stripInternalRouteMetadata;
exports.wrapInputRow = wrapInputRow;
//# sourceMappingURL=route-metadata.cjs.map