shelving
Version:
Toolkit for using data in JavaScript.
41 lines (40 loc) • 1.5 kB
JavaScript
import { RequiredError } from "../error/RequiredError.js";
import { isObject, isPlainObject } from "./object.js";
/** Is an unknown value a data object? */
export function isData(value) {
return isPlainObject(value);
}
/** Assert that an unknown value is a data object. */
export function assertData(value, caller = assertData) {
if (!isPlainObject(value))
throw new RequiredError("Must be data object", { received: value, caller });
}
/** Is an unknown value the key for an own prop of a data object. */
export const isDataProp = (data, key) => typeof key === "string" && Object.hasOwn(data, key);
/** Assert that an unknown value is the key for an own prop of a data object. */
export function assertDataProp(data, key, caller = assertDataProp) {
if (!isDataProp(data, key))
throw new RequiredError("Key must exist in data object", { key, data, caller });
}
export function getDataProps(data) {
return Object.entries(data);
}
export function getDataKeys(data) {
return Object.keys(data);
}
export function splitDataPath(path) {
return typeof path === "string" ? path.split(".") : path;
}
export function joinDataPath(path) {
return typeof path === "string" ? path : path.join(".");
}
export function getDataProp(data, path) {
const segments = splitDataPath(path);
let current = data;
for (const segment of segments) {
if (!isObject(current))
return undefined;
current = current[segment];
}
return current;
}