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
JavaScript
;
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;