57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.assignFactory = assignFactory;
|
||
|
var _errorTransform = require("../../transform/utils/errorTransform.js");
|
||
|
var _customs = require("../../../utils/customs.js");
|
||
|
function assignFactory(_ref) {
|
||
|
let {
|
||
|
subset,
|
||
|
matrix
|
||
|
} = _ref;
|
||
|
/**
|
||
|
* Replace part of an object:
|
||
|
*
|
||
|
* - Assign a property to an object
|
||
|
* - Replace a part of a string
|
||
|
* - Replace a matrix subset
|
||
|
*
|
||
|
* @param {Object | Array | Matrix | string} object
|
||
|
* @param {Index} index
|
||
|
* @param {*} value
|
||
|
* @return {Object | Array | Matrix | string} Returns the original object
|
||
|
* except in case of a string
|
||
|
*/
|
||
|
// TODO: change assign to return the value instead of the object
|
||
|
return function assign(object, index, value) {
|
||
|
try {
|
||
|
if (Array.isArray(object)) {
|
||
|
const result = matrix(object).subset(index, value).valueOf();
|
||
|
|
||
|
// shallow copy all (updated) items into the original array
|
||
|
result.forEach((item, index) => {
|
||
|
object[index] = item;
|
||
|
});
|
||
|
return object;
|
||
|
} else if (object && typeof object.subset === 'function') {
|
||
|
// Matrix
|
||
|
return object.subset(index, value);
|
||
|
} else if (typeof object === 'string') {
|
||
|
// TODO: move setStringSubset into a separate util file, use that
|
||
|
return subset(object, index, value);
|
||
|
} else if (typeof object === 'object') {
|
||
|
if (!index.isObjectProperty()) {
|
||
|
throw TypeError('Cannot apply a numeric index as object property');
|
||
|
}
|
||
|
(0, _customs.setSafeProperty)(object, index.getObjectProperty(), value);
|
||
|
return object;
|
||
|
} else {
|
||
|
throw new TypeError('Cannot apply index: unsupported type of object');
|
||
|
}
|
||
|
} catch (err) {
|
||
|
throw (0, _errorTransform.errorTransform)(err);
|
||
|
}
|
||
|
};
|
||
|
}
|