42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
/**
|
|
* Utility functions for JSON.
|
|
*/
|
|
import { isJSONValue, type JSONObject, type JSONValue } from "../types";
|
|
|
|
/**
|
|
* Parses the given `string` and converts it into a {@link JSONValue}.
|
|
*
|
|
* For the string to be considered valid JSON it has to satisfy the requirements for {@link JSON.parse}.
|
|
*
|
|
* @param str - `string` to parse.
|
|
* @returns The parsed integer JSON value.
|
|
* @throws {@link SyntaxError} - If the given `string` does not represent a valid JSON value.
|
|
*/
|
|
export function parseJSON(str: string): JSONValue {
|
|
const json = JSON.parse(str);
|
|
if (!isJSONValue(json)) {
|
|
throw new Error("Invalid JSON returned. Should never happen.");
|
|
}
|
|
return json;
|
|
}
|
|
|
|
/**
|
|
* Removes `undefined` fields from the given JSON'ish object to make it a valid {@link JSONObject}.
|
|
*
|
|
* Note: This only happens for fields directly belonging to the given object. No recursive cleanup is performed.
|
|
*
|
|
* @param obj - Object to remove `undefined` fields from.
|
|
* @returns Cleaned up JSON object.
|
|
*/
|
|
export function filterUndefinedFromJSON(obj: {
|
|
[key: string]: JSONValue | undefined;
|
|
}): JSONObject {
|
|
const result: JSONObject = {};
|
|
for (const [key, value] of Object.entries(obj)) {
|
|
if (value !== undefined) {
|
|
result[key] = value;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|