mirror of
https://github.com/tenrok/axios.git
synced 2026-06-23 20:40:40 +03:00
Added toJSONObject util; (#5247)
Fixed AxiosError.toJSON method to avoid circular references; Co-authored-by: Jay <jasonsaayman@gmail.com>
This commit is contained in:
@@ -45,7 +45,7 @@ utils.inherits(AxiosError, Error, {
|
|||||||
columnNumber: this.columnNumber,
|
columnNumber: this.columnNumber,
|
||||||
stack: this.stack,
|
stack: this.stack,
|
||||||
// Axios
|
// Axios
|
||||||
config: this.config,
|
config: utils.toJSONObject(this.config),
|
||||||
code: this.code,
|
code: this.code,
|
||||||
status: this.response && this.response.status ? this.response.status : null
|
status: this.response && this.response.status ? this.response.status : null
|
||||||
};
|
};
|
||||||
|
|||||||
+33
-1
@@ -592,6 +592,37 @@ const toFiniteNumber = (value, defaultValue) => {
|
|||||||
return Number.isFinite(value) ? value : defaultValue;
|
return Number.isFinite(value) ? value : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const toJSONObject = (obj) => {
|
||||||
|
const stack = new Array(10);
|
||||||
|
|
||||||
|
const visit = (source, i) => {
|
||||||
|
|
||||||
|
if (isObject(source)) {
|
||||||
|
if (stack.indexOf(source) >= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!('toJSON' in source)) {
|
||||||
|
stack[i] = source;
|
||||||
|
const target = isArray(source) ? [] : {};
|
||||||
|
|
||||||
|
forEach(source, (value, key) => {
|
||||||
|
const reducedValue = visit(value, i + 1);
|
||||||
|
!isUndefined(reducedValue) && (target[key] = reducedValue);
|
||||||
|
});
|
||||||
|
|
||||||
|
stack[i] = undefined;
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
return visit(obj, 0);
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
isArray,
|
isArray,
|
||||||
isArrayBuffer,
|
isArrayBuffer,
|
||||||
@@ -637,5 +668,6 @@ export default {
|
|||||||
toFiniteNumber,
|
toFiniteNumber,
|
||||||
findKey,
|
findKey,
|
||||||
global: _global,
|
global: _global,
|
||||||
isContextDefined
|
isContextDefined,
|
||||||
|
toJSONObject
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,4 +23,30 @@ describe('utils', function (){
|
|||||||
assert.equal(utils.isFormData(new FormData()), true);
|
assert.equal(utils.isFormData(new FormData()), true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('toJSON', function (){
|
||||||
|
it('should convert to a plain object without circular references', function () {
|
||||||
|
const obj= {a: [0]}
|
||||||
|
const source = {x:1, y:2, obj};
|
||||||
|
source.circular1 = source;
|
||||||
|
obj.a[1] = obj;
|
||||||
|
|
||||||
|
assert.deepStrictEqual(utils.toJSONObject(source), {
|
||||||
|
x: 1, y:2, obj: {a: [0]}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should use objects with defined toJSON method without rebuilding', function () {
|
||||||
|
const objProp = {};
|
||||||
|
const obj= {objProp, toJSON(){
|
||||||
|
return {ok: 1}
|
||||||
|
}};
|
||||||
|
const source = {x:1, y:2, obj};
|
||||||
|
|
||||||
|
const jsonObject = utils.toJSONObject(source);
|
||||||
|
|
||||||
|
assert.strictEqual(jsonObject.obj.objProp, objProp);
|
||||||
|
assert.strictEqual(JSON.stringify(jsonObject), JSON.stringify({x: 1, y:2, obj: {ok: 1}}))
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user