UNPKG

safe-access-ts

Version:

Unleash the power of TypeScript to safely access, set, or delete deeply nested object properties. Bid adieu to 'Cannot read property of undefined' errors and embrace a world of defensive and robust code.

69 lines (68 loc) 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.safeDeleteProperty = exports.safeSetProperty = exports.safeGetProperty = void 0; function isObject(value) { return value && typeof value === 'object' && !Array.isArray(value); } function safeGetProperty(obj, path, defaultValue) { var pathArray = Array.isArray(path) ? path : path.split('.').reduce(function (result, pathPart) { var match = pathPart.match(/([^\[]+)|(\[\d+\])/g); // Split on dots and array accessors if (match) { result.push.apply(result, match); } return result; }, []); var value = obj; for (var _i = 0, pathArray_1 = pathArray; _i < pathArray_1.length; _i++) { var key = pathArray_1[_i]; if (isObject(value) || Array.isArray(value)) { // If key is an array accessor, remove brackets and convert to number if (/\[\d+\]/.test(key)) { key = Number(key.replace(/\[|\]/g, '')); } value = value[key]; } else { return defaultValue; } } return value === undefined ? defaultValue : value; } exports.safeGetProperty = safeGetProperty; function safeSetProperty(obj, path, value) { var pathArray = Array.isArray(path) ? path : path.split('.'); var current = obj; for (var i = 0; i < pathArray.length; i++) { var key = pathArray[i]; if (i < pathArray.length - 1) { if (!isObject(current[key]) && !Array.isArray(current[key])) { var nextKey = pathArray[i + 1]; current[key] = isNaN(parseInt(nextKey)) ? {} : []; } current = current[key]; } else { current[key] = value; } } return current; } exports.safeSetProperty = safeSetProperty; function safeDeleteProperty(obj, path) { var pathArray = Array.isArray(path) ? path : path.split('.'); var current = obj; for (var i = 0; i < pathArray.length; i++) { var key = pathArray[i]; if (i < pathArray.length - 1) { if (!isObject(current[key]) && !Array.isArray(current[key])) { return; } current = current[key]; } else { delete current[key]; } } return current; } exports.safeDeleteProperty = safeDeleteProperty;